commit 0e7d4ae57ad36e4adbeebfdee45897565bbb363d Author: root Date: Sat Feb 8 03:18:24 2025 +0000 a diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..dbe3d7c --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +.DS_Store +Thumbs.db +db.json +*.log +node_modules/ +public/ +.deploy*/ +_multiconfig.yml \ No newline at end of file diff --git a/_config.landscape.yml b/_config.landscape.yml new file mode 100755 index 0000000..e69de29 diff --git a/_config.volantis.yml b/_config.volantis.yml new file mode 100755 index 0000000..e23da95 --- /dev/null +++ b/_config.volantis.yml @@ -0,0 +1,1419 @@ + +# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +# 这里是 6.0.0-alpha 分支 +# Breaking Change 会放到这个分支 +# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +Plugins: + ... +############################### Volantis ############################### +info: + theme_name: Volantis. # This is theme's name. + theme_docs: https://volantis.js.org/ # This is theme's URL. + theme_repo: https://github.com/volantis-x/hexo-theme-volantis +# Debug 调试模式 +debug: false # false: 关闭调试模式, env:环境配置检查, rightMenus: 调试右键, cdn: 调试 CDN System +############################### 默认占位图 ############################### +default: + avatar: volantis-static/media/placeholder/avatar/round/3442075.svg # https://cdn.jsdelivr.net/gh/cdn-x/placeholder@1.0.1/avatar/round/3442075.svg + link: volantis-static/media/placeholder/link/8f277b4ee0ecd.svg # https://cdn.jsdelivr.net/gh/cdn-x/placeholder@1.0.1/link/8f277b4ee0ecd.svg + cover: volantis-static/media/placeholder/cover/76b86c0226ffd.svg # https://cdn.jsdelivr.net/gh/cdn-x/placeholder@1.0.1/cover/76b86c0226ffd.svg + image: volantis-static/media/placeholder/image/2659360.svg # https://cdn.jsdelivr.net/gh/cdn-x/placeholder@1.0.1/image/2659360.svg + + +############################### CDN System ############################### + +cdn_system: + # CDN 优先级 从高到低排序 写入 priority 列表即表示启用(enable) + priority: [custom, local, cdnjs, npm, static] + # ======================================================================== + # cdn数据配置文件见 "theme/_cdn.yml", 可以在 source/_data/cdn.yml 覆盖 theme/_cdn.yml + # 变量说明: + # 以下变量只能在 `prefix` 中使用。 + # ${site_root} 站点根目录 一般是 "/" + # 以下变量只能在 `format` 中使用。 + # ${prefix} CDN 链接前缀 + # ${name} package 名称 见 "theme/_cdn.yml" + # ${version} package 版本 见 "theme/_cdn.yml" + # ${file} 文件路径 见 "theme/_cdn.yml" + # ${min_file} 文件路径 ${file} 后添加 .min. (jsdelivr、cdnjs 官方自带压缩) + # ${timestamp} Hexo运行时的时间戳(eg:1661246702300), 可用于静态资源版本控制 format: ${prefix}${file}?v=${timestamp} + system_config: + # 自定义配置 使用 "theme/_cdn.yml" 中的名称作为配置项的键 + custom: + busuanzi: https://npm.elemecdn.com/penndu@1.0.0/bsz.js # 杜老师友情赞助 + artalk_js: https://pl.yhehe.com/dist/Artalk.js + artalk_css: https://pl.yhehe.com/dist/Artalk.css + #volantis_style: /css/style.css + #volantis_app: /js/app.js + + # 主题 /js与/css目录 (一般放在本地,可以在此处配置站点CDN),"theme/_cdn.yml" 中以 "volantis_" 开头的名称 + # Tip: 在本配置文件中 匹配以 "volantis-local" 开头的链接路径替换为该格式的前缀开头 prefix + local: + # CDN 链接前缀 + prefix: ${site_root} + # local CDN 格式 + format: ${prefix}${file} + # npm + # https://www.npmjs.com/ + # Tip: 在本配置文件中 匹配以 "volantis-npm" 开头的链接路径替换为该格式的前缀开头 prefix + npm: + # CDN 链接前缀 + prefix: https://unpkg.com + # npm CDN 格式 + format: ${prefix}/${name}@${version}/${file} + # volantis static 静态资源文件 npm 包 CDN 地址 + # https://github.com/volantis-x/volantis-static + # Tip: 在本配置文件中 匹配以 "volantis-static" 开头的链接路径替换为该格式的前缀开头 prefix + static: + # CDN 链接前缀 + prefix: https://unpkg.com/volantis-static@0.0.1660614606622 + # volantis-static CDN 格式 + format: ${prefix}/libs/${name}/${file} + # cdnjs + # https://cdnjs.com/ + # Tip: 在本配置文件中 匹配以 "volantis-cdnjs" 开头的链接路径替换为该格式的前缀开头 prefix + cdnjs: + # CDN 链接前缀 + prefix: https://cdn.bootcdn.net/ajax/libs + # cdnjs CDN 格式 + format: ${prefix}/${name}/${version}/${min_file} + # ======================================================================== + + + + + + +############################### CSP ############################### +# 内容安全策略( CSP ) meta 标签 http-equiv="Content-Security-Policy" +# https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP +# https://content-security-policy.com/ +# 也可以设为 false 在 HTTP 标头中设置 https://volantis.js.org/v5/advanced-settings/#设置-HTTP-响应标头 +csp: + enable: false + content: " + default-src 'self' https:; + block-all-mixed-content; + base-uri 'self' https:; + form-action 'self' https:; + worker-src 'self' https:; + connect-src 'self' https: *; + img-src 'self' data: https: *; + media-src 'self' https: *; + font-src 'self' data: https: *; + frame-src 'self' https: *; + manifest-src 'self' https: *; + child-src https:; + script-src 'self' https: 'unsafe-inline' *; + style-src 'self' https: 'unsafe-inline' *; + " + # 可以使用自动程序替换默认的 'unsafe-inline' 和 * 生成更严格的内容安全策略. + # 另可以参考官网之前的 gulp 方案.(CSP Level 3 :Safari 15.4+ Chrome 59+ Firefox 58+ Edge 79+) + # gulpfile.js https://gist.github.com/MHuiG/e50ce64fd94f641f679a0736fef925e4 + +######################################################################## +# https://web.dev/content-visibility/ +# https://www.caniuse.com/?search=content-visibility +content_visibility: false + +# 全局页面字符串替换 A => B (可用于临时修改错字等) +replace: + - https://cdn.jsdelivr.net/npm/ => https://unpkg.com/ + - https://cdn.jsdelivr.net/gh/ => https://gcore.jsdelivr.net/gh/ + - https://cdn.bootcdn.net/ => https://cdnjs.onmicrosoft.cn/ + - https://unpkg.com/ => https://npm.onmicrosoft.cn/ + - https://gcore.jsdelivr.net/gh/ => https://jsd.onmicrosoft.cn/gh/ + + +# dns-prefetch preconnect x-dns-prefetch-control +dns_prefetch: + - https://unpkg.com + - https://cdn.bootcdn.net + +# 平滑滚动效果 +scroll_smooth: true +############################### Navigation Bar ############################### > start +# 注意事项:建议规范全站路径 URL 最后带一个 "/" 例如 "about/" +navbar: + visiable: auto # always, auto + logo: # choose [img] or [icon + title] + img: https://photo.yhehe.com/tp/wk.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/Logo-NavBar@3x.png + icon: + title: + menu: + - name: 首页 + icon: fa-solid fa-house + url: / + - name: 分类 + icon: fa-solid fa-folder-open + url: categories/ + rows: + - name: 记录生活 + icon: fa-solid fa-book-open + url: categories/记录生活/ + - name: 学习笔记 + icon: fa-solid fa-book-open + url: categories/学习笔记/ + - name: 归档 + icon: fa-solid fa-archive + url: archives/ + - name: 说说 + icon: fa-solid fa-comment fa-fw + url: ss/ + - name: 更多 + icon: fa-solid fa-info-circle + rows: + - name: 暗黑模式 + icon: fa-solid fa-moon + toggle: darkmode + - name: hr + - name: 关于 + icon: fa-solid fa-info-circle + url: about/ + - name: 友链 + icon: fa-solid fa-link + url: friends/ + - name: 标签 + icon: fa-solid fa-tags + url: tags/ + - name: 相册 + icon: fa-solid fa-image + url: https://photo.yhehe.com/ + + search: 输入关键字后「回车」搜索💚 # Search bar placeholder +############################### Navigation Bar ############################### > end + + +############################### Cover ############################### > start +cover: + height_scheme: half # full, half + layout_scheme: blank # blank (留白), search (搜索), dock (坞), featured (精选), focus (焦点) + display: + home: false + archive: false + others: false # can be written in front-matter 'cover: true' + background: https://photo.yhehe.com/tp/logo.jpg + # background: https://bing.ioliu.cn/v1/rand?w=1920&h=1200 + logo: # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/Logo-Cover@3x.png + title: 'Hehe Blog.' + subtitle: 'Please don t worry about the bad past, believe me every day is a good start...' + search: A Wonderful Theme for Hexo # search bar placeholder + features: + - name: 首页 + icon: # + img: volantis-static/media/twemoji/assets/svg/1f5c3.svg # https://cdn.jsdelivr.net/gh/twitter/twemoji@13.0/assets/svg/1f5c3.svg + url: https://blog.yhehe.com/ + - name: 归档 + icon: # + img: volantis-static/media/twemoji/assets/svg/1f4f0.svg # https://cdn.jsdelivr.net/gh/twitter/twemoji@13.0/assets/svg/1f4f0.svg + url: /archives/ + - name: 相册 + icon: # + img: volantis-static/media/twemoji/assets/svg/1f516.svg # https://cdn.jsdelivr.net/gh/twitter/twemoji@13.0/assets/svg/1f516.svg + url: https://photo.yhehe.com/ + - name: 店铺 + icon: # + img: volantis-static/media/twemoji/assets/svg/1f396.svg # https://cdn.jsdelivr.net/gh/twitter/twemoji@13.0/assets/svg/1f396.svg + url: https://ylx8.vip/ + #- name: 社区 + # icon: # + # img: volantis-static/media/twemoji/assets/svg/1f389.svg # https://cdn.jsdelivr.net/gh/twitter/twemoji@13.0/assets/svg/1f389.svg + # url: /contributors/ + - name: 友链 + icon: # + img: volantis-static/media/twemoji/assets/svg/1f9ec.svg # https://cdn.jsdelivr.net/gh/twitter/twemoji@13.0/assets/svg/1f9ec.svg + url: friends/ +############################### Cover ############################### > end + +pages: + # 友链页面配置 + friends: + layout_scheme: traditional # simple: 简单布局, traditional: 传统布局 + +############################### Article Layout ############################### > start +# 文章布局 +article: + # 文章列表页面的文章卡片布局方案 + preview: + scheme: landscape # landscape + # pin icon for post + pin_icon: /images/tuding.svg # https://cdn.jsdelivr.net/gh/twitter/twemoji@13.0/assets/svg/1f4cc.svg + # auto generate title if not exist + auto_title: true # false, true + # auto generate excerpt if not exist + auto_excerpt: true # false, true + # hide excerpt + hide_excerpt: false + # show split line or not + line_style: solid # hidden, solid, dashed, dotted + # show author + author: false # true, false + # show readmore button + readmore: auto # auto, always + # 文章详情页面的文章卡片本体布局方案 + body: + # 文章顶部信息 + # 从 meta_library 中取 + top_meta: [author, category, date, counter] #启用评论数量需在此添加 + # 文章底部信息 + # 从 meta_library 中取 + bottom_meta: [updated, tags, share] + # ---------------- + # 文章页脚组件 + footer_widget: + # ---------------- + # 参考资料、相关资料等 (for layout: post/docs) + references: + title: 参考资料 + icon: fa-solid fa-quote-left + # 在 front-matter 中: + # references: + # - title: 某篇文章 + # url: https:// + # 即可显示此组件。 + # ---------------- + # 文章推荐 (for layout: post/docs) + # 推荐算法需要依赖中文分词工具,nodejieba只支持中英文 npm i nodejieba -S + recommended_article: + enable: false + layout: ["post", "docs"] + title: 推荐阅读 + icon: fa-solid fa-bookmark + max_count: 6 + placeholder_img: https://gcore.jsdelivr.net/gh/MHG-LAB/cron@gh-pages/bing/bing.jpg + # 不展示文章推荐 + # front-matter 使用 skip_recommended_article: true 关闭 + # 不在以下文件夹文章中展示文章推荐 根目录是source/ + skip_dirs: + - wiki/ + # ---------------- + # 相关文章,需要安装插件 (for layout: post) + # npm i hexo-related-popular-posts + related_posts: + enable: false + title: 相关文章 + icon: fa-solid fa-bookmark + max_count: 5 + # 设为空则不使用文章头图 + placeholder_img: https://gcore.jsdelivr.net/gh/MHG-LAB/cron@gh-pages/bing/bing.jpg + # ---------------- + # 版权声明组件 (for layout: post) + copyright: + enable: true + permalink: '本文连接:' + content: + - permalink + - '版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!' + + # - 'hehe blog' + # - permalink + # 自定义版权组件:精细到文章的版权声明 + custom: false # 开启后替代上方内容的版权显示 + customData: + default: type5 # 默认授权声明 + ############################# + # 你可以在文章的 front-matter 覆盖默认版权声明 + # 配置示例(均可选): + # copyright: + # type: type3 # 当前文章版权声明类型 + # author: 张三 # 本文作者 + # ref: # 原文出处 + # title: # 原文出处 - 标题 + # url: # 原文出处 - 链接 + ############################# + rules: + type1: + text: hehe🪂blog + desc: 署名-非商业性使用-相同方式共享 4.0 国际。 + type2: + text: 禁止转载引用 + desc: 除非获得原作者的单独授权,任何第三方不得转载! + type3: + text: 原作许可协议 + desc: 本文转载自他站,转载或引用本文时,请遵守原作许可协议! + type4: + text: 来自互联网 + desc: 本文来自互联网,未知来源,侵权请联系删除。 + type5: + text: 允许规范转载 + desc: 转载请保留本文转载地址,著作权归作者所有! + type6: + text: 允许付费转载 + desc: 您可以联系作者通过付费方式获得授权。 + # 还能自行添加更多 + # ---------------- + # 打赏组件 (for layout: post) + donate: + enable: false + images: + - volantis-static/media/org.volantis/blog/qrcode/github@volantis.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/qrcode/github@volantis.png + - volantis-static/media/org.volantis/blog/qrcode/github@volantis.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/qrcode/github@volantis.png + # meta library + meta_library: + # 默认文章作者(可在 _data/author.yaml 中增加其他作者,并在 front-matter 中设置) + # https://volantis.js.org/advanced-settings/#多人协同 + author: + avatar: https://photo.yhehe.com/tp/h.ico # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/favicon/apple-touch-icon.png + name: hehe + url: /about/ + # 文章创建日期 + date: + icon: fa-solid fa-calendar-alt + title: '发布于:' + format: 'll' # 日期格式 http://momentjs.com/docs/ + # 文章更新日期 + updated: + icon: fa-solid fa-edit + title: '最后修改于:' + format: 'll' # 日期格式 http://momentjs.com/docs/ + # 文章分类 + category: + icon: fa-solid fa-folder-open + # 文章浏览计数 + #counter: + # icon: fa-solid fa-eye + # unit: '次浏览' + # waline 文章评论数量 + walinecount: + icon: fa-solid fa-comment-dots + desc: '条评论' # 条评论 + # artalk 文章评论数量 + artalkcount: + icon: fa-solid fa-comment-dots + desc: '条评论' # 条评论 + # 文章字数和阅读时长 + wordcount: + icon_wordcount: fa-solid fa-keyboard + icon_duration: fa-solid fa-hourglass-half + # 文章标签 + tags: + icon: fa-solid fa-hashtag + # 分享 + #share: + # - id: qq + # img: volantis-static/media/org.volantis/logo/128/qq.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/128/qq.png + # - id: qzone + # img: volantis-static/media/org.volantis/logo/128/qzone.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/128/qzone.png + # - id: weibo + # img: volantis-static/media/org.volantis/logo/128/weibo.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/128/weibo.png + # - id: # qrcode # 当id为qrcode时需要安装插件 npm i hexo-helper-qrcode + # img: # volantis-static/media/org.volantis/logo/128/wechat.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/128/wechat.png + # - id: # telegram + # img: # volantis-static/media/org.volantis/logo/128/telegram.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/128/telegram.png +############################### Article Layout ############################### > end + + +############################### Comments ############################### > start +comments: + title: 评论 + subtitle: + service: artalk + # 可选评论系统 # + + # artalk + # https://artalk.js.org/ + # https://github.com/ArtalkJS/Artalk + artalk: + server: https://pl.yhehe.com/ # 修改为自建的后端服务地址 + path: # 全局评论地址! + placeholder: 你觉的咋呀 # 评论占位 + visitor: true # 是否显示文章阅读数 + latex: false # 启用 Latex 支持 + # artalk 有三类图片:1.上传至服务端 2.上传至服务端后利用upgit上传至图床 3.前端上传至图床(本配置为此类) + # 配置此项时将覆盖服务端上传能力 + imageUploader: + # 以兰空图床为例,下列填写内容为: + # url: 'https://xxxxxx/api/v1/upload' + # token: 'Bearer xxxxxxxxxxxxxx' + # resp: 'data.links.url' + api: # 图床地址 + token: # 图床验证 + resp: # 图片地址返回值的字段 + # 更多置项可在 Artalk 后端进行配置,详见 https://artalk.js.org/guide/backend/fe-control.html + # 也可以在此处继续参考上方例子进行配置,不建议重写配置的字段除上方所述外还有: + # [el, useBackendConf, pageKey, pageTitle, site, darkMode, pvEl, imgUploader] + + # giscus + # https://giscus.app + # https://github.com/laymonage/giscus + giscus: + # 以下配置按照 yml 格式增删填写即可 + # repo: xxx/xxx + # repo-id: xxx + # category: xxx + # category-id: xxx + # mapping: "pathname" + # reactions-enabled: "1" + # emit-metadata: "0" + # lang: "zh-CN" + # 以上配置按照 yml 格式增删填写即可 + theme: + light: "light" # https://cdn.jsdelivr.net/gh/volantis-x/cdn-volantis@master/css/giscus/light.css + dark: "dark" # https://cdn.jsdelivr.net/gh/volantis-x/cdn-volantis@master/css/giscus/dark.css + + # beaudar + # https://beaudar.lipk.org/ + beaudar: + repo: xxx/xxx + issue-term: pathname + issue-number: + branch: main + position: top + order: desc + theme: + light: github-light + dark: github-dark + label: ✨💬✨ + + # utterances + # https://utteranc.es/ + utterances: + repo: xxx/xxx + issue-term: pathname + issue-number: + theme: + light: github-light + dark: github-dark + label: ✨💬✨ + + # Disqus + # https://disqus.com + disqus: + shortname: + # optional + autoload: false + path: # 全局评论地址 + + # DisqusJS + # https://github.com/SukkaW/DisqusJS + disqusjs: + path: # 全局评论地址 + # 配置项按照yml格式继续填写即可 除了 [siteName url identifier] 选项 + #shortname: + #api: + #apikey: + #admin: + #nesting: + + # Gitalk + # https://gitalk.github.io/ + gitalk: + # 配置项按照yml格式继续填写即可 除了 [id distractionFreeMode] 选项 + clientID: + clientSecret: + repo: + owner: + admin: # [] + path: # 全局评论地址 + + # https://vssue.js.org/zh/ + vssue: + owner: + repo: + clientId: + clientSecret: + + # https://www.livere.com + livere: + uid: + + # Isso + # https://posativ.org/isso/ + isso: + url: https://example.com/(path/) + src: https://example.com/(path/)js/embed.min.js + css: + gravatar: + + # https://www.barkdull.org/software/hashover + hashover: + src: https://example.com/(path/)comments.php + + # Twikoo + # https://twikoo.js.org/ + twikoo: + path: # 全局评论地址 + # 其他配置项按照yml格式继续填写即可 除了 [el path] 选项 + envId: xxxxxxxxxxxxxxx # 腾讯云环境填 envId;Vercel 环境填地址(https://xxx.vercel.app) + placeholder: #全局评论占位,也可以在管理面板中的配置管理处设置(此处优先级更高) + visitor: true # 是否显示文章阅读数 + + # Waline + # https://waline.js.org/ + waline: + path: # 全局评论地址 目前设置全局评论地址后visitor失效,这是waline的问题 + placeholder: # 评论占位提示 + serverURL: # Waline 的服务端地址(必填) 测试用地址: https://waline.vercel.app + imageUploader: + # 适配了兰空图床V1、V2版本 + # 以兰空图床V1为例,下列填写内容为: + # fileName: file + # tokenName: Authorization + # api: https://xxxxxx/api/v1/upload + # token: Bearer xxxxxxxxxxxxxx + # resp: data.links.url + # 以兰空图床V2为例,下列填写内容为: + # fileName: image + # tokenName: token + # api: https://xxxxxx/api/upload + # token: xxxxxxxxxxxxxx + # resp: data.url + fileName: # 根据版本二选一 + tokenName: # 根据版本二选一 + api: # 图床 api 地址 + token: # 图床验证 + resp: # 图片地址返回值的字段 + pageview: true # 是否显示文章阅读数 + comment: true # 是否显示文章评论数 + # 其他配置项按照yml格式继续填写即可 除了 [el path imageUploader] 选项 + # 组件属性地址:https://waline.js.org/reference/component.html + # meta: ['nick', 'mail', 'link'] + + # Discuss + # https://discuss.js.org + discuss: + serverURLs: # Discuss server address url + visitStat: true # 是否显示文章阅读数 + # https://discuss.js.org/Quick-Start.html#path + + +############################### Comments ############################### > end + +############################### Sidebar ############################### > start +sidebar: + position: right # left right + # 主页、分类、归档等独立页面 + for_page: [blogger, memos_carousel, category, tagcloud, donate, webinfo, lastupdate] + # layout: docs/post 这类文章页面 + for_post: [toc] + # 侧边栏组件库 + widget_library: + # --------------------------------------- + # blogger info widget + blogger: + class: blogger + display: [desktop, mobile] # [desktop, mobile] + avatar: https://photo.yhehe.com/tp/tx.jpg # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/Logo-NavBar@3x.png + shape: rectangle # circle, rectangle + url: /about/ + title: hehe.... + subtitle: 就喜欢看你笑🛵 + jinrishici: false # Poetry Today. You can set a string, and it will be displayed when loading fails. + social: + - icon: fa-solid fa-rss + url: /atom.xml + - icon: fa-solid fa-envelope + url: mailto:yonghehe@gmail.com + - icon: fab fa-github + url: https://github.com/uoxiangfei/ + - icon: fa-solid fa-download + url: https://wp.yhehe.com/ + # --------------------------------------- + # Memos widget + memos_carousel: + class: memos_carousel + display: [desktop, mobile] + header: + icon: fa-solid fa-volume-high + title: 说说 + url: https://ss.yhehe.com/ # 说说页面的地址s + url: 'https://ss.yhehe.com/' # 替换城自己的域名,也可以用杜老师的平台托管 + limit: '10' # 展示数量限制 + creatorId: '1' # 替换成自己的用户的ID + tag: '' # 要展示的内容的标签 + image: 'fa-solid fa-image' # 图片替换成图标 + link: 'fa-solid fa-link' # 链接替换成图标 + placeholder: '说说加载中...' # 占位符 + # toc widget (valid only in articles) + toc: + class: toc + display: [desktop, mobile] # [desktop, mobile] + sticky: true + header: + icon: fa-solid fa-list + title: 本文目录 + list_number: false + min_depth: 2 + max_depth: 5 + # --------------------------------------- + music: + class: music + display: [desktop, mobile] # [desktop, mobile] + # --------------------------------------- + # category widget + category: + class: category + display: [desktop] # [desktop, mobile] + header: + icon: fa-solid fa-folder-open + title: 文章分类 + url: /categories/ + # --------------------------------------- + # tagcloud widget + tagcloud: + class: tagcloud + display: [desktop, mobile] # [desktop, mobile] + header: + icon: fa-solid fa-tags + title: 热门标签 + url: /tags/ + min_font: 14 + max_font: 24 + color: true + start_color: '#999' + end_color: '#555' + # --------------------------------------- + # qrcode widget + qrcode: + class: qrcode + display: [desktop, mobile] # [desktop, mobile] + height: 64px # Automatic height if not set + images: + - volantis-static/media/org.volantis/blog/qrcode/github@volantis.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/qrcode/github@volantis.png + - volantis-static/media/org.volantis/blog/qrcode/github@volantis.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/qrcode/github@volantis.png + # --------------------------------------- + # webinfo widget + webinfo: + class: webinfo + display: [desktop] + header: + icon: fa-solid fa-award + title: 站点信息 + type: + article: + enable: true + text: '文章数目:' + unit: '篇' + runtime: + enable: true + data: '2023/12/01' # 填写建站日期 + text: '已运行时间:' + unit: '天' + wordcount: + enable: false + text: '本站总字数:' # 需要启用 wordcount + unit: '字' + visitcounter: + enable: true + siteuv: + text: '本站访客数:' + unit: '人' + sitepv: + text: '本站总访问量:' + unit: '次' + lastupd: + enable: true + friendlyShow: true # 更友好的时间显示 + text: '最后活动时间:' + unit: '日' + # --------------------------------------- + # lastupdate widget + lastupdate: + class: lastupdate + display: [desktop, mobile] + header: + icon: fa-solid fa-clock WISTERIA + title: 最近更新 + # --------------------------------------- + # Artalk widget + artalk: + class: artalk + stickys: true + display: [desktop, mobile] + # --------------------------------------- + +###################################################################### + heisi: + class: text + display: [desktop, mobile] + header: + icon: fas fa-info + title: 随机图片 + url: https://blog.yhehe.com/ss/ + content: + - '
' + +############################### Sidebar ############################### > end + + +############################### Tag Plugins ############################### > start +# 内置标签插件的配置 +tag_plugins: + # {% note text %} + note: # style for default note: + icon: '\f054' + color: '' + iconfont: 'Font Awesome 6 Free' + # {% checkbox %} + checkbox: + interactive: false # enable interactive for user + color: '' # color for default checkbox + # {% link title, url, img %} + link: + placeholder: volantis-static/media/org.volantis/logo/256/safari.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/256/safari.png +############################### Tag Plugins ############################### > end + + +############################### Site Footer ############################### > start +site_footer: + # layout of footer: [aplayer, social, license, info, copyright] + layout: [social, license, info, copyright, analytics] + social: + - icon: fa-solid fa-comment fa-fw + url: ss/ + # or + - img: + url: + # or + - avatar: + url: + # or + - icon: fas fa-rss + url: atom.xml + # or + - icon: fas fa-envelope + url: mailto:yonghehe@gmail.com #你的邮箱 + # or + - icon: fab fa-github + url: https://github.com/uoxiangfei #你的github地址 + # site source + source: https://github.com/volantis-x/volantis-docs/ + # analytics using busuanzi + analytics: > + 总访问量为 + 访客数为 + # site copyright + copyright: '[ 陕ICP备2023001794号-3](https://beian.miit.gov.cn/) | [theme:volantis](https://github.com/volantis-x/hexo-theme-volantis/#6.0.0-alpha.1)
' + # You can add your own property here. (Support markdown, for example: br: '
') + br: '
' +############################### Site Footer ############################### > end + +############################### Plugins ############################### > start +plugins: + ################ required plugins ################ + # jquery + globalJquery: false # 全局引入 jquery + # fontawesome + fontawesome: true + ################ optional plugins ################ + # issues api + sitesjs: + enable: true + friendsjs: + enable: true + contributorsjs: + enable: true + + ######## Plugins to improve loading speed: + # 预加载 + preload: + enable: true + service: flying_pages # instant_page, flying_pages + + # 图片懒加载 + # https://www.npmjs.com/package/vanilla-lazyload + # tips: + # 这里是主题自带的图片懒加载, 实现方案位于 /scripts/filters/z-lazyload ; srcset 属性的的优先级比 src 属性要高, 注意 srcset 存放了懒加载占位图, src 存放了原图 + # 在支持 srcset 的浏览器或者 RSS 阅读器(还会有人使用老旧的阅读器?)上会优先读取 srcset 加载的图片(懒加载占位图), 对于 RSS 中图片丢失变成懒加载占位图的问题, 建议 自行使用脚本移除 srcset 属性 或 关闭图片懒加载 或 在 RSS 中插入 vanilla-lazyload + lazyload: + enable: true + onlypost: false + loadingImg: # https://cdn.jsdelivr.net/gh/volantis-x/cdn-volantis@3/img/placeholder/c617bfd2497fcea598e621413e315c368f8d8e.svg # 不建议使用占位图, 建议loadingImg为空, 当前占位图会产生布局偏移, loadingImg 为空占位图是一个 1X1 像素的图片 + blurIn: true # 模糊加载效果 (loadingImg为空时有效) + + ######## Plugins to optimize the experience: + # 代码高亮 + code_highlight: highlightjs # highlightjs or prismjs + # highlight.js + highlightjs: + copy_code: true + # 如果开启以下配置, hexo.config.highlight.enable 需要设置为 false ; hexo.config.highlight.enable 设置为 true, 则以下配置无效 + # # 不再支持 v11.1.0 以下版本 + js: https://unpkg.com/@highlightjs/cdn-assets@11.9.0/highlight.min.js # Please set hexo.config.highlight.enable = false !!! + css: https://unpkg.com/@highlightjs/cdn-assets@11.9.0/styles/github-dark-dimmed.css + # # # more: https://www.jsdelivr.com/package/npm/@highlightjs/cdn-assets?path=styles + + # prismjs + # https://prismjs.com/ + # https://hexo.io/zh-cn/docs/syntax-highlight#PrismJS + prismjs: + copy_code: true + # Please set hexo.config.highlight.enable = false !!! set hexo.config.prismjs.enable = true !!! + js: + - https://unpkg.com/prismjs/components/prism-core.min.js + - https://unpkg.com/prismjs/plugins/autoloader/prism-autoloader.min.js + - https://unpkg.com/prismjs/plugins/line-numbers/prism-line-numbers.min.js + css: + - https://unpkg.com/prismjs/themes/prism-dark.css + - https://unpkg.com/prismjs/plugins/line-numbers/prism-line-numbers.css + + # https://scrollrevealjs.org/api/reveal.html + scrollreveal: + enable: #true + distance: 32px + duration: 800 # ms + interval: 20 # ms + scale: 1 # 0.1~1 + + ######## Plugins for Count: + # npm i hexo-wordcount + wordcount: + enable: #true + + busuanzi: + enable: #true + + ######## Plugins for ... + # Button Ripple Effect + nodewaves: + enable: #true + + # fontawesome V6: https://fontawesome.com/docs/web/style/animate + # fontawesome animation for fontawesome V5 + fontawesome_animation: + enable: #true + + # Typing Effects + comment_typing: + enable: #true + + # 视差滚动效果 Slide Background + parallax: + enable: #true + position: cover # cover: sticky on the cover. fixed: Fixed as background for the site. + shuffle: true # shuffle playlist + duration: 10000 # Duration (ms) + fade: 1500 # fade duration (ms) (Not more than 1500) + images: # For personal use only. At your own risk if used for commercial purposes !!! + - volantis-static/media/wallpaper/minimalist/2020/001.webp + - volantis-static/media/wallpaper/minimalist/2020/002.webp + - volantis-static/media/wallpaper/minimalist/2020/003.webp + - volantis-static/media/wallpaper/minimalist/2020/004.webp + - volantis-static/media/wallpaper/minimalist/2020/005.webp + - volantis-static/media/wallpaper/minimalist/2020/006.webp + - volantis-static/media/wallpaper/minimalist/2020/012.webp + - volantis-static/media/wallpaper/minimalist/2020/016.webp + - volantis-static/media/wallpaper/minimalist/2020/019.webp + - volantis-static/media/wallpaper/minimalist/2020/025.webp + - volantis-static/media/wallpaper/minimalist/2020/033.webp + - volantis-static/media/wallpaper/minimalist/2020/034.webp + - volantis-static/media/wallpaper/minimalist/2020/035.webp + - volantis-static/media/wallpaper/minimalist/2020/038.webp + - volantis-static/media/wallpaper/minimalist/2020/039.webp + - volantis-static/media/wallpaper/minimalist/2020/042.webp + - volantis-static/media/wallpaper/minimalist/2020/046.webp + - volantis-static/media/wallpaper/minimalist/2020/051.webp + - volantis-static/media/wallpaper/minimalist/2020/052.webp + - volantis-static/media/wallpaper/minimalist/2020/054.webp + - volantis-static/media/wallpaper/minimalist/2020/056.webp + + # APlayer is only available in mainland China. + # https://aplayer.js.org/#/zh-Hans/ + # APlayer config: https://github.com/metowolf/MetingJS + aplayer: + enable: false + source: meting # meting:从 MetingJS API 获取音乐数据(API经常不稳定) / local:本地音乐数据 + # ============= meting begin ============= + # Required + server: netease # netease, tencent, kugou, xiami, baidu + type: playlist # song, playlist, album, search, artist + id: 3175833810 # song id / playlist id / album id / search keyword + # ============= meting end ============= + # ============= local begin ============== + # local 暂时没有适配右键 和 post.music 迷你模式 + audio: + - name: 'Fly' + artist: 'Marshmello' + url: '/music/fly.mp3' + lrc: '/music/fly.lrc' + cover: '/music/fly.jpg' + - name: 'Avem' + artist: 'Alan Walker' + url: '/music/Avem.mp3' + lrc: '/music/Avem.lrc' + cover: '/music/Avem.jpg' + # ============= local end ================ + # Optional + fixed: false # enable fixed mode + theme: '#1BCDFC' # main color + autoplay: false # audio autoplay + order: list # player play order, values: 'list', 'random' + loop: all # player loop play, values: 'all', 'one', 'none' + volume: 0.7 # default volume, notice that player will remember user setting, default volume will not work after user set volume themselves + list_max_height: 320px # list max height + list_folded: true + autoHide: true # hide automaticaly + + # pace + # An automatic web page progress bar. + # https://github.com/CodeByZach/pace + pace: + enable: true + color: blue # black, blue, green, orange, pink, purple, red, silver, white, yellow + theme: minimal # big-counter, bounce, barber-shop, center-atom, center-circle, center-radar, center-simple, corner-indicator, fill-left, flat-top, flash, loading-bar, mac-osx, material, minimal + + # 暗黑模式 darkmode + # 开关按钮:在 navbar.menu 中添加: + # - name: 暗黑模式 # 可自定义 + # icon: fa-solid fa-moon # 可自定义 + # toggle: darkmode + darkmode: + enable: true + + # 旧版 Internet Explorer 淘汰行动 + # https://www.microsoft.com/zh-cn/WindowsForBusiness/End-of-IE-support + # 本主题不支持Internet Explorer的任何版本!!! + killOldVersionsOfIE: + enable: true + + # 禁用JavaScript提示 + # 本页面需要浏览器支持(启用)JavaScript + # 主题中的某些插件必须启用JavaScript才能正常工作,例如开启scrollreveal如果禁用JavaScript会导致卡片消失 + killNoScript: + enable: true + + # Artitalk https://artitalk.js.org + # 配置过程请参考:https://artitalk.js.org/doc.html + # 使用过旧版本的请修改Leancloud shuoshuo class部分列名:https://artitalk.js.org/release.html + # 除appID和appKEY外均为选填项 + artitalk: + # Set `plugins: ["artitalk"]` to enable in front-matter + # 配置项按照yml格式继续填写即可 + appId: ogP8qj3veMh0LFpFWMPOyF0X-MdYXbMMI # your appID + appKey: nHXLd3N3Jgh460t2iRQKWAtr # your appKEY + # serverURL: #leancloud绑定的api访问域名,使用国际版的话不需要填写 + # lang: # 语言设置,zh为汉语,en为英语,es为西班牙语。默认为汉语 + # pageSize: #每页说说的显示数量 + # shuoPla: #在编辑说说的输入框中的占位符 + # avatarPla: #自定义头像url的输入框的占位符 + # motion: #加载动画的开关,1为开,0为关,默认为开 + # bgImg: #说说输入框背景图片url + # color1: #说说背景颜色1&按钮颜色1 + # color2: #说说背景颜色2&按钮颜色2 + # color3: #说说字体颜色 + # cssUrl: #自定义css接口 + + # Memos https://usememos.com + memos: + # Set `plugins: ["memos"]` to enable in front-matter + url: 'https://ss.yhehe.com/' # 替换成自己的域名,也可以用杜老师的平台托管 + limit: '10' # 展示数量限制 + id: '1' # 替换成自己的用户的ID + + # BBtalk https://bb.js.org + bbtalk: + # Set `plugins: ["bbtalk"]` to enable in front-matter + appId: 0KzOX4vC7Jsk6vzUGNeEiUaI-gzGzoHsz # your appID + appKey: HwCiWuxfpvKiLm4teCUgTIba # your appKEY + serverURLs: https://bbapi.heson10.com # Request Api 域名 + + # 友链朋友圈 hexo-circle-of-friends + # https://github.com/Rock-Candy-Tea/hexo-circle-of-friends + # https://fcircle-doc.js.cool/ + fcircle: + # Set `plugins: ["fcircle"]` to enable in front-matter + private_api_url: https://fcircle-api.example.com/ # api 地址 + page_init_number: 20 # 初始加载几篇文章 + page_turning_number: 10 # 点击加载更多时,一次最多加载几篇文章,默认10 + error_img: https://cravatar.cn/avatar/57d8260dfb55501c37dde588e7c3852c # 头像加载失败时,默认头像地址 + sort_rule: created # 进入页面时第一次的排序规则,可选值:created/updated + expire_days: 1 # 本地文章缓存数据过期时间(天) + js: https://npm.elemecdn.com/fcircle-theme-yyyz@1.0.13/dist/fcircle.min.js # fcircle.min.js的url + + # 消息提示 + # izitoast + message: + enable: true + icon: # 默认图标,支持对图标添加颜色,可选值:see:/source/css/_style/_plugins/fontcolor.styl + default: fa-solid fa-info-circle light-blue + quection: fa-solid fa-question-circle light-blue + time: # 默认持续时间 + default: 5000 + quection: 20000 + position: 'topRight' # 弹出位置 可选值:topRight, bottomRight, bottomLeft, topLeft, topCenter, bottomCenter, center + transitionIn: 'bounceInLeft' # 弹窗打开动画 可选值:bounceInLeft, bounceInRight, bounceInUp, bounceInDown, fadeIn, fadeInDown, fadeInUp, fadeInLeft, fadeInRight, flipInX + transitionOut: 'fadeOutRight' # 弹窗关闭动画 可选值:fadeOut, fadeOutUp, fadeOutDown, fadeOutLeft, fadeOutRight, flipOutX + titleColor: 'var(--color-text)' # 标题颜色 + messageColor: 'var(--color-text)' # 消息颜色 + backgroundColor: 'var(--color-card)' # 默认背景色 + zindex: 2147483647 # 层级 + copyright: # 是否在复制时弹出版权提示,影响范围:ctrl+c、代码块复制按钮、右键复制选项 + enable: true + title: '知识共享许可协议' + message: '请遵守 CC BY-NC-SA 4.0 协议。' + icon: 'far fa-copyright light-blue' + aplayer: # 是否开启音乐通知;播放、暂停、失败 时的图标 + enable: true + play: fa-solid fa-play + pause: fa-solid fa-pause + rightmenu: + enable: true # 是否开启右键模块的消息通知 + notice: true # 唤醒原右键菜单的通知 + + # 聊天功能 + chat_service: # tidio or gitter + + # Tidio + # https://www.tidio.com/ + tidio: + id: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + + # Gitter + # https://gitter.im + gitter: + room: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + + # swiper + # https://www.swiper.com.cn/ + swiper: + enable: true + + # AI摘要 + # https://github.com/zhheo/Post-Abstract-AI + tianliGPT: + enable: false + key: 5Q5mpqRK5DkwT1X9Gi5e + wordLimit: 1000 # 摘要字数限制 (⚠️危险:更改此变量损失已消耗过的key,因为你提交的内容发生了变化。) + typewriter: true # 打字机效果 + +############################### Plugins ############################### > end + +############################### Rightmenu ############################### > start + +### 自定义右键 +rightmenus: + enable: false + # 右键菜单项及加载顺序 + # 内容示例:plugins.[组名], menus.[组名], hr(分割线,推荐去线留白), music(音乐控制器) + order: + - plugins.navigation + - hr + - plugins.inputBox + - plugins.seletctText + - plugins.elementCheck + - plugins.elementImage + - menus.link + - hr + - menus.darkMode + - plugins.articlePage + - music + ############################ + # - {id: '', name: '', icon: '', link: '', event: '', group: ''} + # id: 唯一值 + # name: 用于菜单名称显示 + # icon: 用于菜单图标显示 + # link: 跳转链接 + # event: 事件,当输入内容不为内置事件时,作 JavaScript 代码执行 + # group: 菜单项所处分组名称 + # 注: + # 1. link/event 二选一,同时出现时仅处理 link + # 2. 内置事件列表: copyText, copyLink, copyPaste, copyAll, copyCut, copyImg, printMode, readMode + # 3. 内置组列表:navigation, inputBox, seletctText, elementCheck, elementImage, articlePage + # 4. plugins 列允许自定义组内项目 + # 5. menus 列允许自定义组及其内容 + # 6. 除 navigation 外的内置组,在显示时会隐藏含 link 属性的菜单项 + ########################### + # 基础项设置 + options: + # 图标前缀 fa-solid, fa-regular, fa-light, fa-thin, fa-duotone, fa-brands + iconPrefix: fa-solid + # 例外,在 articlePage 组显示时(文章页)时依旧显示含 link 属性的菜单项 + articleShowLink: true + # 当设定全局音乐播放器时,是否一直显示音乐控制菜单。false:仅当音乐播放时启用 + musicAlwaysShow: true + # 右键内置组,预置实现 + plugins: + # 导航组件 + # 横向排列,共用一行,仅显示图标 (原则上支持的数量不限) + navigation: + - {id: 'left', name: '转到上一页', icon: 'fa-solid fa-arrow-left', event: 'history.back()', group: 'navigation'} + - {id: 'right', name: '转到下一页', icon: 'fa-solid fa-arrow-right', event: 'history.forward()', group: 'navigation'} + - {id: 'redo', name: '刷新当前页面', icon: 'fa-solid fa-redo', event: 'window.location.reload()', group: 'navigation'} + - {id: 'up', name: '回到顶部', icon: 'fa-solid fa-arrow-up', event: 'VolantisApp.scrolltoElement(volantis.dom.bodyAnchor)', group: 'navigation'} + #- {id: 'home', name: '回到首页', icon: 'fa-solid fa-home', link: '/', group: 'navigation'} + # 文本输入框相关组件 + # 生效于 input/textarea,粘贴、剪切、全选 + inputBox: + - {id: 'copyPaste', name: '粘贴文本', icon: 'fa-solid fa-paste', event: 'copyPaste', group: 'inputBox'} + - {id: 'copyAll', name: '全选文本', icon: 'fa-solid fa-object-ungroup', event: 'copyAll', group: 'inputBox'} + - {id: 'copyCut', name: '剪切文本', icon: 'fa-solid fa-cut', event: 'copyCut', group: 'inputBox'} + # 文本选中类组件 + # 生效于右键选中文本,__text__ 为选中的文本。 + seletctText: + - {id: 'copyText', name: '复制文本', icon: 'fa-solid fa-copy', event: 'copyText', group: 'seletctText'} + - {id: 'searchWord', name: '站内搜索', icon: 'fa-solid fa-search', event: 'OpenSearch(__text__)', group: 'seletctText'} + - {id: 'bingSearch', name: '必应搜索', icon: 'fa-solid fa-search', event: 'window.open(`https://cn.bing.com/search?q=${__text__}`)', group: 'seletctText'} + #- {id: 'googleSearch', name: '谷歌搜索', icon: 'fa-solid fa-search', event: 'window.open(`https://www.google.com/search?q=${__text__}`)', group: 'seletctText'} + # 链接判断组件 + # 生效于链接处的右键行为,__link__ 为链接地址 + elementCheck: + - {id: 'openTab', name: '新标签页打开', icon: 'fa-solid fa-external-link-square-alt', event: 'window.open(__link__)', group: 'elementCheck'} + - {id: 'copyLink', name: '复制链接地址', icon: 'fa-solid fa-link', event: 'copyLink', group: 'elementCheck'} + # 图片判断类组件 + # 生效于图片类的右键行为,__link__ 为链接地址 + elementImage: + - {id: 'copyImg', name: '复制图片', icon: 'fa-solid fa-image', event: 'copyImg', group: 'elementImage'} + - {id: 'googleImg', name: '谷歌识图', icon: 'fa-solid fa-images', event: 'window.open(`https://www.google.com.hk/searchbyimage?image_url=${__link__}`)', group: 'elementImage'} + # 文章页面组件 + # 生效于 post.article 页面 + articlePage: + - {id: 'printMode', name: '打印页面', icon: 'fa-solid fa-print', event: 'printMode', group: 'articlePage'} + - {id: 'readMode', name: '阅读模式', icon: 'fa-solid fa-book-open', event: 'readMode', group: 'articlePage'} + # 右键自定义菜单区域 + menus: + link: + - {id: 'help', name: '常见问题', icon: 'fa-solid fa-question', link: 'https://volantis.js.org/faqs/', group: 'link'} + - {id: 'examples', name: '示例博客', icon: 'fa-solid fa-rss', link: 'https://volantis.js.org/examples/', group: 'link'} + - {id: 'contributors', name: '加入社区', icon: 'fa-solid fa-fan', link: 'https://volantis.js.org/contributors/', group: 'link'} + - hr + - {id: 'source_docs', name: '本站源码', icon: 'fa-solid fa-code-branch', link: 'https://github.com/volantis-x/volantis-docs/', group: 'link'} + - {id: 'source_theme', name: '主题源码', icon: 'fa-solid fa-code-branch', link: 'https://github.com/volantis-x/hexo-theme-volantis/', group: 'link'} + darkMode: + - {id: 'darkMode', name: '暗黑模式', icon: 'fa-solid fa-moon', event: 'volantis.dark.toggle()', group: 'darkMode'} +### + + +############################### Search ############################### > start +# To use hexo search, you need to install the following plugins: +# npm i hexo-generator-json-content +search: + enable: true + service: hexo # hexo, algolia, meilisearch + algolia: + searchAsYouType: true # If false, triggers the search only on submit. + hitsPerPage: 5 # Set the number of hits per page. + placeholder: 'Search...' # The placeholder text of the input. + meilisearch: + placeholder: 'Search...' + searchKey: '' + indexName: '' + hostUrl: '' + +############################### Search ############################### > end + +############################### Color Scheme ############################### > start +# Accessibility: 背景色和前景色要有足够的对比度 https://web.dev/color-contrast/ +# https://ant.design/docs/spec/colors-cn +color_scheme: + # ------------ + # 通用颜色 + common: + # 主题色 + theme: '#3dd9b6' + # 链接色 + link: '#2092ec' + # 按钮色 + button: '#44D7B6' + # 鼠标放到交互元素上时的色 + hover: '#ff5722' + # 主题色块内部的文字颜色 + inner: '#fff' + # 选中区域文字的背景颜色 + selection: 'alpha(#2196f3, 0.2)' + # ------------ + # 亮色主题(默认) + light: + # 网站背景色 + site_bg: '#f4f4f4' + # 网站背景上的文字 + site_inner: '#fff' + # 网站页脚文字 + site_footer: '#666' + + # 卡片背景色 + card: '#fff' + # 卡片上的普通文字 + text: '#444' + + # 区块和代码块背景色 + block: '#f6f6f6' + # 代码块高亮时的背景色 + codeblock: '#FFF7EA' + # 行内代码颜色 + inlinecode: '#c74f00' + + # 文章部分 + h1: '#3a3a3a' + h2: '#3a3a3a' + h3: '#333' + h4: '#444' + h5: '#555' + h6: '#666' + p: '#444' + + # 列表文字 + list: '#666' + # 列表 hover 时的文字 + list_hl: 'mix($color-theme, #000, 80)' + # 辅助性文字 + meta: '#888' + + # 版权卡片背景色 + copyright_bkg: '#f5f5f5' + # ------------ + # 暗色主题 + # https://www.maijisheji.com/2094.html + dark: + # 网站最深底色 # Dark Grey 1 + site_bd: '#121212' + # 网站背景色 # Dark Grey 2 + site_bg: '#1f1f1f' + # 卡片背景色 # Dark Grey 3 + card: '#262626' + # 网站背景上的文字 + site_inner: '#eeeeeede' + # 网站页脚文字 + site_footer: '#aaaaaade' + # 卡片上的普通文字 + text: '#eeeeeede' + + # 区块和代码块背景色 # Dark Grey 4 + block: '#434343' + # 代码块高亮时的背景色 # Dark Grey 2 + codeblock: '#1f1f1f' + # 行内代码颜色 + inlinecode: '#D56D28' + + # 文章部分 高强度文本的不透明度应为87% 中等重点文字适用于60% + h1: '#FFFFFFde' # Dark Grey 8 + h2: '#FFFFFFde' + h3: '#FFFFFF99' # Dark Grey 7 + h4: '#FFFFFF99' + h5: '#FFFFFF99' + h6: '#FFFFFF99' + p: '#d9d9d9de' # Dark Grey 6 + + # 列表文字 # Dark Grey 6 + list: '#d9d9d9de' + # 列表 hover 时的文字 + list_hl: 'mix($color-theme, #fff, 80)' + # 辅助性文字 # Dark Grey 5 + meta: '#bfbfbfde' + # 版权卡片背景色 + copyright_bkg: '#21252b' + # 夜间图片亮度 + brightness: 70% +############################### Color Scheme ############################### > end + +############################### Custom css ############################### > start +custom_css: + cursor: + enable: true + text: volantis-static/media/cursor/text.png # https://cdn.jsdelivr.net/gh/inkss/common@1/cursor/text.png + pointer: volantis-static/media/cursor/pointer.png # https://cdn.jsdelivr.net/gh/inkss/common@1/cursor/pointer.png + default: volantis-static/media/cursor/left_ptr.png # https://cdn.jsdelivr.net/gh/inkss/common@1/cursor/left_ptr.png + not-allowed: volantis-static/media/cursor/circle.png # https://cdn.jsdelivr.net/gh/inkss/common@1/cursor/circle.png + zoom-out: volantis-static/media/cursor/zoom-out.png # https://cdn.jsdelivr.net/gh/inkss/common@1/cursor/zoom-out.png + zoom-in: volantis-static/media/cursor/zoom-in.png # https://cdn.jsdelivr.net/gh/inkss/common@1/cursor/zoom-in.png + grab: volantis-static/media/cursor/openhand.png # https://cdn.jsdelivr.net/gh/inkss/common@1/cursor/openhand.png + font_smoothing: true # font-smoothing for webkit + max_width: 1080px # Sum of body width and sidebar width (This limit will be exceeded when the device width is greater than 2000px, reaching 75% of the total width) + scrollbar: + size: 9px + border: 2px + navbar: + height: 64px + width: auto # auto, max + effect: [shadow, floatable, blur] # [shadow, floatable, blur] + sidebar: + effect: [shadow, floatable, blur] # [shadow, floatable, blur] + body: + effect: [shadow, floatable, blur] # [shadow, floatable, blur] + highlight: + language: true # show language of codeblock + grayscale: false # Enable grayscale effect + text_align: # left, right, justify, center + h1: left + h2: left + h3: left + h4: left + p: justify + gap: + h2: 48px # Spacing above H2 (only px unit) + h3: 24px # Spacing above H3 (only px unit) + h4: 16px # Spacing above H4 (only px unit) + p: 1em # Paragraph spacing between paragraphs + line_height: 1.6 # normal, 1.5, 1.75, 2 ... + border_radius: + card: 8px + codeblock: 4px + searchbar: 8px + button: 4px + fontsize: + root: 16px + h1: 1.5rem # 不推荐用在文章中 + h2: 1.5rem + h3: 1.25rem + h4: 1.125rem + h5: 1rem + h6: 1rem + list: .9375rem + meta: .875rem + code: .8125rem + footnote: .78125rem + fontfamily: + logofont: + fontfamily: '"Varela Round", "PingFang SC", "Microsoft YaHei", Helvetica, Arial' + name: 'Varela Round' + url: volantis-static/media/fonts/VarelaRound/VarelaRound-Regular.ttf # https://cdn.jsdelivr.net/gh/volantis-x/cdn-fonts/VarelaRound/VarelaRound-Regular.ttf + weight: normal + style: normal + bodyfont: + fontfamily: 'UbuntuMono, "Varela Round", "PingFang SC", "Microsoft YaHei", Helvetica, Arial' + name: 'UbuntuMono' + url: volantis-static/media/fonts/UbuntuMono/UbuntuMono-Regular.ttf # https://cdn.jsdelivr.net/gh/volantis-x/cdn-fonts/UbuntuMono/UbuntuMono-Regular.ttf + weight: normal + style: normal + codefont: + fontfamily: 'Menlo, UbuntuMono, Monaco' + # name: 'Monaco' + # url: volantis-static/media/fonts/Monaco/Monaco.ttf # https://cdn.jsdelivr.net/gh/volantis-x/cdn-fonts/Monaco/Monaco.ttf + # weight: normal + # style: normal +############################### Custom css ############################### > end + +############################### SEO ############################### > start +seo: + # When there are no keywords in the article's front-matter, use tags as keywords. + use_tags_as_keywords: true + # When there is no description in the article's front-matter, use excerpt as the description. + use_excerpt_as_description: true + robots: + home_first_page: index,follow + home_other_pages: noindex,follow + archive: noindex,follow + category: noindex,follow + tag: noindex,follow + # robots can be written in front-matter +############################### SEO ############################### > end + +############################### Open Graph ############################### > start +# https://ogp.me/ +# https://hexo.io/zh-cn/docs/helpers#open-graph +open_graph: + image: volantis-static/media/org.volantis/blog/favicon/android-chrome-192x192.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/favicon/android-chrome-192x192.png + twitter_card: summary # summary_large_image , summary + #twitter_id: + #twitter_site: +############################### Open Graph ############################### > end + +############################### Structured Data ############################### > start +# SEO 入门文档: https://developers.google.com/search/docs +# https://schema.org.cn/ +# 结构化数据用于更改搜索结果的显示效果 +# 目前内置的结构化数据: blogposting, breadcrumblist, organization, person, website +# 目前内置的富媒体搜索结果: 路径(面包屑导航), 徽标(Logo), 站点链接搜索框(SearchAction) +# https://developers.google.com/search/docs/advanced/structured-data/intro-structured-data +# 富媒体搜索结果测试: https://search.google.com/test/rich-results +structured_data: + enable: true + # 以下是覆盖配置, 默认配置见 scripts/helpers/structured-data/lib/config.js + data: + person: + sns: + - https://github.com/volantis-x + logo: + path: volantis-static/media/org.volantis/blog/favicon/android-chrome-192x192.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/favicon/android-chrome-192x192.png + width: 192 + height: 192 +############################### Structured Data ############################### > end diff --git a/_config.yml b/_config.yml new file mode 100755 index 0000000..50d2e4d --- /dev/null +++ b/_config.yml @@ -0,0 +1,114 @@ +# Hexo Configuration +## Docs: https://hexo.io/docs/configuration.html +## Source: https://github.com/hexojs/hexo/ + +# Site +title: 和和日志🌈 +subtitle: '记录生活' +description: '记录生活的,分享学习的' +keywords: 和和日志 记录生活 +author: hehe +language: zh-CN +timezone: 'Asia/Shanghai' + +# URL +## Set your site url here. For example, if you use GitHub Page, set url as 'https://username.github.io/project' +url: https://blog.yhehe.com +permalink: :title/ +permalink_defaults: +pretty_urls: + trailing_index: true # Set to false to remove trailing 'index.html' from permalinks + trailing_html: true # Set to false to remove trailing '.html' from permalinks + +## Plugins: https://hexo.io/plugins/ +Plugins: + hexo-generator-feed +# 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: + enable: true # Open external links in new tab + field: site # Apply to the whole site + exclude: '' +filename_case: 0 +render_drafts: false +post_asset_folder: false +relative_link: false +future: true +syntax_highlighter: highlight.js +highlight: + line_number: true + auto_detect: false + tab_replace: '' + wrap: true + hljs: false +prismjs: + preprocess: true + line_number: true + tab_replace: '' + +# Home page setting +# path: Root path for your blogs index page. (default = '') +# per_page: Posts displayed per page. (0 = disable pagination) +# order_by: Posts order. (Order by date descending by default) +index_generator: + path: '' + per_page: 10 + order_by: -date + +# Category & Tag +default_category: uncategorized +category_map: +tag_map: + +# Metadata elements +## https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta +meta_generator: true + +# 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 +## updated_option supports 'mtime', 'date', 'empty' +updated_option: 'mtime' + +# Pagination +## Set per_page to 0 to disable pagination +per_page: 10 +pagination_dir: page + +# Include / Exclude file(s) +## include:/exclude: options only apply to the 'source/' folder +include: +exclude: +ignore: + +# Extensions +## Plugins: https://hexo.io/plugins/ +## Themes: https://hexo.io/themes/ +theme: volantis + +# Deployment +## Docs: https://hexo.io/docs/one-command-deployment +deploy: + type: '' +feed: + type: + - atom + - rss2 + path: + - atom.xml + - rss2.xml \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100755 index 0000000..b1194c1 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2708 @@ +{ + "name": "hexo-site", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "hexo-site", + "version": "0.0.0", + "dependencies": { + "hexo": "^7.3.0", + "hexo-blog-encrypt": "^3.1.9", + "hexo-generator-archive": "^2.0.0", + "hexo-generator-category": "^2.0.0", + "hexo-generator-feed": "^3.0.0", + "hexo-generator-index": "^4.0.0", + "hexo-generator-json-content": "^4.2.3", + "hexo-generator-tag": "^2.0.0", + "hexo-renderer-ejs": "^2.0.0", + "hexo-renderer-marked": "^6.3.0", + "hexo-renderer-stylus": "^3.0.1", + "hexo-server": "^3.0.0", + "hexo-theme-landscape": "^1.0.0" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/@adobe/css-tools/-/css-tools-4.3.3.tgz", + "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==", + "license": "MIT" + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", + "license": "MIT" + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "license": "BSD-3-Clause" + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "license": "MIT", + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmmirror.com/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmmirror.com/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", + "license": "MIT" + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmmirror.com/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmmirror.com/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmmirror.com/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmmirror.com/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "license": "MIT" + }, + "node_modules/cuid": { + "version": "2.1.8", + "resolved": "https://registry.npmmirror.com/cuid/-/cuid-2.1.8.tgz", + "integrity": "sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==", + "deprecated": "Cuid and other k-sortable and non-cryptographic ids (Ulid, ObjectId, KSUID, all UUIDs) are all insecure. Use @paralleldrive/cuid2 instead.", + "license": "MIT" + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "deprecated": "Use your platform's native DOMException instead", + "license": "MIT", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dompurify": { + "version": "3.1.7", + "resolved": "https://registry.npmmirror.com/dompurify/-/dompurify-3.1.7.tgz", + "integrity": "sha512-VaTstWtsneJY8xzy7DekmYWEOZcmzIe3Qb3zPd4STve1OBTa+e+WmS1ITQec1fZYXI3HCsOZZiSMpG6oxoWMWQ==", + "license": "(MPL-2.0 OR Apache-2.0)" + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmmirror.com/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fast-equals": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/fast-equals/-/fast-equals-3.0.3.tgz", + "integrity": "sha512-NCe8qxnZFARSHGztGMZOO/PC1qa5MIFB5Hp66WdzbCRAz8U8US3bx1UTgLS49efBQPcUtO9gf5oVEY8o7y/7Kg==", + "license": "MIT" + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hexo": { + "version": "7.3.0", + "resolved": "https://registry.npmmirror.com/hexo/-/hexo-7.3.0.tgz", + "integrity": "sha512-dOe8mzBKrvjubW5oBmyhcnQDpC+M2xmAMLae5K+o+SkHxyvAhShkS2VQZoTsOLIJKY6xilv7dzCjCvE7ol/NHQ==", + "license": "MIT", + "dependencies": { + "abbrev": "^2.0.0", + "archy": "^1.0.0", + "bluebird": "^3.7.2", + "hexo-cli": "^4.3.2", + "hexo-front-matter": "^4.2.1", + "hexo-fs": "^4.1.3", + "hexo-i18n": "^2.0.0", + "hexo-log": "^4.0.1", + "hexo-util": "^3.3.0", + "js-yaml": "^4.1.0", + "js-yaml-js-types": "^1.0.0", + "micromatch": "^4.0.4", + "moize": "^6.1.6", + "moment": "^2.29.1", + "moment-timezone": "^0.5.34", + "nunjucks": "^3.2.3", + "picocolors": "^1.0.0", + "pretty-hrtime": "^1.0.3", + "resolve": "^1.22.0", + "strip-ansi": "^6.0.0", + "text-table": "^0.2.0", + "tildify": "^2.0.0", + "titlecase": "^1.1.3", + "warehouse": "^5.0.1" + }, + "bin": { + "hexo": "bin/hexo" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/hexo" + } + }, + "node_modules/hexo-blog-encrypt": { + "version": "3.1.9", + "resolved": "https://registry.npmmirror.com/hexo-blog-encrypt/-/hexo-blog-encrypt-3.1.9.tgz", + "integrity": "sha512-dzuZiW5mD8t1FOhJXqc+IgV1Tc45YtatJb/w8k4PyT9McQxsROQXsBw+zbDembzuqMnbnkCeT2SapZ/r9AgAcw==", + "license": "MIT" + }, + "node_modules/hexo-cli": { + "version": "4.3.2", + "resolved": "https://registry.npmmirror.com/hexo-cli/-/hexo-cli-4.3.2.tgz", + "integrity": "sha512-druJeBgLpG9ncDS5AhBHdAXk0G4CFj8Qes09pApyZ6bR+nJW1JYiDMuilhudaKDdq+1l49jWXVTidkcb7p0Jbw==", + "license": "MIT", + "dependencies": { + "abbrev": "^2.0.0", + "bluebird": "^3.7.2", + "command-exists": "^1.2.9", + "hexo-fs": "^4.1.1", + "hexo-log": "^4.0.1", + "hexo-util": "^3.3.0", + "minimist": "^1.2.5", + "picocolors": "^1.0.0", + "resolve": "^1.20.0", + "tildify": "^2.0.0" + }, + "bin": { + "hexo": "bin/hexo" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-front-matter": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/hexo-front-matter/-/hexo-front-matter-4.2.1.tgz", + "integrity": "sha512-sJJI0GNmejYiwBvgnGRKn5V3sbODB4dNPr8jyw2Qp0PRHr4Uuyv8iyxw6WfK3+T7yvzYvJOh+tZ7jnwr2BYARA==", + "license": "MIT", + "dependencies": { + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-fs": { + "version": "4.1.3", + "resolved": "https://registry.npmmirror.com/hexo-fs/-/hexo-fs-4.1.3.tgz", + "integrity": "sha512-Q92zQ5PlVDouvSWFLXQoFSTLIUIODikUJs2BfAXQglyOEjN1dOQn1Z5Nimk/7GHof17R5h/uObCQLnZAjzI2tg==", + "license": "MIT", + "dependencies": { + "bluebird": "^3.7.2", + "chokidar": "^3.5.3", + "graceful-fs": "^4.2.10", + "hexo-util": "^3.0.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-generator-archive": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hexo-generator-archive/-/hexo-generator-archive-2.0.0.tgz", + "integrity": "sha512-KikJk7dGFbtNHOgqtLFGf5T/S8n1paGp+Gy0KfVDz+HKYhGbXOouyiZkmc3O9KrYt6ja14rmkMhq7KKGtvfehw==", + "license": "MIT", + "dependencies": { + "hexo-pagination": "3.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-generator-category": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hexo-generator-category/-/hexo-generator-category-2.0.0.tgz", + "integrity": "sha512-9OduRBf3WeRDa4BR0kAfRjOVHur7v3fm0NKAwbjUiqULigAdNZVZPO3cHKW2MlBbl/lI5PuWdhQ9zZ99CCCAgQ==", + "license": "MIT", + "dependencies": { + "hexo-pagination": "3.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-generator-feed": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/hexo-generator-feed/-/hexo-generator-feed-3.0.0.tgz", + "integrity": "sha512-Jo35VSRSNeMitS2JmjCq3OHAXXYU4+JIODujHtubdG/NRj2++b3Tgyz9pwTmROx6Yxr2php/hC8og5AGZHh8UQ==", + "license": "MIT", + "dependencies": { + "hexo-util": "^2.1.0", + "nunjucks": "^3.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hexo-generator-feed/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/hexo-generator-feed/node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/hexo-generator-feed/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/hexo-generator-feed/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/hexo-generator-feed/node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/hexo-generator-feed/node_modules/hexo-util": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/hexo-util/-/hexo-util-2.7.0.tgz", + "integrity": "sha512-hQM3h34nhDg0bSe/Tg1lnpODvNkz7h2u0+lZGzlKL0Oufp+5KCAEUX9wal7/xC7ax3/cwEn8IuoU75kNpZLpJQ==", + "license": "MIT", + "dependencies": { + "bluebird": "^3.5.2", + "camel-case": "^4.0.0", + "cross-spawn": "^7.0.0", + "deepmerge": "^4.2.2", + "highlight.js": "^11.0.1", + "htmlparser2": "^7.0.0", + "prismjs": "^1.17.1", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/hexo-generator-feed/node_modules/htmlparser2": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", + "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.2", + "domutils": "^2.8.0", + "entities": "^3.0.1" + } + }, + "node_modules/hexo-generator-index": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/hexo-generator-index/-/hexo-generator-index-4.0.0.tgz", + "integrity": "sha512-KeM7mOCKWINGFAk1E+CkjMMgqFIv8oaRbGxR7ipkQAp44o4aopkVftma4sdIplOq9WQEWfVYDUK5gEv9J3nzUg==", + "license": "MIT", + "dependencies": { + "hexo-pagination": "3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/hexo-generator-json-content": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/hexo-generator-json-content/-/hexo-generator-json-content-4.2.3.tgz", + "integrity": "sha512-XGqCaTUr6+X8Ty/YvRi+0eh0DJgHcp+lgBhn+Sgyh6ev40P0cwamwJyaZroTdHt8GPoBwbSGVu0H/CdzEf0lFA==", + "license": "MIT", + "dependencies": { + "hexo-util": "latest", + "keyword-extractor": "latest", + "moment": "latest" + } + }, + "node_modules/hexo-generator-tag": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hexo-generator-tag/-/hexo-generator-tag-2.0.0.tgz", + "integrity": "sha512-1px/hF3veEohWDN8jjzchQhaiz+uOStUvvMaBJC9vWOlALh30UFcapL8IrvAwwJZjFRVA+WqGgDRqoQ8+yaaFw==", + "license": "MIT", + "dependencies": { + "hexo-pagination": "3.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-i18n": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hexo-i18n/-/hexo-i18n-2.0.0.tgz", + "integrity": "sha512-dkUXecEtChaQMdTHN4WR13c8GwKqjbSOZPJS9qDqV6Ebnb77Wa/nQzWFckhP0dCps3a9lUQBd8hYGOMbOosiQQ==", + "license": "MIT", + "dependencies": { + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-log": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/hexo-log/-/hexo-log-4.1.0.tgz", + "integrity": "sha512-i2Sgxk8Cgx5viSjq5qW5N/rBFfwoCKQcH8qnnW1fawCapcdEAhIsq+Y3vbrs9bssyDlyU6Vqm4oQmosREaNI7Q==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-pagination": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/hexo-pagination/-/hexo-pagination-3.0.0.tgz", + "integrity": "sha512-8oo1iozloZo7TojPVYg4IxL3SJKCBdSJ908fTlIxIK7TWJIKdYnQlW31+12DBJ0NhVZA/lZisPObGF08wT8fKw==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-renderer-ejs": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hexo-renderer-ejs/-/hexo-renderer-ejs-2.0.0.tgz", + "integrity": "sha512-qCjE1IdwgDgv65qyb0KMVCwCdSVAkH0vwAe9XihjvaKWkmb9dtt8DgErOdqCXn0HReSyWiEVP2BrLRj3gyHwOQ==", + "license": "MIT", + "dependencies": { + "ejs": "^3.1.6" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/hexo-renderer-marked": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/hexo-renderer-marked/-/hexo-renderer-marked-6.3.0.tgz", + "integrity": "sha512-V/ATcJ+tZHkTJSbScPzzHKmrwVMohU8i9MfuX9jp07Un/NpPtaTP821unP3JPu+O1nNLWMi+3xRbFRdm+8vajw==", + "license": "MIT", + "dependencies": { + "dompurify": "^3.0.3", + "hexo-util": "^3.1.0", + "jsdom": "^20.0.1", + "marked": "^4.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-renderer-stylus": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/hexo-renderer-stylus/-/hexo-renderer-stylus-3.0.1.tgz", + "integrity": "sha512-cFm8ZwShBBeFcQwOXc8EK7lIZnSYVD6OJykdL4GBw99hxc4eD5Hlsi32nRzE8sgKv00jhX1s9Da3GVVFMPAVQg==", + "license": "MIT", + "dependencies": { + "nib": "^1.2.0", + "stylus": "^0.62.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hexo-server": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/hexo-server/-/hexo-server-3.0.0.tgz", + "integrity": "sha512-u4s0ty9Aew6jV+a9oMrXBwhrRpUQ0U8PWM/88a5aHgDru58VY81mVrxOFxs788NAsWQ8OvsJtF5m7mnXoRnSIA==", + "license": "MIT", + "dependencies": { + "bluebird": "^3.5.5", + "compression": "^1.7.4", + "connect": "^3.7.0", + "mime": "^3.0.0", + "morgan": "^1.9.1", + "open": "^8.0.9", + "picocolors": "^1.0.0", + "serve-static": "^1.14.1" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/hexo-theme-landscape": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/hexo-theme-landscape/-/hexo-theme-landscape-1.0.0.tgz", + "integrity": "sha512-bWQJWMqQI78wWiJPQZq5pJBH20TM442ShCaHGRetuEgMraxH0OKxB3NTupJzNEkzEk8DV2yrdizkXdKN6i501A==", + "license": "MIT" + }, + "node_modules/hexo-util": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/hexo-util/-/hexo-util-3.3.0.tgz", + "integrity": "sha512-YvGngXijE2muEh5L/VI4Fmjqb+/yAkmY+VuyhWVoRwQu1X7bmWodsfYRXX7CUYhi5LqsvH8FAe/yBW1+f6ZX4Q==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "cross-spawn": "^7.0.3", + "deepmerge": "^4.2.2", + "highlight.js": "^11.6.0", + "htmlparser2": "^9.0.0", + "prismjs": "^1.29.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/highlight.js": { + "version": "11.10.0", + "resolved": "https://registry.npmmirror.com/highlight.js/-/highlight.js-11.10.0.tgz", + "integrity": "sha512-SYVnVFswQER+zu1laSya563s+F8VDGt7o35d4utbamowvUNLLMovFqwCLSocpZTz3MgaSRA1IbqRWZv97dtErQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/htmlparser2": { + "version": "9.1.0", + "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "license": "MIT" + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmmirror.com/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/js-yaml-js-types": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/js-yaml-js-types/-/js-yaml-js-types-1.0.1.tgz", + "integrity": "sha512-5tpfyORs8OQ43alNERbWfYRCtWgykvzYgY46fUhrQi2+kS7N0NuuFYLZ/IrfmVm5muLTndeMublgraXiFRjEPw==", + "license": "MIT", + "dependencies": { + "esprima": "^4.0.1" + }, + "peerDependencies": { + "js-yaml": "4.x" + } + }, + "node_modules/jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmmirror.com/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/keyword-extractor": { + "version": "0.0.28", + "resolved": "https://registry.npmmirror.com/keyword-extractor/-/keyword-extractor-0.0.28.tgz", + "integrity": "sha512-oi7dSPpYtW/3fE0vZiqQgZ8mW3F1V9K4+rBJ0FcVrdXBEQuhZ0zKj7sX74eqGASuepLHf9aYdeonyKHWhYpHQA==", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/micro-memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/micro-memoize/-/micro-memoize-4.1.2.tgz", + "integrity": "sha512-+HzcV2H+rbSJzApgkj0NdTakkC+bnyeiUxgT6/m7mjcz1CmM22KYFKp+EVj1sWe4UYcnriJr5uqHQD/gMHLD+g==", + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.53.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.53.0.tgz", + "integrity": "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/moize": { + "version": "6.1.6", + "resolved": "https://registry.npmmirror.com/moize/-/moize-6.1.6.tgz", + "integrity": "sha512-vSKdIUO61iCmTqhdoIDrqyrtp87nWZUmBPniNjO0fX49wEYmyDO4lvlnFXiGcaH1JLE/s/9HbiK4LSHsbiUY6Q==", + "license": "MIT", + "dependencies": { + "fast-equals": "^3.0.1", + "micro-memoize": "^4.1.2" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.46", + "resolved": "https://registry.npmmirror.com/moment-timezone/-/moment-timezone-0.5.46.tgz", + "integrity": "sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==", + "license": "MIT", + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmmirror.com/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "license": "MIT", + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nib": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/nib/-/nib-1.2.0.tgz", + "integrity": "sha512-7HgrnMl/3yOmWykueO8/D0q+0iWwe7Z+CK2Eaq/xQV8w1hK80WN1oReRQkfkrztbAAnp/nTHkUSl5EcVkor6JQ==", + "license": "MIT", + "engines": { + "node": "*" + }, + "peerDependencies": { + "stylus": "*" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nunjucks": { + "version": "3.2.4", + "resolved": "https://registry.npmmirror.com/nunjucks/-/nunjucks-3.2.4.tgz", + "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", + "license": "BSD-2-Clause", + "dependencies": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + }, + "bin": { + "nunjucks-precompile": "bin/precompile" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "chokidar": "^3.3.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/nwsapi": { + "version": "2.2.13", + "resolved": "https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.13.tgz", + "integrity": "sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmmirror.com/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmmirror.com/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "license": "MIT", + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "license": "ISC" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmmirror.com/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "license": "BSD-3-Clause" + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylus": { + "version": "0.62.0", + "resolved": "https://registry.npmmirror.com/stylus/-/stylus-0.62.0.tgz", + "integrity": "sha512-v3YCf31atbwJQIMtPNX8hcQ+okD4NQaTuKGUWfII8eaqn+3otrbttGL1zSMZAAtiPsBztQnujVBugg/cXFUpyg==", + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "~4.3.1", + "debug": "^4.3.2", + "glob": "^7.1.6", + "sax": "~1.3.0", + "source-map": "^0.7.3" + }, + "bin": { + "stylus": "bin/stylus" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://opencollective.com/stylus" + } + }, + "node_modules/stylus/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/stylus/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/stylus/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "license": "MIT" + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "license": "MIT" + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "license": "MIT", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/tildify": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/tildify/-/tildify-2.0.0.tgz", + "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/titlecase": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/titlecase/-/titlecase-1.1.3.tgz", + "integrity": "sha512-pQX4oiemzjBEELPqgK4WE+q0yhAqjp/yzusGtlSJsOuiDys0RQxggepYmo0BuegIDppYS3b3cpdegRwkpyN3hw==", + "license": "MIT", + "bin": { + "to-title-case": "bin.js" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/tslib": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmmirror.com/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "license": "MIT", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/warehouse": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/warehouse/-/warehouse-5.0.1.tgz", + "integrity": "sha512-5BQEQP56bPY+cqocTho4syazuGgSoyKd0y3PsS2j8tGN10HH+CEfJSIY+KUw9D0k4jaVEFMXLz0KqCiUzTYb8A==", + "license": "MIT", + "dependencies": { + "bluebird": "^3.7.2", + "cuid": "^2.1.8", + "graceful-fs": "^4.2.10", + "hexo-log": "^4.0.1", + "is-plain-object": "^5.0.0", + "jsonparse": "^1.3.1", + "rfdc": "^1.3.0", + "through2": "^4.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmmirror.com/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100755 index 0000000..548d828 --- /dev/null +++ b/package.json @@ -0,0 +1,29 @@ +{ + "name": "hexo-site", + "version": "0.0.0", + "private": true, + "scripts": { + "build": "hexo generate", + "clean": "hexo clean", + "deploy": "hexo deploy", + "server": "hexo server" + }, + "hexo": { + "version": "7.3.0" + }, + "dependencies": { + "hexo": "^7.3.0", + "hexo-blog-encrypt": "^3.1.9", + "hexo-generator-archive": "^2.0.0", + "hexo-generator-category": "^2.0.0", + "hexo-generator-feed": "^3.0.0", + "hexo-generator-index": "^4.0.0", + "hexo-generator-json-content": "^4.2.3", + "hexo-generator-tag": "^2.0.0", + "hexo-renderer-ejs": "^2.0.0", + "hexo-renderer-marked": "^6.3.0", + "hexo-renderer-stylus": "^3.0.1", + "hexo-server": "^3.0.0", + "hexo-theme-landscape": "^1.0.0" + } +} diff --git a/scaffolds/draft.md b/scaffolds/draft.md new file mode 100755 index 0000000..fc8ef29 --- /dev/null +++ b/scaffolds/draft.md @@ -0,0 +1,4 @@ +--- +title: {{ title }} +tags: +--- diff --git a/scaffolds/page.md b/scaffolds/page.md new file mode 100755 index 0000000..bcb7182 --- /dev/null +++ b/scaffolds/page.md @@ -0,0 +1,16 @@ +--- +title: {{ title }} #【必需】页面标题 +date: {{ date }} #【必需】页面创建日期 +type: #【必需】标签、分类、关于、音乐馆、友情链接、相册、相册详情、朋友圈、即刻页面需要配置 +updated: #【可选】页面更新日期 +comments: #【可选】显示页面评论模块(默认 true) +description: #【可选】页面描述 +keywords: #【可选】页面关键字 +top_img: https://img.090227.xyz/file/ae62475a131f3734a201c.png #【可选】页面顶部图片 +mathjax: #【可选】显示 mathjax(当设置 mathjax 的 per_page: false 时,才需要配置,默认 false) +katex: #【可选】显示 katex(当设置 katex 的 per_page: false 时,才需要配置,默认 false) +aside: #【可选】显示侧边栏 (默认 true) +aplayer: #【可选】在需要的页面加载 aplayer 的 js 和 css,请参考文章下面的音乐 配置 +highlight_shrink: #【可选】配置代码框是否展开(true/false)(默认为设置中 highlight_shrink 的配置) +top_single_background: #【可选】部分页面的顶部模块背景图片 +--- diff --git a/scaffolds/post.md b/scaffolds/post.md new file mode 100755 index 0000000..d1cd9dc --- /dev/null +++ b/scaffolds/post.md @@ -0,0 +1,50 @@ +--- +title: {{ title }} #【必需】页面标题 +date: {{ date }} #【必需】页面创建日期 +updated: #【可选】页面更新日期 +tags: #【可选】文章标签 +categories: #【可选】文章分类 +keywords: #【可选】文章关键字 +description: #【可选】文章描述 +top: # 1 置顶 +top_img: #【可选】文章顶部图片 +comments: #【可选】显示文章评论模块(默认 true) +cover: https://img.090227.xyz/file/ae62475a131f3734a201c.png #【可选】文章缩略图(如果没有设置 top_img,文章页顶部将显示缩略图,可设为 false/图片地址/留空) +toc: #【可选】显示文章 TOC(默认为设置中 toc 的 enable 配置) +toc_number: #【可选】显示 toc_number(默认为设置中 toc 的 number 配置) +toc_style_simple: #【可选】显示 toc 简洁模式 +copyright: #【可选】显示文章版权模块(默认为设置中 post_copyright 的 enable 配置) +copyright_author: #【可选】文章版权模块的文章作者 +copyright_author_href: #【可选】文章版权模块的文章作者链接 +copyright_url: #【可选】文章版权模块的文章作者链接 +copyright_info: #【可选】文章版权模块的版权声明文字 +mathjax: #【可选】显示 mathjax(当设置 mathjax 的 per_page: false 时,才需要配置,默认 false) +katex: #【可选】显示 katex(当设置 katex 的 per_page: false 时,才需要配置,默认 false) +aplayer: #【可选】在需要的页面加载 aplayer 的 js 和 css,请参考文章下面的音乐 配置 +highlight_shrink: #【可选】配置代码框是否展开(true/false)(默认为设置中 highlight_shrink 的配置) +aside: #【可选】显示侧边栏 (默认 true) +swiper_index: 10 #【可选】首页轮播图配置 index 索引,数字越小越靠前 +top_group_index: 10 #【可选】首页右侧卡片组配置, 数字越小越靠前 +ai: #【可选】文章ai摘要 +background: "#fff" #【可选】文章主色,必须是16进制颜色且有6位,不可缩减,例如#ffffff 不可写成#fff +--- + +
+[up主专用,视频内嵌代码贴在这] +
+ + diff --git a/source/404.md b/source/404.md new file mode 100755 index 0000000..14440d3 --- /dev/null +++ b/source/404.md @@ -0,0 +1,15 @@ +--- +cover: true +robots: noindex,nofollow +sitemap: false +seo_title: 404 Not Found +bottom_meta: false +sidebar: [] +twikoo: + path: /404.html + placeholder: 请留言告诉我您要访问哪个页面找不到了🎈 +--- + +{% p logo center huge, 404 %} +{% p center bold, 很抱歉,您访问的页面不存在 %} +{% p center small, 可能是输入地址有误或该地址已被删除 %} diff --git a/source/_data/author.yml b/source/_data/author.yml new file mode 100755 index 0000000..c5aca99 --- /dev/null +++ b/source/_data/author.yml @@ -0,0 +1,60 @@ +xaoxuu: + name: Mr. X + avatar: https://cdn.jsdelivr.net/gh/xaoxuu/cdn-assets/avatar/avatar.png + url: https://xaoxuu.com +inkss: + name: 枋柚梓 + avatar: https://cdn.jsdelivr.net/gh/inkss/common@1.4.2/hexo/img/static/avatar.jpg + url: https://inkss.cn +Heson: + name: Heson + avatar: https://cdn.jsdelivr.net/gh/heson525/pic@master/pic/avatar03.png + url: https://www.heson10.com +Colsrch: + name: Colsrch + avatar: https://cdn.jsdelivr.net/gh/Colsrch/images/Colsrch/avatar.jpg + url: https://colsrch.cn +W4J1e: + name: W4J1e + avatar: https://cdn.jsdelivr.net/gh/w4j1e/blog@master/img/dl2.png + url: https://www.hin.cool +luosw: + name: luosw + avatar: https://fastly.jsdelivr.net/npm/mhgoos@0.0.1655515813077/file_10.jpg #https://s3.ax1x.com/2021/02/05/y8IdeK.jpg + url: https://luosw.fun +GOOPHER: + name: GOOPHER + avatar: https://cdn.jsdelivr.net/gh/Goopher97/tuchuang@master/img/18DAD281896408F73F4EF594111BECA2.jpg + url: https://goopher.tk +Nanami: + name: 七海 + avatar: https://cdn.jsdelivr.net/gh/45921/cdn-images@main/me/avatar.jpg + url: htps://shiraha.cn +kelecn: + name: kelecn + avatar: https://cdn.jsdelivr.net/gh/kelecn/images@master/%E6%82%9F%E7%A9%BA.jpg + url: https://kelecn.top/ +DearXuan: + name: DearXuan + avatar: https://cdn.jsdelivr.net/gh/dearxuanres/res/image/info/logo.png + url: https://www.dearxuan.top +Langwenchong: + name: Langwenchong + avatar: https://pic.imgdb.cn/item/60969280d1a9ae528f4f0270.jpg + url: https://coolchong.cn +cysn: + name: 懵懂的初一少年 + avatar: https://avatars.githubusercontent.com/u/92655031?v=4 + url: https://www.yt-blog.top +MengFanjun: + name: MengFanjun + avatar: https://beta.glilmu.com/i/2022/12/05/1xv9ka.png + url: https://mengfanjun020906.github.io/ +wyblog: + name: 无影 + avatar: https://www.wyblog1.tk/media/images/custom-headerLogo.ico + url: https://blog.wyblog1.tk +qdovo: + name: 前端ovo + avatar: https://cdn.qdovo.com/img/timg.jpeg + url: https://www.qdovo.com diff --git a/source/_data/cdn.yml b/source/_data/cdn.yml new file mode 100755 index 0000000..d2fd94c --- /dev/null +++ b/source/_data/cdn.yml @@ -0,0 +1,7 @@ +fontawesome: + name: "@fortawesome/fontawesome-pro" + file: css/all.min.css + version: 6.1.1 + npm: false + static: true + cdnjs: false diff --git a/source/_data/friends.yml b/source/_data/friends.yml new file mode 100755 index 0000000..02e725f --- /dev/null +++ b/source/_data/friends.yml @@ -0,0 +1,63 @@ +- group: 都是我的好朋友 # 分组标题 + description: # 分组描述 + items: + - title: 和和日志 + url: https://yhehe.com/ + avatar: https://photo.yhehe.com/tp/wk.webp + screenshot: # 截图 + keywords: # 杜老师说 + description: 记录生活,点点滴滴! + - title: 杜老师说 + url: https://dusays.com/ + avatar: https://cdn.dusays.com/avatar.png + screenshot: # 截图 + keywords: # 杜老师说 + description: 师者,传道,授业,解惑! + - title: obaby + url: https://h4ck.org.cn/ + avatar: https://h4ck.org.cn/wp-content/uploads/avatars/1/1679798626-bpfull.png + screenshot: # 截图 + keywords: # 杜老师说 + description: Girl&Blog + - title: 云心怀鹤 + url: https://bluehe.cn/ + avatar: https://bluehe.cn/usr/uploads/2022/09/3376344061.jpg + screenshot: # 截图 + keywords: # 杜老师说 + description: 风光摄影者,文艺叙述人 + - title: 灰常记忆 + url: https://bestcherish.com/ + avatar: https://static.bestcherish.com/imgs/2023/10/23a18bfa8cf53842.webp + screenshot: # 截图 + keywords: # 杜老师说 + description: 记录生活 珍藏回忆 + - title: Dabenshi + url: https://dabenshi.cn/ + avatar: https://dabenshi.cn/uploads/logo.png + screenshot: # 截图 + keywords: # 杜老师说 + description: 蓝紫色的花朵铺天盖地,恰似宿命中为爱奋不顾身的燕尾蝶 + - title: 网友小宋 + url: https://xyzbz.cn/ + avatar: https://bu.dusays.com/2023/07/25/64bf920527086.png + screenshot: # 截图 + keywords: # 杜老师说 + description: 一介草民,只为生活! + - title: 梦不见的梦 + url: https://www.friendcc.com/ + avatar: https://www.friendcc.com/touxiang.jpg + screenshot: # 截图 + keywords: # 杜老师说 + description: 被嘲笑的梦想才有实现的价值 + - title: 姜先森 + url: https://jiangjizhong.com/ + avatar: https://cravatar.cn/avatar/9d6bcfbd7c557c412c982b1a44700f06?s=55&r=G + screenshot: # 截图 + keywords: # 杜老师说 + description: 开心就笑,不开心待会笑 + - title: Niuren.VIP + url: https://niuren.vip/ + avatar: https://vip.123pan.cn/1825601452/%E7%9B%B4%E8%BF%9E%E7%A9%BA%E9%97%B4/20240607154007.jpg + screenshot: # 截图 + keywords: # 杜老师说 + description: 对牛弹琴,弹,弹,弹! diff --git a/source/_data/notification.yml b/source/_data/notification.yml new file mode 100755 index 0000000..69ab6a4 --- /dev/null +++ b/source/_data/notification.yml @@ -0,0 +1,11 @@ +# 这个功能还在测试中 +oldversion: + title: 过期的文档 + message: 这份文档过于久远,如果您使用的是新版的主题,请查看新版本的文档。 + position: bottom # bottom (底部通知), right (右侧通知,会自动消失) + theme: warning # default, warning + cache: false # 是否记住选项(下次不再弹出) + buttons: + - title: 查看新版文档 + url: /getting-started/ + dismiss: false # 点击了是否关闭底部横幅 diff --git a/source/_data/sites.yml b/source/_data/sites.yml new file mode 100755 index 0000000..1bc8481 --- /dev/null +++ b/source/_data/sites.yml @@ -0,0 +1,29 @@ +community_team: + title: + description: + items: + - title: xaoxuu + url: https://xaoxuu.com + screenshot: https://fastly.jsdelivr.net/npm/mhgoos@0.0.1655516660514/VuSwWZ1xAeUHEBC.jpg + avatar: https://cdn.jsdelivr.net/gh/xaoxuu/cdn-assets/avatar/avatar.png + description: 开发者 + - title: MHuiG + url: https://blog.mhuig.top + screenshot: https://fastly.jsdelivr.net/npm/mhgoos@0.0.1655516784786/d24zpPlhLYWX6D1.png + avatar: https://cdn.jsdelivr.net/npm/mhg@latest + description: 划水 + +test_demo: + title: + description: + items: + - title: xixi.org + url: https://volantis-x.js.org/ + screenshot: https://fastly.jsdelivr.net/npm/mhgoos@0.0.1655516891879/YQ2nhcvyCuFsm3g.png + avatar: https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/favicon/apple-touch-icon.png + description: Test Site For Development + +examples: + title: + description: + api: https://api.vlts.cc/output_data/v2/volantis-x/examples \ No newline at end of file diff --git a/source/_posts/01-AB Download Manager 下载神器.md b/source/_posts/01-AB Download Manager 下载神器.md new file mode 100755 index 0000000..c3d17be --- /dev/null +++ b/source/_posts/01-AB Download Manager 下载神器.md @@ -0,0 +1,45 @@ +--- +title: AB Download Manager 下载神器!完全免费开源,可以完全替代IDM +date: 2024-11-29 +categories: 学习笔记 +headimg: https://yhehe.com/images/AB Download Manager.webp #博客封面图 +description: 下载从未这么简单,通过与浏览器的无缝集成从任何地方轻松下载文件,享受快速、免费的下载体验~ +tags: +- 软件 +--- + +下载从未这么简单 +通过与浏览器的无缝集成从任何地方轻松下载文件,享受快速、免费的下载体验 +![](https://yhehe.com/images/ab.webp) + + +### 下载方式: +{% btn center large::Github下载::https://github.com/amir1376/ab-download-manager %} + + +### 特性 +1、现代化的简洁界面 +简洁的界面,且支持深色模式 + +2、更快的下载速度 +支持多线程下载文件,下载速度最高提升500%! +3、下载队列 + +创建和管理队列中的下载,允许按顺序下载所有文件 +4、下载计划 + +您可以为队列设置下载计划以自动开始或停止下载 +5、速度限制 + +您可以设置下载速度限制,以防止其他人遇到连接不良的情况 +6、浏览器集成 + +您可以安装浏览器扩展程序以自动接管网络浏览器中的链接 +7、跨平台支持 + +该软件目前可用于 Windows 和 Linux,其他平台也即将推出! +8、开源 & 免费 + + +这是一个完全开源免费的软件@ +![](https://blog.yhehe.com/images/ab1.webp) diff --git a/source/_posts/2023年最后一夜.md b/source/_posts/2023年最后一夜.md new file mode 100755 index 0000000..1a9f502 --- /dev/null +++ b/source/_posts/2023年最后一夜.md @@ -0,0 +1,26 @@ +--- +title: 2023年最后一夜 +date: 2023-12-31 00:38:00 +categories: 记录生活 +headimg: https://bu.dusays.com/2024/02/13/65cadabf8535e.jpeg +description: 去和朋友吃饭的路上,没想到这么多人,很热闹,心情很好 +tags: +- 跨年 +- 节日 +--- +>去和朋友吃饭的路上,没想到这么多人,很热闹,心情很好... + + + +![请输入图片描述][1] +![请输入图片描述][2] +![请输入图片描述][3] +![请输入图片描述][4] + + [1]: https://bu.dusays.com/2024/02/13/65cadac0ceb90.jpeg + [2]: https://bu.dusays.com/2024/02/13/65cadac0238b5.jpeg + [3]: https://bu.dusays.com/2024/02/13/65cadac014262.jpeg + [4]: https://bu.dusays.com/2024/02/13/65cadabf8535e.jpeg + + +{% video https://yhehe.com/usr/uploads/2024/01/2028700495.mp4 %} \ No newline at end of file diff --git a/source/_posts/2023年盗版美剧下载排行,第一名毫不意外.md b/source/_posts/2023年盗版美剧下载排行,第一名毫不意外.md new file mode 100755 index 0000000..dd25060 --- /dev/null +++ b/source/_posts/2023年盗版美剧下载排行,第一名毫不意外.md @@ -0,0 +1,80 @@ +--- +title: 2023年盗版美剧下载排行,第一名毫不意外 +date: 2024-01-07 03:38:00 +categories: 记录生活 +headimg: https://yhehe.com/images/2041963392.jpeg +description: TorrentFreak公布了2023年「盗版次数下载最多」的美剧。往年基本都是被《西部世界》和《行尸走肉》霸榜,但这一次随着《西部世界》被砍、《行尸走肉》的完结,情况已经有所不同。盗版下载次数最多的剧集,被HBO的《最后生还者》拿下了,真的是毫无意外...毕竟这部剧自开播以来就火的一塌糊涂,目前豆瓣9.0分,IMDb上47W人评价的8.8分。 +tags: +- 影视 +--- +>TorrentFreak公布了2023年「盗版次数下载最多」的美剧。往年基本都是被《西部世界》和《行尸走肉》霸榜,但这一次随着《西部世界》被砍、《行尸走肉》的完结,情况已经有所不同。盗版下载次数最多的剧集,被HBO的《最后生还者》拿下了,真的是毫无意外...毕竟这部剧自开播以来就火的一塌糊涂,目前豆瓣9.0分,IMDb上47W人评价的8.8分 + +---------- + +### 1、《最后生还者》The Last of Us +![](https://yhehe.com/images/2095612369.png) + + +---------- + + +### 2、《曼达洛人》The Mandalorian +![](https://yhehe.com/images/4190591040.png) + + +---------- + + +### 3、《洛基》?Loki +![](https://yhehe.com/images/2130435262.webp) + + +---------- + + +### 4、《阿索卡》Ahsoka +![](https://yhehe.com/images/2865371149.jpeg) + + +---------- + + +### 5、《秘密入侵》Secret Invasion +![](https://yhehe.com/images/3516593133.jpeg) + + +---------- + + +### 6、《羊毛战记》Silo +![](https://yhehe.com/images/1985877959.jpeg) + + +---------- + + +### 7、《帝王计划:怪兽遗产》Monarch: Legacy of Monsters +![](https://yhehe.com/images/3944962017.webp) + + +---------- + + +### 8、《塔尔萨之王》Tulsa King +![](https://yhehe.com/images/924810267.webp) + + +---------- + + +### 9、《V世代》Gen V +![](https://yhehe.com/images/2041963392.jpeg) + + +---------- + + +### 最后一个是《足球教练》。 +![](https://yhehe.com/images/1470542986.jpeg) +这部剧可能很多剧迷都没有听说过,虽然国内看得人不多,但外网超火,IMDb 三十多人万人评价的 8.8分。 +这是一部不懂踢球,但依然会觉得很有意思的一部喜剧。主要讲述的是没有任何英式足球经验的男主,却被英超足球队邀请去执教的故事。别问为啥,邀请者就希望他来搞砸一切...非常非常欢乐、有趣。当然,本剧不只是有鸡飞狗跳的沙雕故事,还有人性的温暖和启示,相当值得一看。 \ No newline at end of file diff --git a/source/_posts/2024年任务。。。。。内容添加中.md b/source/_posts/2024年任务。。。。。内容添加中.md new file mode 100755 index 0000000..d6025bd --- /dev/null +++ b/source/_posts/2024年任务。。。。。内容添加中.md @@ -0,0 +1,19 @@ +--- +title: 2024年任务。。。。。内容添加中 +date: 2024-02-25 12:35:00 +categories: 记录生活 +password: xiangfei +headimg: https://yhehe.com/images/4274251910.png +tags: +- 任务 +--- + + +认真做事,好好生活。 + + +{% checkbox green checked::换笔记本 %} +{% checkbox yellow checked::换手机 %} +{% checkbox cyan checked::房子能好 %} +{% checkbox times red checked::配置一个NAS %} + diff --git a/source/_posts/600条最强 Linux 命令总结.md b/source/_posts/600条最强 Linux 命令总结.md new file mode 100755 index 0000000..e90c280 --- /dev/null +++ b/source/_posts/600条最强 Linux 命令总结.md @@ -0,0 +1,587 @@ +--- +title: 600条最强 Linux 命令总结 +date: 2024-03-22 01:43:00 +categories: 学习笔记 +headimg: https://yhehe.com/images/1077270914.jpg #博客封面图 +description: 既然现在用的Linux主机,那是不是应该学习一下基本命令呢,这是篇 Linux 命令总结的非常全的文章,命令有点多,慢慢学习。 +tags: + - 命令 + - linux +--- + +既然现在用的Linux主机,那是不是应该学习一下基本命令呢,这是篇 Linux 命令总结的非常全的文章,命令有点多,慢慢学习。 +### 1.基本命令 +> uname -m 显示机器的处理器架构 +uname -r 显示正在使用的内核版本 +dmidecode -q 显示硬件系统部件 +(SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 +hdparm -tT /dev/sda 在磁盘上执行测试性读取操作系统信息 +arch 显示机器的处理器架构 +uname -m 显示机器的处理器架构 +uname -r 显示正在使用的内核版本 +dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) +hdparm -i /dev/hda 罗列一个磁盘的架构特性 +hdparm -tT /dev/sda 在磁盘上执行测试性读取操作 +cat /proc/cpuinfo 显示CPU info的信息 +cat /proc/interrupts 显示中断 +cat /proc/meminfo 校验内存使用 +cat /proc/swaps 显示哪些swap被使用 +cat /proc/version 显示内核的版本 +cat /proc/net/dev 显示网络适配器及统计 +cat /proc/mounts 显示已加载的文件系统 +lspci -tv 罗列 PCI 设备 +lsusb -tv 显示 USB 设备 +date 显示系统日期 +cal 2007 显示2007年的日历表 +date 041217002007.00 设置日期和时间 - 月日时分年.秒 +clock -w 将时间修改保存到 BIOS +### 2.关机 +> shutdown -h now 关闭系统(1) +init 0 关闭系统(2) +telinit 0 关闭系统(3) +shutdown -h hours:minutes & 按预定时间关闭系统 +shutdown -c 取消按预定时间关闭系统 +shutdown -r now 重启(1) +reboot 重启(2) +logout 注销 +### 3.文件和目录 +> cd /home 进入 '/ home' 目录' +cd .. 返回上一级目录 +cd ../.. 返回上两级目录 +cd 进入个人的主目录 +cd ~user1 进入个人的主目录 +cd - 返回上次所在的目录 +pwd 显示工作路径 +ls 查看目录中的文件 +ls -F 查看目录中的文件 +ls -l 显示文件和目录的详细资料 +ls -a 显示隐藏文件 +ls *[0-9]* 显示包含数字的文件名和目录名 +tree 显示文件和目录由根目录开始的树形结构(1) +lstree 显示文件和目录由根目录开始的树形结构(2) +mkdir dir1 创建一个叫做 'dir1' 的目录' +mkdir dir1 dir2 同时创建两个目录 +mkdir -p /tmp/dir1/dir2 创建一个目录树 +rm -f file1 删除一个叫做 'file1' 的文件' +rmdir dir1 删除一个叫做 'dir1' 的目录' +rm -rf dir1 删除一个叫做 'dir1' 的目录并同时删除其内容 +rm -rf dir1 dir2 同时删除两个目录及它们的内容 +mv dir1 new_dir 重命名/移动 一个目录 +cp file1 file2 复制一个文件 +cp dir/* . 复制一个目录下的所有文件到当前工作目录 +cp -a /tmp/dir1 . 复制一个目录到当前工作目录 +cp -a dir1 dir2 复制一个目录 +ln -s file1 lnk1 创建一个指向文件或目录的软链接 +ln file1 lnk1 创建一个指向文件或目录的物理链接 +touch -t 0712250000 file1 修改一个文件或目录的时间戳 - (YYMMDDhhmm) +file file1 outputs the mime type of the file as text +iconv -l 列出已知的编码 +iconv -f fromEncoding -t toEncoding inputFile > outputFile creates a new from the given input file by assuming it is encoded in fromEncoding and converting it to toEncoding. +find . -maxdepth 1 -name *.jpg -print -exec convert "{}" -resize 80x60 "thumbs/{}" \; batch resize files in the current directory and send them to a thumbnails directory (requires convert from Imagemagick) +### 4.文件搜索 +> find / -name file1 从 '/' 开始进入根文件系统搜索文件和目录 +find / -user user1 搜索属于用户 'user1' 的文件和目录 +find /home/user1 -name \*.bin 在目录 '/ home/user1' 中搜索带有'.bin' 结尾的文件 +find /usr/bin -type f -atime +100 搜索在过去100天内未被使用过的执行文件 +find /usr/bin -type f -mtime -10 搜索在10天内被创建或者修改过的文件 +find / -name \*.rpm -exec chmod 755 '{}' \; 搜索以 '.rpm' 结尾的文件并定义其权限 +find / -xdev -name \*.rpm 搜索以 '.rpm' 结尾的文件,忽略光驱、捷盘等可移动设备 +locate \*.ps 寻找以 '.ps' 结尾的文件 - 先运行 'updatedb' 命令 +whereis halt 显示一个二进制文件、源码或man的位置 +which halt 显示一个二进制文件或可执行文件的完整路径 +### 5.挂载一个文件系统 +> mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘 - 确定目录 '/ mnt/hda2' 已经存在 +umount /dev/hda2 卸载一个叫做hda2的盘 - 先从挂载点 '/ mnt/hda2' 退出 +fuser -km /mnt/hda2 当设备繁忙时强制卸载 +umount -n /mnt/hda2 运行卸载操作而不写入 /etc/mtab 文件- 当文件为只读或当磁盘写满时非常有用 +mount /dev/fd0 /mnt/floppy 挂载一个软盘 +mount /dev/cdrom /mnt/cdrom 挂载一个cdrom或dvdrom +mount /dev/hdc /mnt/cdrecorder 挂载一个cdrw或dvdrom +mount /dev/hdb /mnt/cdrecorder 挂载一个cdrw或dvdrom +mount -o loop file.iso /mnt/cdrom 挂载一个文件或ISO镜像文件 +mount -t vfat /dev/hda5 /mnt/hda5 挂载一个Windows FAT32文件系统 +mount /dev/sda1 /mnt/usbdisk 挂载一个usb 捷盘或闪存设备 +mount -t smbfs -o username=user,password=pass //WinClient/share /mnt/share 挂载一个windows网络共享 +### 6.磁盘空间 +> df -h 显示已经挂载的分区列表 +ls -lSr |more 以尺寸大小排列文件和目录 +du -sh dir1 估算目录 'dir1' 已经使用的磁盘空间' +du -sk * | sort -rn 以容量大小为依据依次显示文件和目录的大小 +rpm -q -a --qf '%10{SIZE}t%{NAME}n' | sort -k1,1n 以大小为依据依次显示已安装的rpm包所使用的空间 (fedora, redhat类系统) +dpkg-query -W -f='${Installed-Size;10}t${Package}n' | sort -k1,1n 以大小为依据显示已安装的deb包所使用的空间 (ubuntu, debian类系统) +### 7.用户和群组 +> groupadd group_name 创建一个新用户组 +groupdel group_name 删除一个用户组 +groupmod -n new_group_name old_group_name 重命名一个用户组 +useradd -c "Name Surname " -g admin -d /home/user1 -s /bin/bash user1 创建一个属于 "admin" 用户组的用户 +useradd user1 创建一个新用户 +userdel -r user1 删除一个用户 ( '-r' 排除主目录) +usermod -c "User FTP" -g system -d /ftp/user1 -s /bin/nologin user1 修改用户属性 +passwd 修改口令 +passwd user1 修改一个用户的口令 (只允许root执行) +chage -E 2005-12-31 user1 设置用户口令的失效期限 +pwck 检查 '/etc/passwd' 的文件格式和语法修正以及存在的用户 +grpck 检查 '/etc/passwd' 的文件格式和语法修正以及存在的群组 +newgrp group_name 登陆进一个新的群组以改变新创建文件的预设群组 +### 8.文件的权限 使用 “+” 设置权限,使用 “-” 用于取消 +> ls -lh 显示权限 +ls /tmp | pr -T5 -W$COLUMNS 将终端划分成5栏显示 +chmod ugo+rwx directory1 设置目录的所有人(u)、群组(g)以及其他人(o)以读(r )、写(w)和执行(x)的权限 +chmod go-rwx directory1 删除群组(g)与其他人(o)对目录的读写执行权限 +chown user1 file1 改变一个文件的所有人属性 +chown -R user1 directory1 改变一个目录的所有人属性并同时改变改目录下所有文件的属性 +chgrp group1 file1 改变文件的群组 +chown user1:group1 file1 改变一个文件的所有人和群组属性 +find / -perm -u+s 罗列一个系统中所有使用了SUID控制的文件 +chmod u+s /bin/file1 设置一个二进制文件的 SUID 位 - 运行该文件的用户也被赋予和所有者同样的权限 +chmod u-s /bin/file1 禁用一个二进制文件的 SUID位 +chmod g+s /home/public 设置一个目录的SGID 位 - 类似SUID ,不过这是针对目录的 +chmod g-s /home/public 禁用一个目录的 SGID 位 +chmod o+t /home/public 设置一个文件的 STIKY 位 - 只允许合法所有人删除文件 +chmod o-t /home/public 禁用一个目录的 STIKY 位 +chmod +x 文件路径 为所有者、所属组和其他用户添加执行的权限 +chmod -x 文件路径 为所有者、所属组和其他用户删除执行的权限 +chmod u+x 文件路径 为所有者添加执行的权限 +chmod g+x 文件路径 为所属组添加执行的权限 +chmod o+x 文件路径 为其他用户添加执行的权限 +chmod ug+x 文件路径 为所有者、所属组添加执行的权限 +chmod =wx 文件路径 为所有者、所属组和其他用户添加写、执行的权限,取消读权限 +chmod ug=wx 文件路径 为所有者、所属组添加写、执行的权限,取消读权限 +### 9.文件的特殊属性 ,使用 “+” 设置权限,使用 “-” 用于取消 +> chattr +a file1 只允许以追加方式读写文件 +chattr +c file1 允许这个文件能被内核自动压缩/解压 +chattr +d file1 在进行文件系统备份时,dump程序将忽略这个文件 +chattr +i file1 设置成不可变的文件,不能被删除、修改、重命名或者链接 +chattr +s file1 允许一个文件被安全地删除 +chattr +S file1 一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘 +chattr +u file1 若文件被删除,系统会允许你在以后恢复这个被删除的文件 +lsattr 显示特殊的属性 +### 10.打包和压缩文件 +> bunzip2 file1.bz2 解压一个叫做 'file1.bz2'的文件 +bzip2 file1 压缩一个叫做 'file1' 的文件 +gunzip file1.gz 解压一个叫做 'file1.gz'的文件 +gzip file1 压缩一个叫做 'file1'的文件 +gzip -9 file1 最大程度压缩 +rar a file1.rar test_file 创建一个叫做 'file1.rar' 的包 +rar a file1.rar file1 file2 dir1 同时压缩 'file1', 'file2' 以及目录 'dir1' +rar x file1.rar 解压rar包 +unrar x file1.rar 解压rar包 +tar -cvf archive.tar file1 创建一个非压缩的 tarball +tar -cvf archive.tar file1 file2 dir1 创建一个包含了 'file1', 'file2' 以及 'dir1'的档案文件 +tar -tf archive.tar 显示一个包中的内容 +tar -xvf archive.tar 释放一个包 +tar -xvf archive.tar -C /tmp 将压缩包释放到 /tmp目录下 +tar -cvfj archive.tar.bz2 dir1 创建一个bzip2格式的压缩包 +tar -xvfj archive.tar.bz2 解压一个bzip2格式的压缩包 +tar -cvfz archive.tar.gz dir1 创建一个gzip格式的压缩包 +tar -xvfz archive.tar.gz 解压一个gzip格式的压缩包 +zip file1.zip file1 创建一个zip格式的压缩包 +zip -r file1.zip file1 file2 dir1 将几个文件和目录同时压缩成一个zip格式的压缩包 +unzip file1.zip 解压一个zip格式压缩包 +### 11.RPM 包 +> rpm -ivh package.rpm 安装一个rpm包 +rpm -ivh --nodeeps package.rpm 安装一个rpm包而忽略依赖关系警告 +rpm -U package.rpm 更新一个rpm包但不改变其配置文件 +rpm -F package.rpm 更新一个确定已经安装的rpm包 +rpm -e package_name.rpm 删除一个rpm包 +rpm -qa 显示系统中所有已经安装的rpm包 +rpm -qa | grep httpd 显示所有名称中包含 "httpd" 字样的rpm包 +rpm -qi package_name 获取一个已安装包的特殊信息 +rpm -qg "System Environment/Daemons" 显示一个组件的rpm包 +rpm -ql package_name 显示一个已经安装的rpm包提供的文件列表 +rpm -qc package_name 显示一个已经安装的rpm包提供的配置文件列表 +rpm -q package_name --whatrequires 显示与一个rpm包存在依赖关系的列表 +rpm -q package_name --whatprovides 显示一个rpm包所占的体积 +rpm -q package_name --scripts 显示在安装/删除期间所执行的脚本l +rpm -q package_name --changelog 显示一个rpm包的修改历史 +rpm -qf /etc/httpd/conf/httpd.conf 确认所给的文件由哪个rpm包所提供 +rpm -qp package.rpm -l 显示由一个尚未安装的rpm包提供的文件列表 +rpm --import /media/cdrom/RPM-GPG-KEY 导入公钥数字证书 +rpm --checksig package.rpm 确认一个rpm包的完整性 +rpm -qa gpg-pubkey 确认已安装的所有rpm包的完整性 +rpm -V package_name 检查文件尺寸、 许可、类型、所有者、群组、MD5检查以及最后修改时间 +rpm -Va 检查系统中所有已安装的rpm包- 小心使用 +rpm -Vp package.rpm 确认一个rpm包还未安装 +rpm2cpio package.rpm | cpio --extract --make-directories *bin* 从一个rpm包运行可执行文件 +rpm -ivh /usr/src/redhat/RPMS/`arch`/package.rpm 从一个rpm源码安装一个构建好的包 +rpmbuild --rebuild package_name.src.rpm 从一个rpm源码构建一个 rpm 包 +### 12.YUM 软件包升级器 +> yum install package_name 下载并安装一个rpm包 +yum localinstall package_name.rpm 将安装一个rpm包,使用你自己的软件仓库为你解决所有依赖关系 +yum update package_name.rpm 更新当前系统中所有安装的rpm包 +yum update package_name 更新一个rpm包 +yum remove package_name 删除一个rpm包 +yum list 列出当前系统中安装的所有包 +yum search package_name 在rpm仓库中搜寻软件包 +yum clean packages 清理rpm缓存删除下载的包 +yum clean headers 删除所有头文件 +yum clean all 删除所有缓存的包和头文件 +### 13.deb 包 +> dpkg -i package.deb 安装/更新一个 deb 包 +dpkg -r package_name 从系统删除一个 deb 包 +dpkg -l 显示系统中所有已经安装的 deb 包 +dpkg -l | grep httpd 显示所有名称中包含 "httpd" 字样的deb包 +dpkg -s package_name 获得已经安装在系统中一个特殊包的信息 +dpkg -L package_name 显示系统中已经安装的一个deb包所提供的文件列表 +dpkg --contents package.deb 显示尚未安装的一个包所提供的文件列表 +dpkg -S /bin/ping 确认所给的文件由哪个deb包提供 +APT 软件工具 (Debian, Ubuntu 以及类似系统) +apt-get install package_name 安装/更新一个 deb 包 +apt-cdrom install package_name 从光盘安装/更新一个 deb 包 +apt-get update 升级列表中的软件包 +apt-get upgrade 升级所有已安装的软件 +apt-get remove package_name 从系统删除一个deb包 +apt-get check 确认依赖的软件仓库正确 +apt-get clean 从下载的软件包中清理缓存 +apt-cache search searched-package 返回包含所要搜索字符串的软件包名称 +### 14.查看文件内容 +> cat file1 从第一个字节开始正向查看文件的内容 +tac file1 从最后一行开始反向查看一个文件的内容 +more file1 查看一个长文件的内容 +less file1 类似于 'more' 命令,但是它允许在文件中和正向操作一样的反向操作 +head -2 file1 查看一个文件的前两行 +tail -2 file1 查看一个文件的最后两行 +tail -f /var/log/messages 实时查看被添加到一个文件中的内容 +### 15.文本处理 +> cat file1 file2 ... | command <> file1_in.txt_or_file1_out.txt general syntax for text manipulation using PIPE, STDIN and STDOUT +cat file1 | command( sed, grep, awk, grep, etc...) > result.txt 合并一个文件的详细说明文本,并将简介写入一个新文件中 +cat file1 | command( sed, grep, awk, grep, etc...) >> result.txt 合并一个文件的详细说明文本,并将简介写入一个已有的文件中 +grep Aug /var/log/messages 在文件 '/var/log/messages'中查找关键词"Aug" +grep ^Aug /var/log/messages 在文件 '/var/log/messages'中查找以"Aug"开始的词汇 +grep [0-9] /var/log/messages 选择 '/var/log/messages' 文件中所有包含数字的行 +grep Aug -R /var/log/* 在目录 '/var/log' 及随后的目录中搜索字符串"Aug" +sed 's/stringa1/stringa2/g' example.txt 将example.txt文件中的 "string1" 替换成 "string2" +sed '/^$/d' example.txt 从example.txt文件中删除所有空白行 +sed '/ *#/d; /^$/d' example.txt 从example.txt文件中删除所有注释和空白行 +echo 'esempio' | tr '[:lower:]' '[:upper:]' 合并上下单元格内容 +sed -e '1d' result.txt 从文件example.txt 中排除第一行 +sed -n '/stringa1/p' 查看只包含词汇 "string1"的行 +sed -e 's/ *$//' example.txt 删除每一行最后的空白字符 +sed -e 's/stringa1//g' example.txt 从文档中只删除词汇 "string1" 并保留剩余全部 +sed -n '1,5p;5q' example.txt 查看从第一行到第5行内容 +sed -n '5p;5q' example.txt 查看第5行 +sed -e 's/00*/0/g' example.txt 用单个零替换多个零 +cat -n file1 标示文件的行数 +cat example.txt | awk 'NR%2==1' 删除example.txt文件中的所有偶数行 +echo a b c | awk '{print $1}' 查看一行第一栏 +echo a b c | awk '{print $1,$3}' 查看一行的第一和第三栏 +paste file1 file2 合并两个文件或两栏的内容 +paste -d '+' file1 file2 合并两个文件或两栏的内容,中间用"+"区分 +sort file1 file2 排序两个文件的内容 +sort file1 file2 | uniq 取出两个文件的并集(重复的行只保留一份) +sort file1 file2 | uniq -u 删除交集,留下其他的行 +sort file1 file2 | uniq -d 取出两个文件的交集(只留下同时存在于两个文件中的文件) +comm -1 file1 file2 比较两个文件的内容只删除 'file1' 所包含的内容 +comm -2 file1 file2 比较两个文件的内容只删除 'file2' 所包含的内容 +comm -3 file1 file2 比较两个文件的内容只删除两个文件共有的部分 +### 16.字符设置和文件格式转换 +> dos2unix filedos.txt fileunix.txt 将一个文本文件的格式从MSDOS转换成UNIX +unix2dos fileunix.txt filedos.txt 将一个文本文件的格式从UNIX转换成MSDOS +recode ..HTML < page.txt > page.html 将一个文本文件转换成html +recode -l | more 显示所有允许的转换格式 +### 17.文件系统分析 +> badblocks -v /dev/hda1 检查磁盘hda1上的坏磁块 +fsck /dev/hda1 修复/检查hda1磁盘上linux文件系统的完整性 +fsck.ext2 /dev/hda1 修复/检查hda1磁盘上ext2文件系统的完整性 +e2fsck /dev/hda1 修复/检查hda1磁盘上ext2文件系统的完整性 +e2fsck -j /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性 +fsck.ext3 /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性 +fsck.vfat /dev/hda1 修复/检查hda1磁盘上fat文件系统的完整性 +fsck.msdos /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性 +dosfsck /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性 +### 18.初始化一个文件系统 +> mkfs /dev/hda1 在hda1分区创建一个文件系统 +mke2fs /dev/hda1 在hda1分区创建一个linux ext2的文件系统 +mke2fs -j /dev/hda1 在hda1分区创建一个linux ext3(日志型)的文件系统 +mkfs -t vfat 32 -F /dev/hda1 创建一个 FAT32 文件系统 +fdformat -n /dev/fd0 格式化一个软盘 +mkswap /dev/hda3 创建一个swap文件系统 +### 19.SWAP 文件系统 +> mkswap /dev/hda3 创建一个swap文件系统 +swapon /dev/hda3 启用一个新的swap文件系统 +swapon /dev/hda2 /dev/hdb3 启用两个swap分区 +### 20.备份 +> dump -0aj -f /tmp/home0.bak /home 制作一个 '/home' 目录的完整备份 +dump -1aj -f /tmp/home0.bak /home 制作一个 '/home' 目录的交互式备份 +restore -if /tmp/home0.bak 还原一个交互式备份 +rsync -rogpav --delete /home /tmp 同步两边的目录 +rsync -rogpav -e ssh --delete /home ip_address:/tmp 通过SSH通道rsync +rsync -az -e ssh --delete ip_addr:/home/public /home/local 通过ssh和压缩将一个远程目录同步到本地目录 +rsync -az -e ssh --delete /home/local ip_addr:/home/public 通过ssh和压缩将本地目录同步到远程目录 +dd bs=1M if=/dev/hda | gzip | ssh user@ip_addr 'dd of=hda.gz' 通过ssh在远程主机上执行一次备份本地磁盘的操作 +dd if=/dev/sda of=/tmp/file1 备份磁盘内容到一个文件 +tar -Puf backup.tar /home/user 执行一次对 '/home/user' 目录的交互式备份操作 +( cd /tmp/local/ && tar c . ) | ssh -C user@ip_addr 'cd /home/share/ && tar x -p' 通过ssh在远程目录中复制一个目录内容 +( tar c /home ) | ssh -C user@ip_addr 'cd /home/backup-home && tar x -p' 通过ssh在远程目录中复制一个本地目录 +tar cf - . | (cd /tmp/backup ; tar xf - ) 本地将一个目录复制到另一个地方,保留原有权限及链接 +find /home/user1 -name '*.txt' | xargs cp -av --target-directory=/home/backup/ --parents 从一个目录查找并复制所有以 '.txt' 结尾的文件到另一个目录 +find /var/log -name '*.log' | tar cv --files-from=- | bzip2 > log.tar.bz2 查找所有以 '.log' 结尾的文件并做成一个bzip包 +dd if=/dev/hda of=/dev/fd0 bs=512 count=1 做一个将 MBR (Master Boot Record)内容复制到软盘的动作 +dd if=/dev/fd0 of=/dev/hda bs=512 count=1 从已经保存到软盘的备份中恢复MBR内容 +### 21.光盘 +> cdrecord -v gracetime=2 dev=/dev/cdrom -eject blank=fast -force 清空一个可复写的光盘内容 +mkisofs /dev/cdrom > cd.iso 在磁盘上创建一个光盘的iso镜像文件 +mkisofs /dev/cdrom | gzip > cd_iso.gz 在磁盘上创建一个压缩了的光盘iso镜像文件 +mkisofs -J -allow-leading-dots -R -V "Label CD" -iso-level 4 -o ./cd.iso data_cd 创建一个目录的iso镜像文件 +cdrecord -v dev=/dev/cdrom cd.iso 刻录一个ISO镜像文件 +gzip -dc cd_iso.gz | cdrecord dev=/dev/cdrom - 刻录一个压缩了的ISO镜像文件 +mount -o loop cd.iso /mnt/iso 挂载一个ISO镜像文件 +cd-paranoia -B 从一个CD光盘转录音轨到 wav 文件中 +cd-paranoia -- "-3" 从一个CD光盘转录音轨到 wav 文件中(参数-3) +cdrecord --scanbus 扫描总线以识别scsi通道 +dd if=/dev/hdc | md5sum 校验一个设备的md5sum编码,例如一张 CD +### 22.网络(以太网和 WIFI 无线) +> ifconfig eth0 显示一个以太网卡的配置 +ifup eth0 启用一个 'eth0' 网络设备 +ifdown eth0 禁用一个 'eth0' 网络设备 +ifconfig eth0 192.168.1.1 netmask 255.255.255.0 控制IP地址 +ifconfig eth0 promisc 设置 'eth0' 成混杂模式以嗅探数据包 (sniffing) +dhclient eth0 以dhcp模式启用 'eth0' +route -n show routing table +route add -net 0/0 gw IP_Gateway configura default gateway +route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1 configure static route to reach network '192.168.0.0/16' +route del 0/0 gw IP_gateway remove static route +echo "1" > /proc/sys/net/ipv4/ip_forward activate ip routing +hostname show hostname of system +host www.example.com lookup hostname to resolve name to ip address and viceversa(1) +nslookup www.example.com lookup hostname to resolve name to ip address and viceversa(2) +ip link show show link status of all interfaces +mii-tool eth0 show link status of 'eth0' +ethtool eth0 show statistics of network card 'eth0' +netstat -tup show all active network connections and their PID +netstat -tupl show all network services listening on the system and their PID +tcpdump tcp port 80 show all HTTP traffic +iwlist scan show wireless networks +iwconfig eth1 show configuration of a wireless network card +hostname show hostname +host www.example.com lookup hostname to resolve name to ip address and viceversa +nslookup www.example.com lookup hostname to resolve name to ip address and viceversa +whois www.example.com lookup on Whois database +### 23.列出目录内容 +> ls -a:显示所有文件(包括隐藏文件); +ls -l:显示详细信息; +ls -R:递归显示子目录结构; +ls -ld:显示目录和链接信息; +ctrl+r:历史记录中所搜命令(输入命令中的任意一个字符); +Linux中以.开头的文件是隐藏文件; +pwd:显示当前目录 +### 24.查看文件的类型 +> file:查看文件的类型 +### 25.复制文件目录 +1.cp:复制文件和目录 cp 源文件(文件夹)目标文件(文件夹) + +常用参数:-r:递归复制整个目录树;-v:显示详细信息; 复制文件夹时要在 cp 命令后面加一个-r 参数: 如:cp -r 源文件夹 目标文件夹 +2.touch+文件名:当文件不存在的时候,创建相应的文件;当文件存在的时候,修改文件的创建时间。 + +功能:生成一个空文件或修改文件的存取/修改的时间记录值。 touch * :将当前下的文件时间修改为系统的当前时间 touch –d 20040210 test:将 test 文件的日期改为 20040210 touch abc  :若 abc 文件存在,则修改为系统的当前时间;若不存在,则生成一个为当前时间的空文件 +3.mv 文件 目标目录:移动或重命名文件或目录(如果指定文件名,则可以重命名文件)。可以将文件及目录移到另一目录下,或更改文件及目录的名称。 + +格式为:mv [参数]<源文件或目录> <目标文件或目录> mva.txt ../:将 a.txt 文件移动上层目录 mv a.txt b.txt:将 a.txt 改名为 b.txt mvdir2 ../:将 dir2 目录上移一层 +4.rm:删除文件; + +常用参数:-i:交互式 -r:递归的删除包括目录中的所有内容 +5.mkdir +文件夹名称:创建文件夹; + +6.rm -r +文件夹名称:删除文件夹(空文件夹和非空文件夹都可删除) + +rmdir 文件夹名称:删除文件夹(只能删除空文件夹) +7.mkdir -p dir1/dir2:在当前目录下创建 dir1 目录,并在 dir1 目录下创建 dir2 目录, 也就是连续创建两个目录(dir1/和 dir1/dir2) + +8.rmdir –p dir1/dir2:删除 dir1 下的 dir2 目录,若 dir1 目录为空也删除它 + +9.rm *:删除当前目录下的所有文件 + +10.-f 参数:强迫删除文件 rm –f *.txt:强迫删除所有以后缀名为 txt 文件 + +11.-i 参数:删除文件时询问 + +rm  –i * :删除当前目录下的所有文件会有如下提示: rm:backup:is a directory     遇到目录会略过 rm: remove ‘myfiles.txt’ ? Y 删除文件时会询问,可按 Y 或 N 键表示允许或拒绝删除文件 +12.-r 参数:递归删除(连子目录一同删除,这是一个相当常用的参数) + +rm -r test :删除 test 目录(含 test 目录下所有文件和子目录) rm -r *:删除所有文件(含当前目录所有文件、所有子目录和子目录下的文件) 一般在删除目录时 r 和 f 一起用,避免麻烦 rm -rf test :强行删除、不加询问 +13.grep:功能:在文件中搜索匹配的字符并进行输出 + +格式:grep[参数] <要找的字串> <要寻找字 串的源文件> greplinux test.txt:搜索 test.txt 文件中字符串 linux 并输出 +14、ln 命令 + +功能:在文件和目录之间建立链接 格式:ln [参数] <源文件或目录> <目标文件或目录> 链接分“软链接”和“硬链接” 1.软链接: ln–s /usr/share/do doc :创建一个链接文件 doc,并指向目录/usr/share/do 2.硬链接: ln /usr/share/test hard:创建一个硬链接文件 hard,这时对于 test 文件对应 的存储区域来说,又多了一个文件指向它 +### 26.系统常用命令 +**26.1.显示命令** +> date:查看或设置当前系统的时间:格式化显示时间:+%Y--%m--%d; +date -s:设置当前系统的时间 +hwclock(clock):显示硬件时钟时间(需要管理员权限); +cal:查看日历 +格式 cal [参数] 月年 +cal:显示当月的日历 cal4 2004 :显示 2004 年 4 月的日历 +cal- y 2003:显示 2003 年的日历 +uptime:查看系统运行时间 + +**26.2.显示命令** +> echo:显示输入的内容 追加文件 echo "liuyazhuang" >> liuyazhuang.txt +cat:显示文件内容,也可以将数个文件合并成一个文件。 +格式:格式:cat[参数]<文件名> +cat test.txt:显示 test.txt 文件内容 +cat test.txt | more :逐页显示 test.txt 文件中的内容 +cat test.txt >> test1.txt :将 test.txt 的内容附加到 test1.txt 文件之后 +cat test.txt test2.txt >readme.txt  : 将 test.txt 和 test2.txt 文件合并成 readme.txt 文件 +head:显示文件的头几行(默认 10 行) -n:指定显示的行数格式:head -n 文件名 +tail:显示文件的末尾几行(默认 10 行)-n:指定显示的行数 -f:追踪显示文件更新 (一般用于查看日志,命令不会退出,而是持续显示新加入的内容) +格式:格式:tail[参数]<文件名> +tail-10 /etc/passwd :显示/etc/passwd/文件的倒数 10 行内容 +tail+10 /etc/passwd :显示/etc/passwd/文件从第 10 行开始到末尾的内容 +more:用于翻页显示文件内容(只能向下翻页) +more 命令是一般用于要显示的内容会超过一个画面长度的情况。为了避免画 面显示时瞬间就闪过去,用户可以使用 more 命令,让画面在显示满一页时暂停,此时可按空格键继续显示下一个画面,或按 Q 键停止显示。 +ls -al |more:以长格形式显示 etc 目录下的文件列表,显示满一个画面便暂停,可 按空格键继续显示下一画面,或按 Q 键跳离 +less:翻页显示文件内容(带上下翻页)按下上键分页,按 q 退出、‘ +less 命令的用法与 more 命令类似,也可以用来浏览超过一页的文件。所不同 的是 less 命令除了可以按空格键向下显示文件外,还可以利用上下键来卷动文件。当要结束浏览时,只要在 less 命令的提示符“:”下按 Q 键即可。 +ls -al | less:以长格形式列出/etc 目录中所有的内容。用户可按上下键浏览或按 Q 键跳离 + +**26.3.查看硬件信息** +> Ispci:查看 PCI 设备 -v:查看详细信息 +Isusb:查看 USB 设备 -v:查看详细信息 +Ismod:查看加载的模块(驱动) + +**26.4.关机、重启** +> shutdown 关闭、重启计算机 +shutdown[关机、重启]时间 -h 关闭计算机 -r:重启计算机 +如:立即关机:shutdown -h now +10 分钟后关机:shutdown -h +10 +23:30 分关机:shutdown -h 23:30 +立即重启:shutdown -r now +poweroff:立即关闭计算机 +reboot:立即重启计算机 + +**26.5.归档、压缩** +> zip:压缩文件 zip liuyazhuang.zip myfile 格式为:“zip 压缩后的 zip 文件文件名” +unzip:解压文件 unzip liuyazhuang.zip +gzip:压缩文件 gzip 文件名 +tar:归档文件 +tar -cvf out.tar liuyazhuang 打包一个归档(将文件"liuyazhuang"打包成一个归档) +tar -xvf liuyazhuang.tar 释放一个归档(释放 liuyazhuang.tar 归档) +tar -cvzf backup.tar.gz/etc +-z 参数将归档后的归档文件进行 gzip 压缩以减少大小。 +-c:创建一个新 tar 文件 +-v:显示运行过程的信息 +-f:指定文件名 +-z:调用 gzip 压缩命令进行压缩 +-t:查看压缩文件的内容 +-x:解开 tar 文件 +tar -cvf test.tar *:将所有文件打包成 test.tar,扩展名.tar 需自行加上 +tar -zcvf test.tar.gz *:将所有文件打包成 test.tar,再用 gzip 命令压缩 +tar -tf test.tar :查看 test.tar 文件中包括了哪些文件 +tar -xvf test.tar 将 test.tar 解开 +tar -zxvf foo.tar.gz 解压缩 +gzip 各 gunzip 命令 +gziptest.txt :压缩文件时,不需要任何参数 +gizp–l test.txt.gz:显示压缩率 + +**26.6.查找** +> locate:快速查找文件、文件夹:locate keyword +此命令需要预先建立数据库,数据库默认每天更新一次,可用 updatedb 命令手工建立、更新数据库。欢迎关注我们,公号终码一生。 +find 查找位置查找参数 +如: +find . -nameliuyazhuang查找当前目录下名称中含有"liuyazhuang"的文件 +find / -name *.conf 查找根目录下(整个硬盘)下后缀为.conf 的文件 +find / -perm 777 查找所有权限是 777 的文件 +find / -type d 返回根目录下所有的目录 +find . -name "a*"-exec ls -l {} ; +find 功能:用来寻找文件或目录。 +格式:find [<路径>][匹配条件] +find / -name httpd.conf 搜索系统根目录下名为 httpd.conf 的文件 + +**26.7.ctrl+c :终止当前的命令** + +**26.8.who 或 w 命令** +> 功能:查看当前系统中有哪些用户登录 +格式:who/w[参数] + +**26.9.dmesg 命令** +功能:显示系统诊断信息、操作系统版本号、物理内存的大小以及其它信息 + +**26.10.df 命令** +功能:用于查看文件系统的各个分区的占用情况 + +**26.11.du 命令** +功能:查看某个目录中各级子目录所使用的硬盘空间数 + +格式:du [参数] <目录名> + +**26.12.free 命令** +功能:用于查看系统内存,虚拟内存(交换空间)的大小占用情况 + +**26.13.VIM** +VIM 是一款功能强大的命令行文本编辑器,在 Linux 中通过 vim 命令可以启动 vim 编辑器。 + +一般使用 vim + 目标文件路径 的形式使用 vim + +如果目标文件存在,则 vim 打开目标文件,如果目标文件不存在,则 vim 新建并打开该文件 +:q:退出 vim 编辑器 + +### VIM模式 +vim 拥有三种模式: + +**1.命令模式(常规模式)** +vim 启动后,默认进入命令模式,任何模式都可以通过 esc 键回到命令模式(可以多按几次),命令模式下可以键入不同的命令完成选择、复制、粘贴、撤销等操作。 + +命名模式常用命令如下: + +i : 在光标前插入文本; + +o:在当前行的下面插入新行; + +dd:删除整行; + +yy:将当前行的内容放入缓冲区(复制当前行) + +n+yy :将 n 行的内容放入缓冲区(复制 n 行) + +p:将缓冲区中的文本放入光标后(粘贴) + +u:撤销上一个操作 + +r:替换当前字符 + +/ 查找关键字 + +**2.插入模式** +在命令模式下按 “ i “键,即可进入插入模式,在插入模式可以输入编辑文本内容,使用 esc 键可以返回命令模式。 + +**3.ex模式** +在命令模式中按” : “键可以进入 ex 模式,光标会移动到底部,在这里可以保存修改或退出 vim. + +> ext 模式常用命令如下: +> :w :保存当前的修改 +> :q :退出 +> :q! :强制退出,保存修改 +> :x :保存并退出,相当于:wq +> :set number 显示行号 +> :! 系统命令 执行一个系统命令并显示结果 +> :sh :切换到命令行,使用 ctrl+d 切换回 vim + +### 28.软件包管理命令(RPM) +**28.1.软件包的安装** +使用 RPM 命令的安装模式可以将软件包内所有的组件放到系统中的正确路径,安装软件包的命令是:rpm –ivh wu-ftpd-2.6.2-8.i386.rpm + +i:作用 rpm 的安装模式 v: 校验文件信息 h: 以#号显示安装进度 + +**28.2.软件包的删除** +删除模式会将指定软件包的内容全部删除,但并不包括已更改过的配置文件,删除 RPM 软件包的命令如下:rpm –e wu-ftpd + +注意:这里必须使用软件名“wu-ftpd”或”wu-ftpd-2.6.2-8 而不是使用当初安装时的软件包名.wu-ftpd-2.6.2-8.i386.rpm + +**28.3.软件包升级** +升级模式会安装用户所指定的更新版本,并删除已安装在系统中的相同软件包,升级软件包命令如下:rpm –Uvh wu-ftpd-2.6.2-8.i386.rpm –Uvh:升级参数 + +**28.4.软件包更新** +更新模式下,rpm 命令会检查在命令行中所指定的软件包是否比系统中原有的软件 包更新。如果情况属实,rpm 命令会自动更新指定的软件包;反之,若系统中并没有指定软件包的较旧版本,rpm 命令并不会安装此软件包。而在升级模式下,不管系统中是否有较旧的版本,rpm 命令都会安装指定的软件包。 + +> rpm –Fvhwu-ftpd-2.6.2-8.i386.rpm -Fvh:更新参数 + +**28.5.软件包查询** +若要获取 RPM 软件包的相关信息,可以使用查询模式。使用-q 参数可查询一个已 安装的软件包的内容 + +> rpm –q wu-ftpd + +查询软件包所安装的位置:rpm –ql package-name + +rpm –ql xv (l 参数:显示文件列表) \ No newline at end of file diff --git a/source/_posts/A Typecho Theme.md b/source/_posts/A Typecho Theme.md new file mode 100755 index 0000000..78d1464 --- /dev/null +++ b/source/_posts/A Typecho Theme.md @@ -0,0 +1,69 @@ +--- +title: A Typecho Theme +date: 2024-01-05 04:29:00 +categories: 学习笔记 +urlname: 32 +tags: +- 学习 +--- +外观设置 + +外观设置主要分为四部分,分别为 logo、icon 的设置,功能开关,社交按钮设置,图片CDN镜像 + +使用注意事项都在设置里写得比较清楚了,如果遇到不明白的地方,可以给我留言反馈 + +下面有几点补充 + +CDN设置部分仅仅测试了七牛的,理论上也支持有镜像服务的CDN +创建模板归档页,无论选择了哪个模板都要加上自定义字段archive +独立搜索页 + +设置方法看这里:Here + +文章缩略图 + +文章设置缩略图方法有四种,自定义字段thumb,文章附件第一张图片,文章内图片,默认缩略图 + +优先级顺序 :自定义字段 thumb -> 附件第一张图片 -> 文章图片 -> 默认缩略图 -> 随机图片 -> 无 + +缩略图尺寸大小,高度至少有250px,宽度大于高度,推荐高度为400px的 + +个性化标徽 + +个性化标徽出现的地方有首页、分类页,标签页,作者页和相关文章 + +设置方法是在文章编辑内填写自定义字段,支持的字段如下 + +book 、 game 、 note 、 chat 、 code 、 image 、 web 、 link 、 design 、 lock + +个性化色块 + +个性化色块需要到外观设置那开启才能激活使用,色块出现的地方有首页,分类页,标签页,独立搜索页等等 + +设置方法是在文章编辑内填写自定义字段,支持的字段如下 + +blue、purple、green、yellow、red + +友情链接 + +如果你想获取跟我一样的友情链接页面,因为是 typecho 开发版,支持在页面内写
  • + +所以你可以直接在
      内联一个class="flinks",然后在
    • 插入你的友链,即可 + +更多设置教程 : Here + +浏览器兼容情况 + +这个····现代浏览器都兼容···· + +Contributing + +All kinds of contributions (enhancements, new features, documentation & code improvements, issues & bugs reporting) are welcome. + +欢迎各种形式的贡献,包括但不限于优化,添加功能,文档 & 代码的改进,问题和 bugs 的报告。 + +License + +Open sourced under the MIT license. + +根据 MIT 许可证开源。 diff --git a/source/_posts/Alist 挂载阿里云盘等.md b/source/_posts/Alist 挂载阿里云盘等.md new file mode 100755 index 0000000..b8352d6 --- /dev/null +++ b/source/_posts/Alist 挂载阿里云盘等.md @@ -0,0 +1,27 @@ +--- +title: Alist 挂载阿里云盘等 +date: 2024-02-23 04:51:00 +categories: 学习笔记 +headimg: https://yhehe.com/images/2829302099.png +description: Alist是一个支持多种存储的文件列表程序 +tags: +- Alist +--- + + +AList 开源项目地址:https://github.com/alist-org/alist + +首先我们需要获取到阿里云盘的 refresh_token + +傻瓜方法:https://easy-token.cooluc.com/ +手动方法:https://youtu.be/12QoxeljMoY?t=445 + +RaiDrive : +官网:https://www.raidrive.com (免费版即可) +下载好后输入启动命令:alist server +vbs脚本内容 +{bs-font color="#9B0B0B"}注意地址写为你的alist文件地址{/bs-font} +``` +Set ws = CreateObject("Wscript.Shell") +ws.run "C:\alist-windows-amd64\alist.exe server",vbhide +``` \ No newline at end of file diff --git a/source/_posts/AnyTXT Searcher-电脑本地任意文本搜索神器!+ Snipaste 高效的截图神器!.md b/source/_posts/AnyTXT Searcher-电脑本地任意文本搜索神器!+ Snipaste 高效的截图神器!.md new file mode 100755 index 0000000..844d5c6 --- /dev/null +++ b/source/_posts/AnyTXT Searcher-电脑本地任意文本搜索神器!+ Snipaste 高效的截图神器!.md @@ -0,0 +1,34 @@ +--- +title: AnyTXT Searcher-电脑本地任意文本搜索神器!+ Snipaste 高效的截图神器! +date: 2024-05-10 03:39:00 +categories: 学习笔记 +headimg: https://yhehe.com/images/864650402.png #博客封面图 +description: 搜索本地文件,没有任何延迟,秒出结果。不仅可以搜索文件名,还可以搜索到文件内容,包含word,excel,pdf,ppt,txt等文件格式。还可以指定搜索格式,指定文件夹。 #章的简短描述,概述文章内容,可以用于SEO优化,帮助搜索引擎和用户快速了解文章主题。 +tags: + - 软件 +--- + +## AnyTxt 搜索神器 +搜索本地文件,没有任何延迟,秒出结果。 + +不仅可以搜索文件名,还可以搜索到文件内容,包含word,excel,pdf,ppt,txt等文件格式。 + +还可以指定搜索格式,指定文件夹。 + +有精准、高级、正则三种模式可以选择 +{% gallery %} +![图片描述](https://yhehe.com/images/1268611866.webp) +{% endgallery %} + + +官方下载:【[点击前往](https://anytxt.net/download/)】 + +---------- + +## Snipaste 高效的截图神器! +这款Snipaste的截图神器,用它来截图的话非常高效! + +支持更精准的截图模式,同时它可以将截图粘贴为浮动窗口,来进行编辑 + +也可以支持模糊处理、标注等等….. +官方下载:【[点击前往](https://www.snipaste.com/)】 diff --git a/source/_posts/A~mei A~mei.md b/source/_posts/A~mei A~mei.md new file mode 100755 index 0000000..41cad8b --- /dev/null +++ b/source/_posts/A~mei A~mei.md @@ -0,0 +1,28 @@ +--- +title: A~mei A~mei +date: 2024-05-26 06:31:00 +categories: 记录生活 +headimg: https://yhehe.com/images/amei/1554749389.jpg +description: 昨天西安从早上就开始下雨,我这一看完了,看演唱会还得套个雨衣。后来进场后发现我多虑了,我就没穿雨衣的机会啊。人家内场的才会淋到雨,我这普通看台票,头顶有棚子,下冰雹都没事。还有雨下到7点晴了。我怀疑人家都是气象局查过后定的时间。雨后的空气湿润,也不热,很好。 # 文章描述 +tags: + 演唱会 +--- +昨天西安从早上就开始下雨,我这一看完了,看演唱会还得套个雨衣。 +后来进场后发现我多虑了,我就没穿雨衣的机会啊。人家内场的才会淋到雨,我这普通看台票,头顶有棚子,下冰雹都没事。 +还有雨下到7点晴了。我怀疑人家都是气象局查过后定的时间。雨后的空气湿润,也不热,很好。 +阿妹很卖力,从头唱到尾,原本计划的2个小时结束,没想到陕西的歌迷这么给力,气氛很好,基本每首歌都是大合唱,导致延长了将近1个小时。等我们出来都10点40了。遗憾的是我想听《我最亲爱的》并没有唱。 +这个女人啊从头蹦到尾,回去后给我说腿疼,哎~啥意思嘛。 +咸阳的外围工作做的很好 早早交警就开始指挥交通,这是我唯一 一次看完大型活动没堵车的情况。 +还有一件事真搞笑,停车找不到位置,附近的村民用蹦蹦三轮把能上马路台子的一个口封住了,看我过来问停车不,我说停啊,人家说20元,行,我爽快答应,要不找位置还不知道找啥时候去了。停好车也没人过来问我收钱,我心想是不是等走的时候收啊,没管,看完回来也没见人收,不知道是不是被举报了,哈哈 ,闪。 +吃个饭回到西安12点多了,晚了,回不了家了。Hotel... +![微信图片_20240526140834.jpg](https://yhehe.com/images/amei/3721720307.jpg) +![微信图片_20240526140812.jpg](https://yhehe.com/images/amei/2286256548.jpg) +![微信图片_20240526140801.jpg](https://yhehe.com/images/amei/3746848212.jpg) +![微信图片_20240526142638.jpg](https://yhehe.com/images/amei/1593219383.jpg) + + + + + + + diff --git a/source/_posts/BO-BLOG.md b/source/_posts/BO-BLOG.md new file mode 100755 index 0000000..ab8cd14 --- /dev/null +++ b/source/_posts/BO-BLOG.md @@ -0,0 +1,15 @@ +--- +title: BO-BLOG +date: 2024-02-04 14:59:00 +categories: 学习笔记 +headimg: https://yhehe.com/images/3677823159.png +description: 第一次架设BLOG的时候就用的bo-blog,那时候开始接触PHP语言,一眨眼这么多年过去了,今天想到它,打开他的网站,却只有寥寥数语,看来他也淹没再时间的尘埃中。。。。 +tags: +- blog +--- + 第一次架设BLOG的时候就用的bo-blog,那时候开始接触PHP语言,一眨眼这么多年过去了,今天想到它,打开他的网站,却只有寥寥数语,看来他也淹没再时间的尘埃中。。。。 +> 岁月是一把利刃 +划过记忆的空间 +留下了时代的沟壑 +沉淀在过往的 +是我们逐渐褪色的字迹 \ No newline at end of file diff --git a/source/_posts/HiBit Uninstaller 一款好用的程序卸载工具.md b/source/_posts/HiBit Uninstaller 一款好用的程序卸载工具.md new file mode 100755 index 0000000..1a45998 --- /dev/null +++ b/source/_posts/HiBit Uninstaller 一款好用的程序卸载工具.md @@ -0,0 +1,15 @@ +--- +title: HiBit Uninstaller 一款好用的程序卸载工具 +date: 2024-06-23 05:46:52 +categories: 学习笔记 +headimg: https://yhehe.com/images/1244981333.png #博客封面图 +description: 前两天因为要装IDM 想把老版本卸载掉重新安装,可总是删除不干净有残留,有残留的话就不能成功注册~用了这款工具就ok了。 #章的简短描述,概述文章内容,可以用于SEO优化,帮助搜索引擎和用户快速了解文章主题。 +tags: + - 软件 +--- + + +前两天因为要装IDM 想把老版本卸载掉重新安装,可总是删除不干净有残留,有残留的话就不能成功注册~用了这款工具就ok了。 + + +有安装和便携版:[下载地址](https://www.hibitsoft.ir/Uninstaller.html) \ No newline at end of file diff --git a/source/_posts/Lady Gaga - Always Remember Us This Way .md b/source/_posts/Lady Gaga - Always Remember Us This Way .md new file mode 100755 index 0000000..ba68ba3 --- /dev/null +++ b/source/_posts/Lady Gaga - Always Remember Us This Way .md @@ -0,0 +1,15 @@ +--- +title: Lady Gaga - Always Remember Us This Way +date: 2024-05-21 09:50:00 +updated: 2024-06-07 +categories: 记录生活 +headimg: https://yhehe.com/images/614856839.jpg +description: 也许音乐才会让你开心~~ +tags: + +--- + + +{% audio https://yhehe.com/music/Way.mp3 %} + +在《Always Remember Us This Way》这首歌中,Lady Gaga呈现了一种深切的情感,唱出了对过去美好时光的珍惜和怀念。歌词中蕴含着爱情的甜蜜与忧伤,唤起了人们对曾经亲密关系的回忆。音乐旋律动人,配合Gaga独特的嗓音,使这首歌成为很多人心中难以忘却的经典。当我们回首往事时,总有一些瞬间让我们心潮澎湃,这首歌正是那种情感的真实写照,让我们在岁月中铭记那些美好的瞬间。 diff --git a/source/_posts/OpenAI 正式开放!无需登入就能免费使用 ChatGPT.md b/source/_posts/OpenAI 正式开放!无需登入就能免费使用 ChatGPT.md new file mode 100755 index 0000000..f6129a1 --- /dev/null +++ b/source/_posts/OpenAI 正式开放!无需登入就能免费使用 ChatGPT.md @@ -0,0 +1,29 @@ +--- +title: OpenAI 正式开放!无需登入就能免费使用 ChatGPT +date: 2024-04-02 13:48:00 +categories: 学习笔记 +headimg: https://yhehe.com/images/1868064702.png +description: OpenAI正式开放了ChatGPT的免注册使用功能,现在你无需注册账号,打开官网就可以直接免费使用ChatGPT, 亲测确实如此,对于无法注册账户的人来说就方便多了…. +tags: +- ai +--- + +OpenAI正式开放了ChatGPT的免注册使用功能,现在你无需注册账号, +打开官网就可以直接免费使用ChatGPT, 亲测确实如此,对于无法注册账户的人来说就方便多了…. + +官方直达链接:【[点击进入](https://chat.openai.com/)】 注意:需要科学才能访问! + + + +OpenAI 声称,我们的核心使命是推动 ChatGPT 等工具的广泛应用,让人们享受人工智能带来的好处。 +我们致力于让所有对 ChatGPT 功能感兴趣的用户都能够轻松地接触和利用人工智能技术。 + +对于未注册用户,OpenAI 提供了选择,让他们决定是否愿意共享自己的数据。 +默认情况下,用户的对话等数据将用于模型训练,但用户可以在设置中禁用数据共享。 +然而,由于 ChatGPT 无法在未登录状态下记住设置,用户可能需要每次都检查数据共享选项。 +为了解决这个问题,用户可以注册账号并进行相关设置,这样系统就能记住用户的选择。 + +考虑到免注册使用的可能性,一些开发者可能会尝试直接使用 GPT-3.5 模型。 +为防止滥用,OpenAI 已经采取了一系列防护措施。 +最后,即使是儿童也可以在免注册情况下使用 ChatGPT,但这可能会引发一些国家或地区的监管争议。 +因此,ChatGPT 正在引入额外的内容保护措施,以防止滥用和违规生成的发生。 \ No newline at end of file diff --git a/source/_posts/Rufus U盘工具,重装系统不再烦恼.md b/source/_posts/Rufus U盘工具,重装系统不再烦恼.md new file mode 100755 index 0000000..18d903e --- /dev/null +++ b/source/_posts/Rufus U盘工具,重装系统不再烦恼.md @@ -0,0 +1,47 @@ +--- +title: Rufus U盘工具,重装系统不再烦恼 +date: 2024-04-06 04:01:00 +categories: 学习笔记 +headimg: https://yhehe.com/images/4202432307.jpg #博客封面图 +description: Rufus 是一个可以帮助格式化和创建可引导USB闪存盘的工具,比如 USB 随身碟,记忆棒等等。在如下场景中会非常有用:你需要把一些可引导的ISO格式的镜像(Windows,Linux,UEFI等)创建成USB安装盘的时候,你需要使用一个还没有安装操作系统的设备的时候,你需要从DOS系统刷写BIOS或者其他固件的时候,你需要运行一个非常底层的工具的时候 +tags: +- 软件 +--- + +Rufus 是一个可以帮助格式化和创建可引导USB闪存盘的工具,比如 USB 随身碟,记忆棒等等。 + +在如下场景中会非常有用: + +你需要把一些可引导的ISO格式的镜像(Windows,Linux,UEFI等)创建成USB安装盘的时候 +你需要使用一个还没有安装操作系统的设备的时候 +你需要从DOS系统刷写BIOS或者其他固件的时候 +你需要运行一个非常底层的工具的时候 + + +Rufus 麻雀虽小,五脏俱全,体积虽小,功能全面。 + +哦,对了,Rufus 还 非常快,比如,在从ISO镜像创建 Windows 7 USB安装盘的时候,他比 UNetbootin,Universal USB Installer 或者 Windows 7 USB download tool 大约快2倍。当然,在创建 Linux 可引导USB设备的时候也比较快。 + +官网地址:https://rufus.ie + +### 系统需求: +需要Windows 7以上的操作系统,无所谓32位还是64位,下载后开箱即用。 + + + +### 用法 +下载可执行文件后直接运行 – 无需安装,绿色环保 + +可执行文件已经进行数字签名,详情如下: + +“Akeo Consulting” (v1.3.0 或者更新的版本) +“Pete Batard – Open Source Developer” (v1.2.0 或者更老的版本) + + +### 对DOS支持的说明: +如果你创建了一个DOS启动盘,但是没有使用美式键盘,Rufus 会尝试根据设备选择一个键盘布局,在那种情况下推荐使用 FreeDOS(默认选项)而不是 MS-DOS,因为前者支持更多的键盘布局。 + +### 对ISO支持的说明: +Rufus v1.10 及其以后的所有版本都支持从 ISO 镜像 (.iso) 创建可引导USB。 + +通过使用类似 InfraRecorder 或者 CDBurnerXP 之类的免费CD镜像烧录程序,可以非常方便的从实体光盘或者一系列文件中创建 ISO 镜像。 \ No newline at end of file diff --git a/source/_posts/Typecho Fancybox 给文章图片添加灯箱效果.md b/source/_posts/Typecho Fancybox 给文章图片添加灯箱效果.md new file mode 100755 index 0000000..accafc9 --- /dev/null +++ b/source/_posts/Typecho Fancybox 给文章图片添加灯箱效果.md @@ -0,0 +1,45 @@ +--- +title: Typecho Fancybox 给文章图片添加灯箱效果 +date: 2024-02-15 14:54:00 +categories: 学习笔记 +headimg: https://bu.dusays.com/2024/02/17/65cf86deea61f.jpg +description: 一直 +tags: +- Typecho +--- + +### 介绍 +FancyBox是一款优秀的弹出框Jquery插件,FancyBox提供了一种简洁优雅的方式去为图片、网页和多媒体添加灯箱功能。此教程为大家介绍 FancyBox在Typecho主题上的应用。 + +下面开始教程~ + +### 引用 FancyBox插件 +把下面内容添加到 header.php 中 前面 +``` + + + +``` +### 修改post.php +打开post.php,将 +``` +content(); ?> +``` +修改成 +``` +]*>/i'; + $replacement = ''.$this->title.''; + $content = preg_replace($pattern, $replacement, $this->content); + echo $content; +?> +``` +### 初始化FancyBox +把下面js添加到 footer.php 文件的前 +``` + +``` \ No newline at end of file diff --git a/source/_posts/Typecho Plyr HTML5.md b/source/_posts/Typecho Plyr HTML5.md new file mode 100755 index 0000000..cac8d77 --- /dev/null +++ b/source/_posts/Typecho Plyr HTML5.md @@ -0,0 +1,49 @@ +--- +title: Typecho Plyr HTML5 自适应本地 mp3/mp4 播放插件 +date: 2024-03-14 02:20:00 +categories: 学习笔记 +headimg: https://yhehe.com/images/1354968797.jpg #博客封面图 +description: Plyr简单,轻便,可访问且可自定义的HTML5,YouTube和Vimeo媒体播放器,支持现代浏览器。 +tags: + - 软件 +--- + +Plyr简单,轻便,可访问且可自定义的HTML5,YouTube和Vimeo媒体播放器,支持现代浏览器。 + +更多详情请访问 plyr 官网:https://plyr.io + +请参考开源项目自行添加标签:https://plyr.io + +既然官方提供了 MP3 播放源码,就一起集成了 MP3 音频播放和 MP4 视频播放功能,整合了其它控件元素,基本上保持与 Plyr 官网样式同步。 + +使用 Plyr HTML5 样式: + +MP3 和移动端效果不提供预览,我自己测试时效果很棒,您可自行测试。 + +是不是马上觉得使用 Plyr HTML5 样式好看多了?如果您喜欢,就往下看吧。 + +功能: +PC 端与手机端自适应。 +与 Plyr 官方控件样式同步。 +只需一个插件,即可播放MP3/MP4。 + +使用: +MP4: + `` + +带封面: + `` +MP3: + `
      ` + +注:此插件已集成 HTML 5 基本按钮元素控件,无需像原生 HTML 5 一样还要写入元素控件,只需一个视频地址即可播放。 + +由于设置了不自动播放,想设置MP3自动播放的,请添加自动播放 autoplay 标签或者修改源码 autoplay 标签。 + +目前仅在 Typecho1.0 测试OK,理论支持所有正式版与开发版,并没有加入 Youtube 与优酷、腾讯等在线视频功能,Youtube 被屏蔽,腾讯和优酷视频都有广告,只测试了本地视频播放,如您有兴趣,也可自己加入测试。 + +由于我设置了自适应,就不需要添加宽高元素了,如与原生元素发生冲突,保留带封面元素再删除其它元素控件,如果还需要添加其他的元素控件,请参考:https://github.com/sampotts/plyr + +插件下载:[plyr.zip](https://yhehe.com/usr/uploads/2024/03/1655393404.zip) + +下载之后自行上传到 Typecho 插件目录修改插件名为:plyr 并启用。 diff --git a/source/_posts/hexo 学习记录.md b/source/_posts/hexo 学习记录.md new file mode 100755 index 0000000..ce6f87e --- /dev/null +++ b/source/_posts/hexo 学习记录.md @@ -0,0 +1,273 @@ +--- +title: hexo 学习记录 #标题 +date: 2024-11-06 # 发布时间 +tags: 学习,hexo #标签 +headimg: https://yhehe.com/images/hexo.png #博客封面图 +description: 学习中............ +author: hehe #作者名称 +categories: 学习笔记 #分类 +updated: 2024-10-10 +password: hello +--- + +### 3. 高亮一段代码[^code] + + +安装插件 +npm i hexo-blog-encrypt -s +git add . +git commit -m a +git push origin main + +```js +// 给页面里所有的 DOM 元素添加一个 1px 的描边(outline); +[].forEach.call($$("*"),function(a){ + a.style.outline="1px solid #"+(~~(Math.random()*(1<<24))).toString(16); +}) +``` +{% gallery %} +![图片描述](https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper/abstract/41F215B9-261F-48B4-80B5-4E86E165259E.jpeg) +{% endgallery %} + +创建文章 https://volantis.js.org/v5/page-settings/?keyword=%E6%96%87%E6%A1%A3%E9%A1%B5%E9%9D%A2#%E9%A1%B5%E9%9D%A2%E5%B8%83%E5%B1%80%E6%A8%A1%E6%9D%BF +{% pandown 网盘类型::网盘链接::提取码(可为空)::文件名 %} +{% audio https://github.com/volantis-x/volantis-docs/releases/download/assets/Lumia1020.mp3 %} +{% video https://github.com/volantis-x/volantis-docs/releases/download/assets/IMG_0341.mov %} + + + +{% link 如何参与项目::http://www.58isp.com/?id=28/::https://photo.yhehe.com/tp/wk.png %} + + +带 {% u 下划线 %} 的文本;带 {% emp 着重号 %} 的文本;带 {% wavy 波浪线 %} 的文本;带 {% del 删除线 %} 的文本 + +键盘样式的文本:{% kbd ⌘ %} + {% kbd D %} + +密码样式的文本:{% psw 这里没有验证码 %} + +各种颜色的标签,包括:{% span red::红色 %}、{% span yellow::黄色 %}、{% span green::绿色 %}、{% span cyan::青色 %}、{% span blue::蓝色 %}、{% span gray::灰色 %}。 + +超大号文字: + +{% span center logo large::Volantis %} {% span center small::A Wonderful Theme for Hexo %} + +{% noteblock::标题(可选) %} + +Windows 10不是為所有人設計,而是為每個人設計 + +{% noteblock done %} +嵌套测试: 请坐和放宽,我正在帮你搞定一切... +{% endnoteblock %} + +{% folding yellow::Folding 测试: 点击查看更多 %} + +{% note warning::不要说我们没有警告过你 %} +{% noteblock bug red %} +我们都有不顺利的时候 +{% endnoteblock %} + +{% endfolding %} +{% endnoteblock %} + +{% checkbox 纯文本测试 %} +{% checkbox checked::支持简单的 [markdown](https://guides.github.com/features/mastering-markdown/) 语法 %} +{% checkbox red::支持自定义颜色 %} +{% checkbox green checked::绿色 + 默认选中 %} +{% checkbox yellow checked::黄色 + 默认选中 %} +{% checkbox cyan checked::青色 + 默认选中 %} +{% checkbox blue checked::蓝色 + 默认选中 %} +{% checkbox plus green checked::增加 %} +{% checkbox minus yellow checked::减少 %} +{% checkbox times red checked::叉 %} + +{% radio 纯文本测试 %} +{% radio checked::支持简单的 [markdown](https://guides.github.com/features/mastering-markdown/) 语法 %} +{% radio red::支持自定义颜色 %} +{% radio green::绿色 %} +{% radio yellow::黄色 %} +{% radio cyan::青色 %} +{% radio blue::蓝色 %} + +-------------- + + +{% timeline %} + +{% timenode 2020-07-24 [2.6.6 -> 3.0](https://github.com/volantis-x/hexo-theme-volantis/releases) %} + +1. 如果有 `hexo-lazyload-image` 插件,需要删除并重新安装最新版本,设置 `lazyload.isSPA: true`。 +2. 2.x 版本的 css 和 js 不适用于 3.x 版本,如果使用了 `use_cdn: true` 则需要删除。 +3. 2.x 版本的 fancybox 标签在 3.x 版本中被重命名为 gallery 。 +4. 2.x 版本的置顶 `top: true` 改为了 `pin: true`,并且同样适用于 `layout: page` 的页面。 +5. 如果使用了 `hexo-offline` 插件,建议卸载,3.0 版本默认开启了 pjax 服务。 + +{% endtimenode %} + +{% timenode 2020-05-15 [2.6.3 -> 2.6.6](https://github.com/volantis-x/hexo-theme-volantis/releases/tag/2.6.6) %} + +不需要额外处理。 + +{% endtimenode %} + +{% timenode 2020-04-20 [2.6.2 -> 2.6.3](https://github.com/volantis-x/hexo-theme-volantis/releases/tag/2.6.3) %} + +1. 全局搜索 `seotitle` 并替换为 `seo_title`。 +2. group 组件的索引规则有变,使用 group 组件的文章内,`group: group_name` 对应的组件名必须是 `group_name`。 +2. group 组件的列表名优先显示文章的 `short_title` 其次是 `title`。 + +{% endtimenode %} + +{% endtimeline %} + +------------------ +不设置任何参数的 {% btn 按钮:: / %} 适合融入段落中。 + +regular 按钮适合独立于段落之外: + +{% btn regular::示例博客::https://xaoxuu.com::fas fa-play-circle %} + +large 按钮更具有强调作用,建议搭配 center 使用: + +{% btn center large::开始使用::https://volantis.js.org/v3/getting-started/::fas fa-download %} + +---------------- +{% btns circle grid5 %} +{% cell xaoxuu::https://xaoxuu.com::https://gcore.jsdelivr.net/gh/xaoxuu/cdn-assets/avatar/avatar.png %} +{% cell xaoxuu::https://xaoxuu.com::https://gcore.jsdelivr.net/gh/xaoxuu/cdn-assets/avatar/avatar.png %} +{% cell xaoxuu::https://xaoxuu.com::https://gcore.jsdelivr.net/gh/xaoxuu/cdn-assets/avatar/avatar.png %} +{% cell xaoxuu::https://xaoxuu.com::https://gcore.jsdelivr.net/gh/xaoxuu/cdn-assets/avatar/avatar.png %} +{% cell xaoxuu::https://xaoxuu.com::https://gcore.jsdelivr.net/gh/xaoxuu/cdn-assets/avatar/avatar.png %} +{% endbtns %} + +----------- +{% btns rounded grid5 %} +{% cell 下载源码::/::fas fa-download %} +{% cell 查看文档::/::fas fa-book-open %} +{% endbtns %} + +{% btns circle center grid5 %} + + + 心率管家 + {% p red::专业版 %} + + + + + 心率管家 + {% p green::免费版 %} + + +{% endbtns %} + + +{% sites only:community_team %} + +{% menu 下拉菜单 %} +{% menuitem 主题源码::https://github.com/volantis-x/hexo-theme-volantis/::fas fa-file-code %} +{% menuitem 更新日志::https://github.com/volantis-x/hexo-theme-volantis/releases/::fas fa-clipboard-list %} +{% menuitem hr %} +{% submenu 有疑问?::fas fa-question-circle %} +{% menuitem 看 FAQ::/faqs/ %} +{% menuitem 看 本站源码::https://github.com/volantis-x/volantis-docs/ %} +{% menuitem 提 Issue::https://github.com/volantis-x/hexo-theme-volantis/issues/ %} +{% endsubmenu %} +{% endmenu %} + + +{% menu 这个是::下拉菜单 %} +(同上) +{% endmenu %} + +{% menu 这个是::下拉菜单::的示例效果。 %} +(同上) +{% endmenu %} + + +{% tabs 页面内不重复的ID %} + +内容 + + +内容ee + +{% endtabs %} + + +{% folding 查看图片测试 %} + +![](https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper/abstract/41F215B9-261F-48B4-80B5-4E86E165259E.jpeg) + +{% endfolding %} + +{% folding cyan open::查看默认打开的折叠框 %} + +这是一个默认打开的折叠框。 + +{% endfolding %} + +{% folding green::查看代码测试 %} +sss +{% endfolding %} + +{% folding yellow::查看列表测试 %} + +- haha +- hehe + +{% endfolding %} + +{% folding red::查看嵌套测试 %} + +{% folding blue::查看嵌套测试2 %} + +{% folding 查看嵌套测试3 %} + +hahaha + +{% endfolding %} + +{% endfolding %} + +{% endfolding %} + + +这是 {% inlineimage https://gcore.jsdelivr.net/gh/volantis-x/cdn-emoji/aru-l/0000.gif %} 一段话。 + +这又是 {% inlineimage https://gcore.jsdelivr.net/gh/volantis-x/cdn-emoji/aru-l/5150.gif::height=40px %} 一段话。 + + +添加描述: + +{% image https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper-minimalist/2020/025.jpg::alt=每天下课回宿舍的路,没有什么故事。 %} + +指定宽度: + +{% image https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper-minimalist/2020/025.jpg::width=400px %} + +指定宽度并添加描述: + +{% image https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper-minimalist/2020/025.jpg::width=400px::alt=每天下课回宿舍的路,没有什么故事。 %} + +设置占位背景色: + +{% image https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper-minimalist/2020/025.jpg::width=400px::bg=#1D0C04::alt=优化不同宽度浏览的观感 %} + + +{% gallery::::one %} +![图片描述](https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper/abstract/B18FCBB3-67FD-48CC-B4F3-457BA145F17A.jpeg) +![图片描述](https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper/abstract/67239FBB-E15D-4F4F-8EE8-0F1C9F3C4E7C.jpeg) +![图片描述](https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper/abstract/00E0F0ED-9F1C-407A-9AA6-545649D919F4.jpeg) +{% endgallery %} + + +{% pandown baidu::https://baidu.com::1234::百度网盘 %} +{% pandown ty::https://example.com::1234::天翼云 %} +{% pandown aliyun::https://example.com::1234::阿里网盘 %} +{% pandown 123::https://example.com::1234::123网盘 %} +{% pandown qn::https://example.com::1234::七牛云 %} +{% pandown github::https://example.com::::Github %} +{% pandown lz::https://example.com::1234::蓝奏云 %} + + +{% sites only:test_demo %} \ No newline at end of file diff --git a/source/_posts/idm永久激活正版.md b/source/_posts/idm永久激活正版.md new file mode 100755 index 0000000..90ff939 --- /dev/null +++ b/source/_posts/idm永久激活正版.md @@ -0,0 +1,15 @@ +--- +title: idm永久激活正版 +date: 2023-12-21 11:36:00 +categories: 学习笔记 +headimg: https://yhehe.com/images/3151334889.png +tags: +- 软件 +--- +>论全球最大的下载器,1DM排第二没人敢排第一了,这款多线程下载器在下载资源时速度包你满意?,最好的方法是用脚本激活,软件能同步到最新,又不用担心说你小子用的dao版?? + +## 软件介绍 ## + +>今天的这个脚本在GitHub上是开源免费的。在使用脚本前,要把之前的版本卸载干净,然后重启电脑,再安装今天的软件。首先去1Dm的官网下载最新版的软件。 +安装完成后不要打开软件,打开脚本,找到“IAS_0.8.cmd”,然后右键“以管理员身份运行” +在跳出的界面,第一项是激活1Dm,我们输入“1”即可。[点击下载](https://github.com/lstprjct/IDM-Activation-Script) \ No newline at end of file diff --git a/source/_posts/一篇水文~.md b/source/_posts/一篇水文~.md new file mode 100755 index 0000000..79b6966 --- /dev/null +++ b/source/_posts/一篇水文~.md @@ -0,0 +1,29 @@ +--- +title: 一篇水文~ +date: 2024-07-10 04:01:00 +categories: 记录生活 +headimg: https://yhehe.com/images/3585035435.jpg #博客封面图 +description: 好久没更新拉,感觉像是过了个世纪没在这里冒泡了。最近店里事情多,一会这一会那的。感觉时间就像长了翅膀,嗖的一下就过去了。白天忙着招呼客人,晚上回到家只想葛优躺,连电脑开机键都快不认识了。 #章的简短描述,概述文章内容,可以用于SEO优化,帮助搜索引擎和用户快速了解文章主题。 +tags: +- 心情 +- 记录 +music: + server: netease # netease, tencent, kugou, xiami, baidu + type: song # song, playlist, album, search, artist + id: 2644174802 # song id / playlist id / album id / search keyword + autoplay: true +--- + +好久没更新拉,感觉像是过了个世纪没在这里冒泡了。最近店里事情多,一会这一会那的。感觉时间就像长了翅膀,嗖的一下就过去了。白天忙着招呼客人,晚上回到家只想葛优躺,连电脑开机键都快不认识了。 + +记得刚开这个博客的时候,那可是雄心壮志,想着要天天更新,分享各种新鲜玩意儿和实用小技巧。结果,现实总是比理想骨感那么一点点。 + +昨晚,我看到了一位朋友的留言,问我怎么这么久没更新。那一刻,心里还真有点不是滋味。躺在床上辗转反侧,想了想,其实不更新的原因挺简单的:一是所谓的忙,二是不知道该写啥。 + +谈及技术,我自知尚属门外汉,既无深邃的洞见,也乏实践的积累,何以撰写出引人入胜的教程或心得?谈及生活,每日的轨迹虽简单重复,却也不乏细微的美好与感悟,只是习惯了匆匆掠过,未曾驻足细品,以至于笔下无物,言之无物。 + +这样的状态,或许正是不少人在网络世界中渐渐淡出的缩影。起初的热情如火,社交网络的繁华景象,最终可能因种种缘由,化作了海洋中的一滴水珠,难觅踪迹。 + +我坚信自己不会成为那样的过客。即便未来的日子里,更新依旧稀疏,这份空间的存在本身,便是一种坚持与自我表达。它是我心灵的避风港,与外界的喧嚣保持着恰到好处的距离,只与那些因网络结缘、心灵相通的朋友,保持着一份不言而喻的默契。 + + diff --git a/source/_posts/万象城开业.md b/source/_posts/万象城开业.md new file mode 100755 index 0000000..166bb1b --- /dev/null +++ b/source/_posts/万象城开业.md @@ -0,0 +1,209 @@ +--- +title: 万象城开业 +date: 2024-12-20 20:33:00 +categories: 记录生活 +headimg: https://yhehe.com/images/1794613199.png +description: 浪~起来 +tags: +- 乱转 +--- + +{% gallery %} +![图片描@述](https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper/abstract/41F215B9-261F-48B4-80B5-4E86E165259E.jpeg) +{% endgallery %} + +# Welcome to Rabbit Hole + +>**🐰 Rabbit Hole微信排版编辑器🕳** 献给「商业内观」的读者们和 Newsletter 的创作者们🚀。 +> +> 献给 The Great Filter 团队正在开展「银河计划✨」的我们🎁。** +> +>献给 🐳 🐇。 +> +>——**派派 👩🏻‍🚀** + +## 1 编辑器简介 + +- 写完即**完成排版**,支持内容和自定义样式 +- 浏览器支持「实时保存」和查看「历史版本」:`点击【功能】→【本地历史】` +- 编辑器在制作过程中引用了 Github 开源项目:[Markdown Nice](https://github.com/mdnice "Markdown Nice"),欢迎大家去 Github 给项目加 Star + +>>更多内容,欢迎访问商业内观的网站:**https://if.zoepi.online/**,或是添加派派的微信 `ZoeB612` 交流反馈。 + +## 2 定制化「你」的微信编辑器 + +默认主题正在「网页右边」展示,如果你想根据你的审美偏好进行调整,欢迎使用`自定义样式`,具体步骤如下: + +1. 点击网页上方的【主题】→ 【自定义】→ 打开【自定义编辑器】,可以随时切换回「默认主题」 +2. 在右边**中括号内**{} 内输入你需要定制化的内容,例如:输入`letter-spacing: 2px; color: #4f4f4f;`则会将字间距和颜色改变。 +3. 如果想要关闭【自定义编辑器】,再次点击【主题】→ 【打开或关闭定制化编辑器】即可 +4. 如果你对 Markdown 的语法不熟悉,可以点击网页上方的【格式】根据排版需求一键生成文字样式 + +🚀 欢迎定制化属于「你」的微信排版编辑器 +🎁 如果删除编辑器里的默认内容后还想阅读到这份教程,你可以通过点击`【功能】→【重置】`后看到它 + +## 3 具体的通用语法 + +### 3.1 标题 + +在文字写书写不同数量的`#`可以完成不同的标题,如下: + +# 一级标题 + +## 二级标题 + +### 三级标题 + +### 3.2 无序列表 + +无序列表的使用,在符号`-`后加空格使用。如下: + +- 无序列表 1 +- 无序列表 2 + - 无序列表 2.1 + - 无序列表 2.2 +- 无序列表 3 + +### 3.3 有序列表 + +有序列表的使用,在数字及符号`.`后加空格后输入内容,如下: + +1. 有序列表 +2. 有序列表 +3. 有序列表 + +### 3.4 粗体和斜体 + +粗体的使用是在需要加粗的文字前后各加两个`*`。 + +而斜体的使用则是在需要斜体的文字前后各加一个`*`。 + +如果要使用粗体和斜体,那么就是在需要操作的文字前后加三个`*`。如下: + +**商业内观** + +_Fall in Rabbit Hole_ + +**_The. Great. Filter._** + + +### 3.5 链接 + +微信公众号仅支持公众号文章链接,即域名为`https://mp.weixin.qq.com/`的合法链接。 + +在编辑器中输入如下内容: +```markdown +- [Juicing Juice 导论](https://mp.weixin.qq.com/s/aMJHXw57oOYzQwGJGdTVag) +- [拼多多的海底世界](https://mp.weixin.qq.com/s/SXE_E3ir_cw-k0_xfFbJMQ) +- [番外|海底世界与「有情众生」](https://mp.weixin.qq.com/s/40jnFIZEHa2MGhEg_-PDkw) +``` + +最终显示效果如下: +- [Juicing Juice 导论](https://mp.weixin.qq.com/s/aMJHXw57oOYzQwGJGdTVag) +- [拼多多的海底世界](https://mp.weixin.qq.com/s/SXE_E3ir_cw-k0_xfFbJMQ) +- [番外|海底世界与「有情众生」](https://mp.weixin.qq.com/s/40jnFIZEHa2MGhEg_-P) + +可以直接点击上方链接访问「商业内观」近期发布的文章。 + +### 3.6 引用 + +引用的格式是在符号 `>` 后面书写文字,文字的内容可以包含标题、链接、图片、粗体和斜体等。 + +一级引用如下: + +> ### 一级引用示例 +> +> 人生是一场自我实现的预言。 +> +>**——欧文·亚隆** + +当使用多个 `>` 符号时,就会变成多级引用 + +>> ### 二级引用示例 +>> +>> 希望派派从城堡的窗户向外看去,海面上总有一艘船,闪闪灯火。 +>> +>> **——鲸鱼** + +>>> ### 三级引用示例 +>> +>> **Know Yourself**. ——德尔斐神谕 + + +### 3.7 分割线 + +可以在一行中用三个以上的减号来建立一个分隔线,同时需要在分隔线的上面空一行。如下: + +--- + +### 3.8 删除线 + +删除线的使用,在需要删除的文字前后各使用两个`~`,如下: + +~~这是要被删除的内容。~~ + +### 3.9 表格 + +可以使用冒号来定义表格的对齐方式,如下: + +| 姓名 | 年龄 | 工作 | +| :--------- | :--: | -----------: | +| 波粒二象性 | 8个月 | 咬电线| +| 小黑猫 | 10岁 | 欺负小白猫 | +| 小白猫 | 10岁 | 欺负兔兔 | + + +## 4. 特殊语法 + +### 4.1 脚注 + +>你可以点击网页上方的【格式】→ 【微信外链转脚注】,一键实现转换。 + +脚注与链接的区别展示如下,请拉到右边最下面观看: + +- 链接:[商业内观](https://if.zoepi.online "商业内观")是一份线上电子杂志。欢迎使用邮箱[订阅](https://rss.zoepi.online "订阅")。 + +- 脚注:[商业内观](穿梭在人类用思维模型构建的商业世界里,却时常想摆渡回到「轴心时代」的宇宙空间站。 "什么是商业内观?")是一份穿梭在人类用思维模型构建的商业世界里,却时常想摆渡回到「轴心时代」的 Newsletter。 + +### 4.2 代码块 + +如果在一个行内需要引用代码,只要用反引号引起来就好,如下: + +Use the `print()` function. + +在需要高亮的代码块的前一行及后一行使用三个反引号,同时**第一行反引号后面表示代码块所使用的语言**,如下: + +```java +// FileName: HelloWorld.java +public class HelloWorld { + public static void main(String[] args) { + System.out.println("Hello,World!"); // + } +} +``` + +## 尾声 + +我想分享下为什么给微信编辑器命名为`Rabbit Hole`。 + +这个名字来源于 Lewis Carroll 创作的《爱丽丝梦游仙境》,故事讲述了一个名叫爱丽丝的小女孩为了追逐一只揣着怀表、会说话的兔子而不慎掉入了兔子洞,从而进入了一个神奇的国度并经历了一系列奇幻冒险的故事。 + +兔子洞(Rabbit Hole)是这个童话故事中,爱丽丝到达另一个世界的「通道」。 + +其实,所有的工具本身只是载体和通道,最重要的是工具背后的人——「你」——你想通过这个工具做什么?想向宇宙和自己传递什么信号? + +工具是重要的,它就像笔与纸相交的地方,虽然只是个非常小的接触点(Rabbit Hole)——**但它先需要是一个点,然后才能延伸成为一条线,接着写成单词、句子、段落和文章。所以,不要小看这个点(工具),它虽然是「线面体」的起点,却蕴藏了无数的可能性。** + +我在 Github 上研究编辑器的初衷非常简单:**我需要用最高效的方式解决排版问题,因为时间对我来说太珍贵了。**(Time waits for no one) + +而如果我在解决的同时,还能将这个方法分享给别人,那其实我是在传递一个很重要的信念:你应该「主动」去寻找到一种更高效的方式,帮助你自己创造出「时间」。 + +写到这里,突然想到一个有趣的「时间虫洞」——如果这份编辑器的「默认教程」会被未来每一个来到 🐰Rabiit Hole🕳 的人看到——那我想偷偷在编辑器里藏下几个小心愿: + +>>愿 T.G.F. 的「银河计划✨」可以顺利落地、为刚毕业的孩子们创造出时间和信息的虫洞 🚀。 +>> +>>愿 🐳 创业之旅一切顺利,🐇 幸福快乐。 +>> +>>愿「商业内观」作为一种存在(being)本身,可以启发更多的人有「意识」的生活和工作。. + +The Journey is the reward. : ) diff --git a/source/_posts/上次去书店应该还是20年前了把.md b/source/_posts/上次去书店应该还是20年前了把.md new file mode 100755 index 0000000..5f50b00 --- /dev/null +++ b/source/_posts/上次去书店应该还是20年前了把.md @@ -0,0 +1,37 @@ +--- +title: 上次去书店应该还是20年前了把 +date: 2024-02-02 11:54:00 +categories: 记录生活 +headimg: https://yhehe.com/images/xhsd/65bcd52fcfd88.jpg +description: 上次去书店找书是很久以前的事情了,当时为了找那本《成都,今夜请将我遗忘》,在朋友家看了几十页,有事没看完,但一直被书的内容情节所吸引,去书店找书,没找到,后来还是看的电子版。 +tags: +- 书店 +--- +上次去书店找书是很久以前的事情了,当时为了找那本《成都,今夜请将我遗忘》,在朋友家看了几十页,有事没看完,但一直被书的内容情节所吸引,去书店找书,没找到,后来还是看的电子版。 + +---------- + +让我想起了当时看《成都,今夜请将我遗忘》这部小说,深感这部作品对人性的深入挖掘和对现代都市生活的真实写照。 + +---------- + +每个角色都有其独特的性格和命运。赵悦、李良、陈重、周卫东等主要人物,他们生活在都市的繁华背后,面对着生活的压力、困境和迷茫。他们的选择和行动,无不反映出人性的复杂和矛盾。 + +---------- + +与《红尘颠倒》相比,《成都,今夜请将我遗忘》更深入地探讨了人性的黑暗面。在这部小说中,没有给爱情留下任何温暖的尾巴,只有主人公对父母亲情的深深眷恋。这种黑暗的描写让人不禁思考:我们生活的世界是否真的如此黑暗?我们是否也应该反思自己的行为和选择? + +---------- + +总的来说,这是一部深入挖掘人性、反映现代都市生活的小说。深思人性的复杂和矛盾,思考现代都市生活的意义和价值。虽然小说中充满了黑暗和无奈,但也正是这种黑暗和无奈,让我们更加珍惜生活中的光明和温暖。我相信,只要我们勇敢地面对生活,一定能找到属于自己的光明和温暖。 + +---------- + +还有听说小说作者慕容雪村已经跑到国外了。。。? +---------- + +![](https://yhehe.com/images/xhsd/2125671714.jpg) +![微信图片_20240202194031.jpg](https://yhehe.com/images/xhsd/65bcd52fcfd88.jpg) +![微信图片_20240202194038.jpg](https://yhehe.com/images/xhsd/65bcd5399171d.jpg) +![微信图片_20240202194048.jpg](https://yhehe.com/images/xhsd/65bcd582ae676.jpg) +![微信图片_20240202194052.jpg](https://yhehe.com/images/xhsd/65bcd58bd7585.jpg) \ No newline at end of file diff --git a/source/_posts/今天冬至.md b/source/_posts/今天冬至.md new file mode 100755 index 0000000..a2082c2 --- /dev/null +++ b/source/_posts/今天冬至.md @@ -0,0 +1,11 @@ +--- +title: 今天冬至 +date: 2023-12-22 10:03:00 +categories: 记录生活 +headimg: https://bu.dusays.com/2024/01/31/65ba42d52ff31.jpg +description: 一直 +tags: +- 节日 +- 画廊 +--- +又到了一年的岁末,冬至吃饺子的传统可不能丢 看着家人围在一起包饺子很是快乐,希望你也是快乐的? diff --git a/source/_posts/今天的收获.md b/source/_posts/今天的收获.md new file mode 100755 index 0000000..24549f6 --- /dev/null +++ b/source/_posts/今天的收获.md @@ -0,0 +1,15 @@ +--- +title: 今天的收获 +date: 2024-01-08 14:28:00 +categories: 记录生活 +headimg: https://yhehe.com/images/3957780053.jpeg +description: 今天和小曹一起吃晚饭,好久未见面了。回想起上次见面是在天气还热的时候,时间过得真是飞快。我们依旧如故,没有太多变化。她的头发变得更长了,让生活自然而然地发展,不去强求什么,只要能开心就好?。 +tags: +- 礼物 +--- +>收获2024年台历一个? + + +今天和小曹一起吃晚饭,好久未见面了。回想起上次见面是在天气还热的时候,时间过得真是飞快。我们依旧如故,没有太多变化。她的头发变得更长了, +让生活自然而然地发展,不去强求什么,只要能开心就好... +![](https://yhehe.com/images/3957780053.jpeg) diff --git a/source/_posts/你是否还记得这些图标.md b/source/_posts/你是否还记得这些图标.md new file mode 100755 index 0000000..1804be1 --- /dev/null +++ b/source/_posts/你是否还记得这些图标.md @@ -0,0 +1,39 @@ +--- +title: 你是否还记得这些图标 +date: 2024-01-23 08:25:00 +categories: 学习笔记 +headimg: https://bu.dusays.com/2024/02/12/65c9cb10f2041.webp +description: 还记得9几年,那时我们常用的软件和打过的游戏吗? +tags: +--- +>还记得9几年,那时我们常用的软件和打过的游戏吗? + +> 那时候我们打Ultima Online、AOE、Red Alert、Warcraft最让我难忘的还是Ultima Online这款游>戏,纯英文的,很难上手,最后无法自拔。 + +> 好了,说说下边这几款都是什么软件吧,也许能勾起你一丝回忆! + +![](https://bu.dusays.com/2024/02/12/65c9cb10f2041.webp) +#### 1、Winamp +要说那时候听歌,你没用过这个软件,那实在是说不过去,我还记的有很多皮肤,我当时最喜欢的是暗夜黑。 +#### 2、ACDSEE +说实话这个软件当时用的不是很多,也不太看图片和编辑,这个老牌软件现在也还在更新,只是体积变大并不怎么好用了。 +#### 3、FlashGet +其实和这个快车同时出现的还有蚂蚁搬家,那个时候下载东西是一件非常漫长的过程,一首4MB左右的音乐要下好几分钟,要是没有个支持断点续传的软件还真的很难过。直到后来ADSL的出现。 +#### 4、RealPlayer +这个看电影的都知道,我记得那时候用它看的就是寻秦记。 +#### 5、MSN Messenger +这个是当时比较火的即使通讯工具,我也稀奇下了一个并申请了一个ID,记得好像是需要hotmail邮箱,上去加好友都需要知道EMIAL才行。后来也没用了,为啥?没好友啊!! +#### 6、瑞星 +在那个充满病毒的网络世界,你没个杀毒工具还真不行,CIH这个病毒听过吧,啥?没听过,那证明你还没和和老?年轻娃娃。 +#### 7、BitComet +哎说实话 用它就是下点成人看的东西,你懂吧~ +#### 8、智能ABC +当时来说这个是非常不错的中文输入工具了,比微软拼音要好用的多,不能用现在标准去说他不够智能对吧,否则你也不会用它了 +#### 9、腾讯浏览器 +这个有点勉强,按理说可以代替它的还有很多软件,我是没怎么用,到现在我页不用它。 + +> 说到这里,我又想到了很多软件,比如:《电驴》这款软件让我下载很多高清的国外电影,那时候还需要去下字幕,记得好像叫射手字幕网。 +《ICQ》你还记得吗?打字还有嗒嗒嗒的声音,那时候还没有QQ这个软件,后来就是直接搬过来用的。 + +>其实还有很多很多,满满的回忆。是不是人老了就开始喜欢回忆了呢 + diff --git a/source/_posts/元宵节快乐.md b/source/_posts/元宵节快乐.md new file mode 100755 index 0000000..7069962 --- /dev/null +++ b/source/_posts/元宵节快乐.md @@ -0,0 +1,14 @@ +--- +title: 元宵节快乐 +date: 2024-02-24 02:49:00 +categories: 记录生活 +headimg: https://yhehe.com/images/1794613199.png +description: 元宵节快乐 +tags: +- 节日 +--- + + +>今天是元宵节,记得吃元宵哦:^(呲牙) +> 吃完元宵也就是说,年算是彻底过完啦。 +> 新的一年让我们继续努力,撸起袖子加油干:[呲牙笑] diff --git a/source/_posts/几款工具下载.md b/source/_posts/几款工具下载.md new file mode 100755 index 0000000..65eecb7 --- /dev/null +++ b/source/_posts/几款工具下载.md @@ -0,0 +1,18 @@ +--- +title: 几款工具下载 +date: 2023-12-26 03:11:00 +categories: 学习笔记 +headimg: https://bu.dusays.com/2024/01/31/65ba47af4a580.png +tags: +- 软件 +--- + +### 1.微软电脑管家海外版:【[前往下载](https://pcmanager.microsoft.com/en-us)】 + +### 2.Duplicates Cleaner 去重复文件:【[前往下载](https://apps.microsoft.com/detail/9PMXPZ18CZ49?hl=zh-cn&gl=US)】 + +### 3.Adob??e Photoshop Express:【[前往下载](https://apps.microsoft.com/detail/9WZDNCRFJ27N?hl=zh-cn&gl=LK)】 + +### 4.SomaFM 无广告音乐平台:【[前往下载](https://apps.microsoft.com/detail/9NTXZ19JFTR3?hl=zh-cn&gl=US)】 + +### 5.Mouse Pointer Highlight 鼠标高亮:【[前往下载](https://apps.microsoft.com/detail/9P7SB9S4RQ7Z?hl=zh-cn&gl=US)】 diff --git a/source/_posts/利用宝塔面板和PHP实现Typecho定时推送链接到百度.md b/source/_posts/利用宝塔面板和PHP实现Typecho定时推送链接到百度.md new file mode 100755 index 0000000..f0a8208 --- /dev/null +++ b/source/_posts/利用宝塔面板和PHP实现Typecho定时推送链接到百度.md @@ -0,0 +1,50 @@ +--- +title: 利用宝塔面板和PHP实现Typecho定时推送链接到百度 +date: 2024-03-01 03:37:00 +categories: 学习笔记 +headimg: https://yhehe.com/images/1370160430.jpg +description: 网站SEO是一个网站的痛点,虽然没有很好的SEO技术,但是最基础的百度推送还是要做的,这里就是一个实现定时自动推送你网站sitemap到百度的方法,管不管用谁也说不准,但是做了总比不做的好 +tags: + - 宝塔 + - seo +--- + +网站SEO是一个网站的痛点,虽然没有很好的SEO技术,但是最基础的百度推送还是要做的 +这里就是一个实现定时自动推送你网站sitemap到百度的方法,管不管用谁也说不准,但是做了总比不做的好 +一、 编写PHP文件 +在网站根目录创建一个php文件添加以下内容 +``` +"; + $url[]= $value_array['url'][$i]['loc']; +} +$api ='百度站长的推送接口'; +$ch = curl_init(); +$options = array( + CURLOPT_URL => $api, + CURLOPT_POST => true, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_POSTFIELDS => implode("\n",$url), + CURLOPT_HTTPHEADER => array('Content-Type:text/plain'), +); +curl_setopt_array($ch, $options); +$result =curl_exec($ch); +echo $result; + +?> +``` +百度站长平台:https://ziyuan.baidu.com/dashboard/index +在百度站长中打开自己的网站( 注意: 这里的网站一定要跟你推送的网站一致 ) +复制推送接口到上面的代码里,然后在浏览器中访问,出现以下结果说明配置成功 +接下来就是定时推送到百度 +首先,打开 宝塔面板-计划任务 ,然后添加计划任务 +任务类型:访问 URL +任务名称:随意填写 +执行周期:随意(建议 6 小时,一天 4 次) +URL 地址:你的域名 / 文件名 .php(例如:https://blog.yhehe.com/baidu.php) \ No newline at end of file diff --git a/source/_posts/升级 升级 升级.md b/source/_posts/升级 升级 升级.md new file mode 100755 index 0000000..fa85947 --- /dev/null +++ b/source/_posts/升级 升级 升级.md @@ -0,0 +1,11 @@ +--- +title: 升级 升级 升级 +date: 2024-02-18 03:49:00 +categories: 记录生活 +headimg: https://yhehe.com/images/143624192.jpg +description: 我实在是接受不了速度贼慢的网页,哎,奈何我的BLOG就是,无奈之下去升级了带宽,现在看看确实是钱花到哪里 哪就好~ +tags: +- 服务器 +--- + +我实在是接受不了速度贼慢的网页,哎,奈何我的BLOG就是,无奈之下去升级了带宽,现在看看确实是钱花到哪里 哪就好~ diff --git a/source/_posts/华为手表-非凡大师.md b/source/_posts/华为手表-非凡大师.md new file mode 100755 index 0000000..0d10625 --- /dev/null +++ b/source/_posts/华为手表-非凡大师.md @@ -0,0 +1,12 @@ +--- +title: 华为手表-非凡大师 +date: 2024-03-01 12:26:00 +categories: 记录生活 +headimg: https://yhehe.com/images/8072931.jpg +description: 看着外形还可以,功能多多,跑步的时候测测心率什么的,能连接蓝牙耳机,很鸡肋我觉得,直接连手机不就行了嘛,反正离开手机,他基本也没啥用了,个人觉得。 +tags: +- 华为 +- 手表 +--- +看着外形还可以,功能多多,跑步的时候测测心率什么的 +能连接蓝牙耳机,很鸡肋我觉得,直接连手机不就行了嘛,反正离开手机,他基本也没啥用了,个人觉得。 diff --git a/source/_posts/印度阿三.md b/source/_posts/印度阿三.md new file mode 100755 index 0000000..a2dee31 --- /dev/null +++ b/source/_posts/印度阿三.md @@ -0,0 +1,17 @@ +--- +title: 印度阿三 +date: 2024-03-31 02:14:24 +categories: 记录生活 +headimg: https://yhehe.com/images/ydas/2298008444.jpg #博客封面图 +description: 昨晚喝朋友去吃了一家印度馆子,味道还可以。就是整个餐厅的气味有点问题。吃完,撤。 +tags: +- 吃吃吃 +--- +昨晚喝朋友去吃了一家印度馆子,味道还可以。就是整个餐厅的气味有点问题。吃完,撤。 +![微信图片_20240331101220.jpg](https://yhehe.com/images/ydas/2298008444.jpg) +![微信图片_20240331101227.jpg](https://yhehe.com/images/ydas/1069602030.jpg) +![微信图片_20240331101236.jpg](https://yhehe.com/images/ydas/1390391495.jpg) +![微信图片_20240331101240.jpg](https://yhehe.com/images/ydas/3638197849.jpg) +![微信图片_20240331101243.jpg](https://yhehe.com/images/ydas/3029532758.jpg) +![微信图片_20240331101253.jpg](https://yhehe.com/images/ydas/229762072.jpg) + diff --git a/source/_posts/又下雪了.md b/source/_posts/又下雪了.md new file mode 100755 index 0000000..b80a10a --- /dev/null +++ b/source/_posts/又下雪了.md @@ -0,0 +1,19 @@ +--- +title: 又下雪了 +date: 2024-01-16 05:26:00 +categories: 记录生活 +headimg: https://yhehe.com/images/3032842933.jpg +description: 下雪天,坐地铁去店里,带着耳机沉浸在音乐里,很舒服。 +tags: +- 雪 +- 记录 +--- + +>下雪天,坐地铁去店里,带着耳机沉浸在音乐里,很舒服。 + +{% audio http://music.163.com/song/media/outer/url?id=17617367.mp3 %} +{% video https://yhehe.com/music/2929110160.mp4 %} +![微信图片_20240115132504.jpg](https://yhehe.com/images/3032842933.jpg) +![微信图片_20240117093740.jpg](https://yhehe.com/images/1249358914.jpg) +![微信图片_20240117093746.jpg](https://yhehe.com/images/1437574502.jpg) + diff --git a/source/_posts/后会无期--邓紫棋.md b/source/_posts/后会无期--邓紫棋.md new file mode 100755 index 0000000..ea2239c --- /dev/null +++ b/source/_posts/后会无期--邓紫棋.md @@ -0,0 +1,17 @@ +--- +title: 后会无期--邓紫棋 +date: 2024-02-24 09:57:00 +categories: 记录生活 +headimg: https://yhehe.com/images/1160243444.jpg +description: 有一天当你发现,你做什么都不对的时候,其实,不是你错了,是一份关系到头了。 当一辆车消失天际 当一个人成了迷 你不知道Ta为何离去 就算你不知道,这也是结局 +tags: +- 音乐 +--- + +{% audio https://yhehe.com/music/2776462800.mp3 %} +有一天当你发现,你做什么都不对的时候, +其实,不是你错了,是一份关系到头了。 +> 当一辆车消失天际 +> 当一个人成了迷 +> 你不知道Ta为何离去 +> 就算你不知道,这也是结局 \ No newline at end of file diff --git a/source/_posts/听首歌吧.md b/source/_posts/听首歌吧.md new file mode 100755 index 0000000..b7a369f --- /dev/null +++ b/source/_posts/听首歌吧.md @@ -0,0 +1,22 @@ +--- +title: 听首歌吧 +date: 2024-05-09 04:14:00 +categories: 记录生活 +headimg: https://yhehe.com/images/2609559317.jpeg #博客封面图 +description: 一个好久没联系的女人给我发信息说,5月25号在咸阳有张惠妹的演唱会想让我陪她去。看我一直没回信息,又说了句打扰了。我前一晚上喝酒到4点才睡,早上给我发信息我还在梦里。起来后给回了一句,怎么想到我了。 +tags: + - 音乐 +--- +

      {% audio https://yhehe.com/music/186230543.mp3 %}

      +一个好久没联系的女人给我发信息说,5月25号在咸阳有张惠妹的演唱会想让我陪她去。 +看我一直没回信息,又说了句打扰了。 +我前一晚上喝酒到4点才睡,早上给我发信息我还在梦里。 +起来后给回了一句,怎么想到我了。 +靠,说觉得我时间多,比较自由,不用带孩子什么的。 +我说好吧,把我信息发给她,她说先抢票。 +又问抢多钱的,我说随便啊 反正你叫我,你抢票,你也买单。哈哈 +后来截屏给我看抢到了。还好是晚上7点半的。不耽误啥事。我把票钱转给她,也就1千多,她一直没收,说请我。 +顺便问了一句,大屏幕要是出现咱俩,咱俩是亲还是不亲呢。她哈哈大笑,亲啊 必须亲。 +靠,哥们是随便的人吗,那天去一定要记得戴上帽子。 +那就期待一下把,也好久没去看过演唱会了。 +何况还是我喜欢的一位歌手,阿妹。 diff --git a/source/_posts/圣诞节.md b/source/_posts/圣诞节.md new file mode 100755 index 0000000..20a3c60 --- /dev/null +++ b/source/_posts/圣诞节.md @@ -0,0 +1,16 @@ +--- +title: 圣诞节🎄 +date: 2023-12-25 14:34:00 +categories: 记录生活 +headimg: https://bu.dusays.com/2024/01/31/65ba46cc18333.jpg +description: 女孩,我不认识,随手拍的一张照片而已 +tags: +- 节日 +--- +> 女孩,我不认识,随手拍的一张照片而已 + +![微信图片_20240131210653.jpg](https://bu.dusays.com/2024/01/31/65ba46cc18333.jpg) +![微信图片_20240131210659.jpg](https://bu.dusays.com/2024/01/31/65ba46d45be2a.jpg) +![微信图片_20240131210705.jpg](https://bu.dusays.com/2024/01/31/65ba46eb37d16.jpg) +![微信图片_20240131210719.jpg](https://bu.dusays.com/2024/01/31/65ba46f62ed63.jpg) +![微信图片_20240131210727.jpg](https://bu.dusays.com/2024/01/31/65ba46ff77f66.jpg) \ No newline at end of file diff --git a/source/_posts/地震来了 我睡着了.md b/source/_posts/地震来了 我睡着了.md new file mode 100755 index 0000000..053565f --- /dev/null +++ b/source/_posts/地震来了 我睡着了.md @@ -0,0 +1,13 @@ +--- +title: 地震来了 我睡着了? +date: 2023-12-19 13:55:00 +categories: 记录生活 +headimg: https://bu.dusays.com/2024/01/31/65ba41b6db588.jpg # 缩略图路径 +tags: +- 地震 +--- + +早上起来看到手机推送的消息,昨晚发生在甘肃积石山县的6.2级地震,已造成甘肃100人死亡,青海11人死亡,交通、水电、通讯受损。 +对于早睡的是一点感觉都么有,早上起来看了一下朋友圈,发现大家都说地震了,西安、成都的朋友们说震感强烈,对于在寒冬的深夜发生这样的事情可以说真的是操蛋,我看到朋友圈很多年轻人都跑了出去,着急的衣服都没穿?。 +大震你跑不掉,小震你也不用跑,一切都要随缘。我反正是不会跑?我做到的就是过好每一天,坦然去面对一切,接受一切!即使是死亡。 +事事难料,望你不再焦虑,不再攀比,自然舒心的活着,比什么都重要! \ No newline at end of file diff --git a/source/_posts/城墙一角.md b/source/_posts/城墙一角.md new file mode 100755 index 0000000..f00a331 --- /dev/null +++ b/source/_posts/城墙一角.md @@ -0,0 +1,11 @@ +--- +title: 城墙一角 +date: 2023-12-17 09:24:00 +categories: 记录生活 +urlname: 8 +tags: +- 随拍 +--- +今天骑摩托车到太华路立交桥时拍的 还是很漂亮的? + +![微信图片_20240131203446.jpg](https://bu.dusays.com/2024/01/31/65ba3e9353ae5.jpg) \ No newline at end of file diff --git a/source/_posts/域名购买成功.md b/source/_posts/域名购买成功.md new file mode 100755 index 0000000..7b8ac09 --- /dev/null +++ b/source/_posts/域名购买成功.md @@ -0,0 +1,12 @@ +--- +title: 域名购买成功 +date: 2024-02-20 04:47:00 +categories: 记录生活 +headimg: https://yhehe.com/images/1016492437.png +description: 一直在关注这个域名,现在终于买到手啦,开心:w(吐舌) ,备完案就可以使用啦~ +tags: +- 域名 +--- + +### 一直在关注这个域名,现在终于买到手啦,开心:w(吐舌) ,备完案就可以使用啦~ +### 这次一定要坚持把blog做下去,给将来增添一点回忆 \ No newline at end of file diff --git a/source/_posts/夜逛西安电影厂.md b/source/_posts/夜逛西安电影厂.md new file mode 100755 index 0000000..452a1bc --- /dev/null +++ b/source/_posts/夜逛西安电影厂.md @@ -0,0 +1,38 @@ +--- +title: 夜逛西安电影厂 +date: 2024-06-14 09:26:00 +categories: 记录生活 +headimg: https://yhehe.com/images/1289050677.jpg #博客封面图 +description: 西安电影制片厂,因为离的近,以前小的时候经常溜进去,玩各种道具。被抓住了就给人家扫地打扫卫生算是惩罚。 +tags: +--- +>#### 西安电影制片厂,因为离的近,以前小的时候经常溜进去,玩各种道具。被抓住了就给人家扫地打扫卫生算是惩罚。一转眼,老厂房都被魔改了,有酒吧、餐厅、咖啡等,似乎多了一些文艺范。搬走以后好像也不太走这条路了,今天路过,又没啥事,进去转转吧。 + +![微信图片_20240614171120.jpg](https://yhehe.com/images/3668127288.jpg) +![微信图片_20240614171201.jpg](https://yhehe.com/images/2708752772.jpg) +![微信图片_20240614171202.jpg](https://yhehe.com/images/2005928414.jpg) +![微信图片_20240614171203.jpg](https://yhehe.com/images/4174296041.jpg) +![微信图片_20240614171204.jpg](https://yhehe.com/images/4098673435.jpg) +![微信图片_202406141712001.jpg](https://yhehe.com/images/4027661787.jpg) +![微信图片_202406141712011.jpg](https://yhehe.com/images/3460684823.jpg) +![微信图片_202406141712021.jpg](https://yhehe.com/images/2159988775.jpg) +![微信图片_202406141712022.jpg](https://yhehe.com/images/551291610.jpg) +![微信图片_202406141712041.jpg](https://yhehe.com/images/434845943.jpg) + +---------- +> #### 逛完饿了咋办,吃吃吃~俄罗斯饭馆,味道还真可以,尤其是烤肉。。。 + +![微信图片_20240614171206.jpg](https://yhehe.com/images/1940261270.jpg) +![微信图片_202406141712052.jpg](https://yhehe.com/images/3720919279.jpg) +![微信图片_202406141712053.jpg](https://yhehe.com/images/267053218.jpg) + +---------- +> #### 吃饱了,酒吧传来的歌声成功的吸引了我,走,,,去看看 + +![微信图片_20240614171205.jpg](https://yhehe.com/images/710260381.jpg) +![微信图片_202406141712043.jpg](https://yhehe.com/images/3629227640.jpg) +![微信图片_202406141712051.jpg](https://yhehe.com/images/3717301590.jpg) + + + + diff --git a/source/_posts/大皮院高家烤肉.md b/source/_posts/大皮院高家烤肉.md new file mode 100755 index 0000000..26d1bcc --- /dev/null +++ b/source/_posts/大皮院高家烤肉.md @@ -0,0 +1,13 @@ +--- +title: 大皮院高家烤肉 +date: 2023-12-23 13:21:00 +categories: 记录生活 +headimg: https://bu.dusays.com/2024/01/31/65ba4580ed338.jpg #博客封面图 +description: 今天去朋友的老爸店铺装个监控,能完 我提议去吃七路的马虎面,大家一听坚决反对?晚上吃啥面呢,去坊上看看吃啥?,最后选择了高家烤肉。很久没来吃了,今天一去人还是那么多,馄饨必点,烤肉、烤筋、鸡翅还是可以的,你就美美地咥,陕西美食就撩咋咧? +tags: +- 吃喝 +--- +>今天去朋友的老爸店铺装个监控,能完 我提议去吃七路的马虎面,大家一听坚决反对?晚上吃啥面呢,去坊上看看吃啥?,最后选择了高家烤肉。 +很久没来吃了,今天一去人还是那么多,馄饨必点,烤肉、烤筋、鸡翅还是可以的,你就美美地咥,陕西美食就撩咋咧? + +![微信图片_20240131210450.jpg](https://bu.dusays.com/2024/01/31/65ba4580ed338.jpg) \ No newline at end of file diff --git a/source/_posts/天灵灵地灵灵.md b/source/_posts/天灵灵地灵灵.md new file mode 100755 index 0000000..f88ca22 --- /dev/null +++ b/source/_posts/天灵灵地灵灵.md @@ -0,0 +1,12 @@ +--- +title: 天灵灵地灵灵 +date: 2024-01-26 11:40:00 +categories: 记录生活 +headimg: https://bu.dusays.com/2024/01/26/65b39a0c6b672.jpg +description: 今天收到一枚果子,我真的没吃过,听说是人参果,不知道吃了会不会变身? +tags: +- 礼物 +--- +>今天收到一枚果子,我真的没吃过,听说是人参果,不知道吃了会不会变身? + +![人参果](https://bu.dusays.com/2024/01/26/65b39a0c6b672.jpg) \ No newline at end of file diff --git a/source/_posts/失而复得.md b/source/_posts/失而复得.md new file mode 100755 index 0000000..220ef31 --- /dev/null +++ b/source/_posts/失而复得.md @@ -0,0 +1,18 @@ +--- +title: 失而复得 #标题 +date: 2024-11-16 # 发布时间 +tags: 学习,hexo #标签 +headimg: https://yhehe.com/images/sefd.webp #博客封面图 +description: 今天给家人送了三件快递,回到家才发现少了一件!一路骑着电动车,估计是路上掉了。哎,谁让自己一路吹着口哨,看着美女,没留神呢。 +author: hehe #作者名称 +categories: 记录生活 #分类 +--- +今天给家里送了三件快递,回到家一数,咋变成两件了?合着我一路骑电动车,吹着口哨,还盯着路边美女,直接把快递给整丢了。真是人还在,快递没了,心里瞬间有点抓狂。 + +送完之后,我硬着头皮又原路杀了回去。结果在一个拐弯处的树台上,居然看到我丢的快递稳稳地躺着!我心想,这也太神了吧?这肯定是被哪个热心人捡起来,顺手放台子上的。我自己掉的,还能蹦台上去? + +这一刻,我不由得对国民素质肃然起敬。连我随手丢的烟头都特意找个垃圾桶扔了,而人家捡个快递还能这么讲究,真是个明白人! + +想起前两天珠海的惨案,一股复杂的情绪涌上心头:社会这是怎么了?好人随处可见,坏人也时不时冒出来。一边是温暖人心的海水,一边是让人窝火的烈焰,搁谁都得感慨一句:“人生如戏,全靠搭配。” + +归根结底,还是那句老话:做好自己就行。不给别人添乱,不祸害他人,也别跟这社会过不去。活得明白点,活得自在点,这才是王道! diff --git a/source/_posts/好玩的网站.md b/source/_posts/好玩的网站.md new file mode 100755 index 0000000..ef3cb8a --- /dev/null +++ b/source/_posts/好玩的网站.md @@ -0,0 +1,37 @@ +--- +title: 一些好玩的网站~ +date: 2025-01-20 04:01:00 +categories: 学习笔记 +headimg: https://yhehe.com/images/yq.png #博客封面图 +description: 这些好玩得离谱的网页,每一个都让你觉得有趣。 #章的简短描述,概述文章内容,可以用于SEO优化,帮助搜索引擎和用户快速了解文章主题。 +tags: +- 心情 +- 记录 +music: + server: netease # netease, tencent, kugou, xiami, baidu + type: song # song, playlist, album, search, artist + id: 2644174802 # song id / playlist id / album id / search keyword + autoplay: true +--- + + +>全在这,自提 + +动漫出处:https://trace.moe +在线修图:https://reurl.cc/8XzObj +压缩图片:https://picsmaller.com +拯救老照片:https://jpghd.com/zh +美化截图:https://pretty-snap.iwhy.dev +反向词典:https://www.shenyandayi.com +现代古诗词:https://aspoem.com/zh-Hans +翻译神器:https://reurl.cc/8XzO64 +中英混阅:https://mixread.blemon.net +打字练习:https://reurl.cc/kykQqq +打字练习2:https://reurl.cc/bYqy7r +番茄钟:https://reurl.cc/Klqvep +歌单转文字:https://music.unmeta.cn +导入歌单:https://reurl.cc/4dqGrj +声音博物馆:https://reurl.cc/dy9vyz +森林之音:https://www.tree.fm +公共领域电台:http://publicdomainradio.org/de/index.html +屏幕常亮:https://www.keepscreenon.com/?utm_source=appinn.com \ No newline at end of file diff --git a/source/_posts/如何更高效的使用Google 搜索.md b/source/_posts/如何更高效的使用Google 搜索.md new file mode 100755 index 0000000..8fe9e3d --- /dev/null +++ b/source/_posts/如何更高效的使用Google 搜索.md @@ -0,0 +1,64 @@ +--- +title: 如何更高效的使用Google 搜索 +date: 2024-03-18 02:59:00 +categories: 学习笔记 +headimg: https://yhehe.com/images/4253447116.jpg #博客封面图 +description: 当我们按照惯常的习惯在Google上搜索的时候,实际上我们使用的是浅搜索。 这样得到的搜索结果可能会包括你的搜索查询里没有的词。但如果你将自己的查询请求或者问题(词汇或者短语)用引号打包,像这样 —— "你的问题",Google就会进入深度搜索模式。这样的搜索结果会包含所有在引号内你的搜索问题里的词汇。当你需要在搜索结果中呈现出某个特定的词汇或者短语的时候,这个方法就十分有用。 +tags: + - 搜素 + - 教程 +--- + +## 1. 使用引号来获得“完全一致”的匹配搜获 +当我们按照惯常的习惯在Google上搜索的时候,实际上我们使用的是浅搜索。 这样得到的搜索结果可能会包括你的搜索查询里没有的词。 + +但如果你将自己的查询请求或者问题(词汇或者短语)用引号打包,像这样 —— "你的问题",Google就会进入深度搜索模式。这样的搜索结果会包含所有在引号内你的搜索问题里的词汇。 + +当你需要在搜索结果中呈现出某个特定的词汇或者短语的时候,这个方法就十分有用。 + +## 2. 使用 site: 在特定网站搜索 +如果你希望Google返回的搜索结果是来自某个特定的网站,仅需要在你的搜索问题前添加site: 。 + +当你想要在某个没有内置搜索选项的网站,或者内置搜索不太好用的网站进行搜索的时候,这个方法可以派上用场。 + +假设,你的搜索问题是 site:freecodecamp.org react, 返回的搜索结果仅会是来自www.freecodecamp.org 关于React的话题。 + +## 3. 使用-在搜索结果中排除某个词汇 +如果你不希望自己的搜索结果中出现某个词汇或者短语,可以在那个单词前添加 - 。 + +假设你的搜索内容是 => how to write components in React -class(如何编写React组件 -class),返回的搜索结果会不包含“class”。所以, (如果你了解一点React),你会发现搜索结果只包含函数式组件。 + +## 4. 使用imagesize:搜索特定大小的图片 +如果你想搜索特定大小的图片,可以在你的搜索查询中使用imagesize:标签,并且标注好以pixels(像素) 为单位的宽和高。 + +尺寸仅以 pixels 为单位 – 例如:imagesize:500x500的搜索结果是尺寸为 500px x 500px的图片。 所以如果搜索查询是 => "cute dog images imagesize:500x600"(可爱小狗图片 imagesize:500*600)的搜索结果是尺寸为500px x 600px的可爱小狗的图片。 + +## 5. 使用filetype:搜索特定文件类型 +如果你希望搜索的结果包含了某个特定的文件类型,如:PDF或者PPT,就可以添加filetype:<扩展名>(不需要尖括号)。 如,react tutorial filetype:pdf(react教学 filetype:pdf)的搜索结果是PDF格式的。 + +## 6. 在搜索中使用通配符* +如果你不确定搜索查询/问题或者忘记了其中的词汇,你可以在搜索中使用通配符*,Google会用相关的词汇来替换通配符。 + +例如,如果你搜索 => the * of money(钱的 *),会产生如下结果。 Google会返回一系列搜索页面,包括 "the exchange of money"(金钱交易)、 "the use of money"(金钱的用途)、 "the role of money"(金钱的角色)、 "the psychology of money"(金钱心理学)等。 + +## 7. 使用 OR(或)、 AND(且)逻辑合并搜索 +如果你希望搜索结果包含两个词汇,可以在其中使用AND 关键字。例如,你搜索=> React AND Angular, Google会返回即包含React,又包含Angular的结果。 + +同样的,如果你希望搜索结果包含两个词汇中的任意一个, 可以在其中使用 OR 关键字。 例如,你搜索 => React OR Angular,Google会返回包含React或者Angular的结果,甚至包含两者的结果。 + +## 8. 在两个数字间使用 AFTER:(在……之后)、 BEFORE:(在……之前) 或 .. 来筛选结果 +如果你希望Google的搜索结果是发布在特定年份之后的,你可以使用AFTER:标签。例如,你搜索 => React tutorials AFTER:2020(React教程 AFTER:2020)会返回迟于2020年发布的结果。 + +同样的,如果添加BEFORE: 标签,会返回早于某个特定年份的结果。 + +你也可以搜索发布在某个年份范围内的结果,或者介于两个数字之间的任意事物。仅在两个数字之间添加 ..即可,如果有计算单位,也可以添加计算单位。 + +## 9. 使用 related:查询相关网站 +如果你想知道和某个特定网站相关的其他网站,可以使用related:标签。 + +例如,你搜索 related:google.com 就会得到所有和Google类似的网站,如:Bing、Yahoo、DuckDuckGo等。 + +## 10. 使用cache:查看Google对某个网站的缓存版本 +Google提供网站的缓存版本以提高搜索速度。想要知道Google是否缓存了某个网站,可以在网站URL前面添加cache:。 + +这一招对于web开发来说非常管用,可以检查现在浏览的到底是Google缓存的网站,还是提交了一些修改之后的最近版本的网站。 例如,在写这篇教程的时候(2024年3月18日)搜索 => cache:yhehe.com \ No newline at end of file diff --git a/source/_posts/学习如何在几分钟内创建一个 Hugo FixIt站点。.md b/source/_posts/学习如何在几分钟内创建一个 Hugo FixIt站点。.md new file mode 100755 index 0000000..a2c3182 --- /dev/null +++ b/source/_posts/学习如何在几分钟内创建一个 Hugo FixIt站点。.md @@ -0,0 +1,72 @@ +--- +title: 学习如何在几分钟内创建一个 Hugo FixIt站点 +date: 2024-07-24 04:17:00 +categories: 学习笔记 +headimg: https://yhehe.com/images/hugo.png #博客封面图 +description: 如果这是您第一次使用Hugo,我们强烈建议你通过这个[适合初学者的优秀文档来了解更多信息。 #章的简短描述,概述文章内容,可以用于SEO优化,帮助搜索引擎和用户快速了解文章主题。 +tags: + - hugo + - 教程 +--- + + +## 先决条件 + +> 如果这是您第一次使用Hugo,我们强烈建议你通过这个[适合初学者的优秀文档来了解更多信息。](https://gohugo.io/getting-started/) + +### 在开始本教程之前,您必须: + +[安装 Hugo](https://gohugo.io/getting-started/installing/)(扩展版,v0.127.0或更高版本) +[安装 Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) +您还必须能够熟练地使用命令行进行工作。 + +### 第一种方式 + +>1.你可以直接在GITHUB 上下载最新的压缩文件,比如:hugo_0.139.2_linux-amd64.tar.gz +2.下载后,上传到服务器的环境变量文件夹下。比如:/usr/local/bin/hugo +3.创建网站文件夹 ,比如:wwwroot/hugo,进入HUGO文件夹后再创建一个存放博客文件的文件夹,输入命令:hugo new site blog +4.进入blog文件夹后执行:先执行git init 再hugo server 如果报错运行一次GIT提交 git add . git commit -m "Initial commit" 这将使您至少有一个提交记录,Hugo 就能读取 Git 日志了。或者禁用GIT 信息功能,可以在您的配置文件(例如 config.toml)中禁用 Git 信息功能。具体来说,您可以将 enableGitInfo 设置为 false: +5.创建网站:反代http://127.0.0.1:1313 运行目录选择public +6.用 which 命令检查一下 hugo 在不在 PATH 环境变量中。which hugo +7.运行成功后。使用进程守护,将HUGO保持在运行状态。 + + +>查看 hugo 可执行文件的存放位置 +>which hugo +>/usr/local/bin/hugo + + + +>验证您是否已安装 Hugo v0.127.0 或更高版本。 +``` +hugo version +``` + +###### 启动 Hugo 的开发服务器来查看该站点。 +``` +hugo server +``` + +按下Ctrl + C即可停止 Hugo 的开发服务器。 + +## 添加内容 + +向您的网站添加新页面。 +``` +hugo new content posts/my-first-post.md +``` +``` +Hugo 在content/posts目录中创建了该文件。使用编辑器打开该文件。 +``` +``` +--- +title: My First Post +date: 2024-03-01T17:10:04+08:00 +draft: true +... +--- +``` + + + + diff --git a/source/_posts/小聚.md b/source/_posts/小聚.md new file mode 100755 index 0000000..ba505f9 --- /dev/null +++ b/source/_posts/小聚.md @@ -0,0 +1,12 @@ +--- +title: 小聚 +date: 2024-02-27 03:35:00 +categories: 记录生活 +headimg: https://yhehe.com/images/xiaoj/1041916829.jpg +tags: +- 聚会 +--- + 手机再多的言语,不如见一面,相视一笑 +![IMG_5551.JPG](https://yhehe.com/images/xiaoj/1041916829.jpg) +![IMG_5552.JPG](https://yhehe.com/images/xiaoj/3679789941.jpg) +{% video https://yhehe.com/images/xiaoj/2105756945.mp4 %} diff --git a/source/_posts/山海CLUB.md b/source/_posts/山海CLUB.md new file mode 100755 index 0000000..69045a4 --- /dev/null +++ b/source/_posts/山海CLUB.md @@ -0,0 +1,17 @@ +--- +title: 山海CLUB +date: 2024-01-28 03:08:00 +categories: 记录生活 +headimg: https://yhehe.com/images/shanhai/65b76ae3ba9c9.jpg +description: 周末小聚,听咚咚,看 MM?!以前压根听不进去的 rap,随张年龄增长,竟然慢慢还给喜欢上了,目前喜欢听 VAVA 和万妮达的,觉得 RAP 的节奏很好,RAP 向来主张的就是词,现在觉得是比情歌听起来舒服,有一种态度很重要:)(ku) +tags: +- 吃喝 +--- +{% audio http://music.163.com/song/media/outer/url?id=507114512.mp3 %} +>周末小聚,听咚咚,看 MM?!以前压根听不进去的 rap,随张年龄增长,竟然慢慢还给喜欢上了,目前喜欢>听 VAVA 和万妮达的,觉得 RAP 的节奏很好,RAP 向来主张的就是词,现在觉得是比情歌听起来舒服,有一>种态度很重要. + + +![](https://yhehe.com/images/shanhai/65b76ade0e508.jpg) +![](https://yhehe.com/images/shanhai/65b76ae3ba9c9.jpg) +![](https://yhehe.com/images/shanhai/65b76ae871cc5.jpg) +![](https://yhehe.com/images/shanhai/65b76aecc911c.jpg) diff --git a/source/_posts/常见软件版本代号说明(如Alpha、Beta、GA等).md b/source/_posts/常见软件版本代号说明(如Alpha、Beta、GA等).md new file mode 100755 index 0000000..abceb6f --- /dev/null +++ b/source/_posts/常见软件版本代号说明(如Alpha、Beta、GA等).md @@ -0,0 +1,38 @@ +--- +title: 常见软件版本代号说明(如Alpha、Beta、GA等) +date: 2024-01-22 13:01:00 +categories: 学习笔记 +headimg: https://bu.dusays.com/2024/02/12/65c9cb930e75a.png +description: 内部测试版本 (Alpha Releases) ,会引入新的功能和改进。Alpha 版是当前系列版本的最初版本。Alpha 版可能存在一些 bug,提供给尝鲜用户,可以用于测试最新的功能。 +tags: +- 版本号 +--- +### Alpha +内部测试版本 (Alpha Releases) ,会引入新的功能和改进。Alpha 版是当前系列版本的最初版本。Alpha 版可能存在一些 bug,提供给尝鲜用户,可以用于测试最新的功能1。 +>示例: 1.1 Alpha +### Beta +公开测试版本 (Beta Releases) ,会引入新的功能和改进,相对于内部测试版本已有了很大的改进,消除了严重的错误,但还是存在着一些 bug,提供给尝鲜用户,可以用于测试最新的功能。 +> 示例:1.1 Beta +### RC +候选发布版本 (Release Candidate Releases, RC) ,会引入新的功能和改进。RC 版本可用于早期测试,较公开测试版本的稳定性有较大改善,其稳定性足以开始测试,但不适合用于生产部署。 +> 示例: +RC1 +2.0-RC1 +### GA +正式发布版本 (General Availability Releases, GA) ,是当前系列版本的稳定版本,在候选发布版本 (Release Candidate Releases, RC) 之后发布,能够用于生产部署。 +> 示例: +1.0 GA +### 纯数字版本号 +无代号的纯数字版本号,通常理解为正式版本,同GA +> 示例: +1.0.0 +2.0 +### DMR +开发里程碑版本 (Development Milestone Releases, DMR) ,通常理解为开发版,新功能尝鲜版本 +> 示例:TiDB 6.3.0-DMR +### LTS +长期支持版本 (Long-Term Support Releases, LTS) ,通常理解为稳定版,可长期使用,不会有大功能变更,只修复bug和漏洞。大多数商业软件都提供长期支持版本,如Windows、Ubuntu、Node Js等 +> +示例: +Node 18.12.0 LTS +Ubuntu 22.04.1 LTS \ No newline at end of file diff --git a/source/_posts/平安夜,快乐吗.md b/source/_posts/平安夜,快乐吗.md new file mode 100755 index 0000000..12ef6f4 --- /dev/null +++ b/source/_posts/平安夜,快乐吗.md @@ -0,0 +1,20 @@ +--- +title: 平安夜,快乐吗 +date: 2023-12-24 14:01:00 +categories: 记录生活 +headimg: https://bu.dusays.com/2024/01/31/65ba45c117d6e.jpg #博客封面图 +description: 还记得那时候的我们吗?我想应该是快乐的! +tags: +- 节日 +--- +还记得那时候的我们吗?我想应该是快乐的! + + +![微信图片_20240131210555.jpg](https://bu.dusays.com/2024/01/31/65ba45c117d6e.jpg) +>谢谢你的咖啡 + +>酒吧已经不适合我这个年龄了 吵...看看姑娘娃,回... + +![微信图片_20240131210838.jpg](https://bu.dusays.com/2024/01/31/65ba466f8e0aa.jpg) +![微信图片_20240131210844.jpg](https://bu.dusays.com/2024/01/31/65ba4671d76a3.jpg) +![微信图片_20240131210847.jpg](https://bu.dusays.com/2024/01/31/65ba4673ee910.jpg) \ No newline at end of file diff --git a/source/_posts/广仁寺.md b/source/_posts/广仁寺.md new file mode 100755 index 0000000..ad8114e --- /dev/null +++ b/source/_posts/广仁寺.md @@ -0,0 +1,34 @@ +--- +title: 广仁寺 +date: 2024-02-23 09:30:00 +categories: 记录生活 +headimg: https://yhehe.com/images/grs/3074873262.jpeg +description: 暂时去不了西藏?那就去城墙拐角的广仁寺看看吧!作为西安的唯一一所藏传佛教寺庙,广仁寺还是很值得一逛,无需门票预约,来了就可以进。可是。。。。。。我并没有进去,在门口晃了一圈走了 ,我姐喊我回家送东西 +tags: +- 寺庙 +--- + +暂时去不了西藏?那就去城墙拐角的广仁寺看看吧! +作为西安的唯一一所藏传佛教寺庙,广仁寺还是很值得一逛,无需门票预约,来了就可以进。
      +可是。。。。。。我并没有进去,在门口晃了一圈走了 ,我姐喊我回家送东西 + + +{% gallery %} +![福临门](https://yhehe.com/images/grs/3074873262.jpeg) +{% endgallery %} +{% gallery %} +![大门口](https://yhehe.com/images/grs/449089508.jpg) +{% endgallery %} +{% gallery %} +![城墙一角](https://yhehe.com/images/grs/3875409297.jpg) +{% endgallery %} +{% gallery %} +![红墙](https://yhehe.com/images/grs/2498428064.jpg) +{% endgallery %} +{% gallery %} +![名字](https://yhehe.com/images/grs/817993974.jpg) +{% endgallery %} +{% gallery %} +![房檐](https://yhehe.com/images/grs/780658240.jpg) +{% endgallery %} + diff --git a/source/_posts/开业大吉.md b/source/_posts/开业大吉.md new file mode 100755 index 0000000..6142db1 --- /dev/null +++ b/source/_posts/开业大吉.md @@ -0,0 +1,16 @@ +--- +title: 开业大吉 +date: 2024-02-19 02:18:00 +categories: 记录生活 +headimg: https://yhehe.com/images/2580751174.jpg +description: 转了一圈,回来继续工作,希望新的一年,我们能有所收获,加油~ +tags: +- 新年 +- 画廊 +--- +>转了一圈,回来继续工作,希望新的一年,我们能有所收获,加油~ + +![微信图片_20240219101340.jpg](https://yhehe.com/images/2580751174.jpg) +![微信图片_20240219101355.png](https://yhehe.com/images/982554244.png) + + diff --git a/source/_posts/微信调用手机浏览器打开链接.md b/source/_posts/微信调用手机浏览器打开链接.md new file mode 100755 index 0000000..5ce5862 --- /dev/null +++ b/source/_posts/微信调用手机浏览器打开链接.md @@ -0,0 +1,43 @@ +--- +title: 微信调用手机浏览器打开链接 +date: 2024-01-24 12:14:00 +categories: 学习笔记 +tags: +--- +不知道大家有没有这样的需求,当把app下载连接通过微信发送给他人时,在微信中点开这个链接,并不能直接下载,或者由于这样或那样的原因链接不想在微信打开,需要在手机浏览器打开。 + +那么针对需求,如何解决这个问题呢? + +首先就是看看有没有现成的方案,搜索引擎搜索一番,搜来搜去并没有找到现成的开源代码,但是发现了网上有网站提供这种服务: +![3450358770.png](https://bu.dusays.com/2024/01/24/65b0feec3dcac.png) +不过测试版有时效,想长期使用还得付费,那就尝试只能尝试自己解决了。 + +在测试中发现访问.apk文件时无法下载也无法条状到默认浏览器,但是如果访问.doc或者.xlsx这类文件竟然可以直接跳转到默认浏览器中下载,那么问题迎刃而解: +先使用一个跳板网址,判断用户是否通过手机微信访问,如果是则模拟成成.doc文件,将跳转到默认浏览器,如果用户并未使用手机微信访问则直接跳转到apk下载地址。 +如果是网页链接不想在微信打开,需要在手机浏览器打开的话也是同样的方法,只不过不用跳板网址,直接在页面上判断即可。 + +核心代码: +``` + + +``` +功能完美实现,有时间的话我也搭建一个类似的服务,网上这个有点太丑了。 \ No newline at end of file diff --git a/source/_posts/恭喜朋友新店开业.md b/source/_posts/恭喜朋友新店开业.md new file mode 100755 index 0000000..ce8f177 --- /dev/null +++ b/source/_posts/恭喜朋友新店开业.md @@ -0,0 +1,12 @@ +--- +title: 恭喜朋友新店开业 +date: 2023-12-22 10:10:00 +categories: 记录生活 +tags: +- 开心 +- 开业 +--- +![开业照片](https://bu.dusays.com/2024/01/31/65ba4349f159b.jpg) +![开业照片](https://bu.dusays.com/2024/01/31/65ba43521fa66.jpg) + +>祝贺,望生意兴隆 财源广进 \ No newline at end of file diff --git a/source/_posts/我做错了吗.md b/source/_posts/我做错了吗.md new file mode 100755 index 0000000..efe950c --- /dev/null +++ b/source/_posts/我做错了吗.md @@ -0,0 +1,23 @@ +--- +title: 我做错了吗? +date: 2024-04-11 07:10:00 +categories: 记录生活 +headimg: https://yhehe.com/images/4255724896.jpg #博客封面图 +description: 昨晚收工的时候,在店门口一个男人对女人大打出手,用拳头对脸狠打,用脚狠踹。女人低着头手护着脸。低声哭泣。尤其还看了我一眼,明显有点求救的意思。哎,我这小心脏看着都心疼,就说了一句,别打了,有话好好说。换来的是一句,关你球事。 +tags: + - 打架 +--- + +昨晚收工的时候,在店门口一个男人对女人大打出手,用拳头对脸狠打,用脚狠踹。 +女人低着头手护着脸。低声哭泣。尤其还看了我一眼,明显有点求救的意思。 +哎,我这小心脏看着都心疼,就说了一句,别打了,有话好好说。 +换来的是一句,关你球事。 +扭头走吧,管好自己,又和咱没啥关系对吧。 +可。。。我也不是啥好东西,碰上这种骂我的,我一贯作风肯定要动手。 +哎。。。腰部发力果真效果好,一个摆锤,直接打倒。 +警察叔叔来了,看了监控,还有群众的证词。大家都在说我见义勇为,我还没觉得,纯属看不惯。 +最搞笑的是,警察问男的叫啥,有群众人说叫王八蛋。 +最后和解了事,各自回家。 +忙活到十一点半了。回家还让家人凶了一顿,没敢吱声。 + +睡觉😪 diff --git a/source/_posts/我只想让自己在拐角没人看到的地方晒会太阳.md b/source/_posts/我只想让自己在拐角没人看到的地方晒会太阳.md new file mode 100755 index 0000000..bbb786c --- /dev/null +++ b/source/_posts/我只想让自己在拐角没人看到的地方晒会太阳.md @@ -0,0 +1,14 @@ +--- +title: 我只想让自己在拐角没人看到的地方晒会太阳 +date: 2024-03-08 02:49:00 +categories: 记录生活 +headimg: https://yhehe.com/images/1555795792.jpg #博客封面图 +description: 我不是一个喜欢抱怨的人,但总有些事情让人感到烦恼。我更喜欢独处,不愿与许多人打交道。然而,现实情况不允许,我不得不应对各种各样的人,这让我感到无奈!有时候我会想,是不是我内心太过孤僻了,还是别人都太擅长社交了。也许我早已跟不上大家的节奏,我想我应该承认这一点,毕竟...... +tags: +- 心情 +--- +{% audio https://yhehe.com/music/3000629583.mp3 %} + +我不是一个喜欢抱怨的人,但总有些事情让人感到烦恼。我更喜欢独处,不愿与许多人打交道。然而,现实情况不允许,我不得不应对各种各样的人,这让我感到无奈!有时候我会想,是不是我内心太过孤僻了,还是别人都太擅长社交了。也许我早已跟不上大家的节奏,我想我应该承认这一点,毕竟...... + +现在回想起来,开始写这个博客是一个正确的决定。在这个角落里,没有人认识我。朋友圈并不是一个适合表达内心情感的地方,这里已成为我心灵的一片净土。我不想说话,更不想听别人的话。独自一人,我会好好地享受。 diff --git a/source/_posts/打羽毛球VS摄影师.md b/source/_posts/打羽毛球VS摄影师.md new file mode 100755 index 0000000..5c127be --- /dev/null +++ b/source/_posts/打羽毛球VS摄影师.md @@ -0,0 +1,23 @@ +--- +title: 打羽毛球VS摄影师 +date: 2024-03-21 01:56:00 +categories: 记录生活 +headimg: https://yhehe.com/images/1414757029.jpg #博客封面图 +description: 由于我和老哥的肩膀都出了点问题,于是从今天开始,约定每天在店门口打打羽毛球,活动一下肩部。哎。。。。不知道现在的人都怎么了,一个摄影师 带着个女孩在我们店门口要照相,本身没啥 成人之美嘛,随便照。但是我俩比分就差一个球了,说打完这一个球你们随便拍。我说这个摄影师是不是脑子有马达,竟然说了句你们别打了,我先照个相。 +tags: + - 吵架 +--- + + +由于我和老哥的肩膀都出了点问题,于是从今天开始,约定每天在店门口打打羽毛球,活动一下肩部。 +哎。。。。不知道现在的人都怎么了,一个摄影师 带着个女孩在我们店门口要照相,本身没啥 成人之美嘛,随便照。但是我俩比分就差一个球了,说打完这一个球你们随便拍。 +我说这个摄影师是不是脑子有马达,竟然说了句你们别打了,我先照个相。 +嘴里还嘟囔。 +哎。。。我。。。。忍了。 +看来女人就是能让男人冲动,说一些超出自己能力范围的话。 +不是我小气 但是我家门口真不欢迎你照相,这一条街都是我朋友,你也照不成。 +结局就是相没照成,我们球继续打,何苦呢。 +是不是有点欺负人呢,我只想教他一下和人相处之道。希望以后同样的事情 他会选择一个好的处理方式。 + +这条街很多来照相的,有的我还给倒茶呢:^(可爱) 。 + diff --git a/source/_posts/按时完成老板交代的任务.md b/source/_posts/按时完成老板交代的任务.md new file mode 100755 index 0000000..ebbde5a --- /dev/null +++ b/source/_posts/按时完成老板交代的任务.md @@ -0,0 +1,11 @@ +--- +title: 按时完成老板交代的任务? +headimg: https://bu.dusays.com/2024/01/31/65ba47dde127d.png #博客封面图 +date: 2023-12-28 10:37:00 +categories: 记录生活 +tags: +- 闹心 +--- + + 交通事故的郭 一直和她关于赔偿一事 无法谈拢。我约了郭 见面把事情一说 钱一赔 了结? + 马上过年了 不想拖到明年去了 希望来年我们都能好好的?? \ No newline at end of file diff --git a/source/_posts/推荐2款软件.md b/source/_posts/推荐2款软件.md new file mode 100755 index 0000000..032b5cb --- /dev/null +++ b/source/_posts/推荐2款软件.md @@ -0,0 +1,94 @@ +--- +title: 推荐2款软件 +date: 2024-04-28 03:00:00 +categories: 学习笔记 +headimg: https://yhehe.com/images/2438252332.webp #博客封面图 +description: Inpaint(图片修复、放大)神器!纯浏览器端实现,完全免费开源,二、高效的【仿站神器】!截图就能复制网站,完全开源。 #章的简短描述,概述文章内容,可以用于SEO优化,帮助搜索引擎和用户快速了解文章主题。 +tags: + - 软件 +--- +### 一、Inpaint(图片修复、放大)神器!纯浏览器端实现,完全免费开源 + +Inpaint 是一个免费的开源修复和图像放大工具,由浏览器上的 webgpu 和 wasm 提供支持。 +基于Webgpu技术和wasm技术的开源免费图像修复工具,纯浏览器端实现。 +在线体验:【[点击前往](https://inpaintweb.lxfater.com/)】 +开源项目:【[GitHub](https://github.com/lxfater/inpaint-web)】 + +**项目路线图** +{% checkbox green checked::图片修改历史 %} +{% checkbox yellow checked::优化模型 %} +{% checkbox cyan checked::后处理集成于模型中 %} +{% checkbox blue checked::超分辨率 %} +{% checkbox green checked::接入分段任何内容,实现快速选择和去除图像 %} +{% checkbox yellow checked::接入稳定扩散,实现图像替换 %} +{% checkbox cyan checked::更好的界面 %} + + +**本地安装命令:** +```js +npm install +npm run start +``` + +**注意:电脑上需先安装Node.js,否则无法运行npm。** 【[官方下载](https://nodejs.org/en/download)】 + +---------- + +### 二、高效的【仿站神器】!截图就能复制网站,完全开源 + +一个简单的工具,可使用 AI 将屏幕截图、模型和 Figma 设计转换为干净、实用的代码。 + +支持的堆栈: + +HTML + 顺风 +反应 + 顺风 +Vue + 顺风 +引导程序 +离子 + 顺风 +静止无功发生器 +支持的AI模型: + +GPT-4 Turbo(2024 年 4 月)- 最佳型号 +GPT-4 Vision(2023 年 11 月)- 在某些输入上比 GPT-4 Turbo 更好的好模型 +Claude 3 Sonnet – 对于许多输入来说,速度更快,并且与 GPT-4 视觉相当或更好 +用于图像生成的 DALL-E 3 +我们还刚刚添加了实验性支持,用于拍摄正在运行的网站的视频/屏幕记录并将其转变为功能原型。 + +谷歌应用程序快速 3 + +开源项目:【[GitHub](https://github.com/abi/screenshot-to-code)】 + + +**安装教程:** + +该应用程序有一个 React/Vite 前端和一个 FastAPI 后端。如果您想使用 Claude Sonnet 或实验性视频支持,您将需要一个能够访问 GPT-4 Vision API 的 OpenAI API 密钥或一个 Anthropic 密钥。 + +运行后端(我使用 Poetry 进行包管理 –pip install poetry如果你没有它): +``` +cd backend +echo "OPENAI_API_KEY=sk-your-key" > .env +poetry install +poetry shell +poetry run uvicorn main:app --reload --port 7001 +``` +如果您想使用 Anthropic,请将与您的 Anthropic 的 API 密钥一起ANTHROPIC_API_KEY添加。backend/.env + +运行前端: +``` +cd frontend +yarn +yarn dev +``` +打开5173以使用该应用程序。 + +如果您希望在不同端口上运行后端,请更新 VITE_WS_BACKEND_URLfrontend/.env.local + +出于调试目的,如果您不想浪费 GPT4-Vision 积分,您可以在模拟模式下运行后端(该模式会传输预先录制的响应): +``` +MOCK=true poetry run uvicorn main:app --reload --port 7001 +``` +**Docker 一键安装命令:** +``` +echo "OPENAI_API_KEY=sk-your-key" > .env +docker-compose up -d --build +``` \ No newline at end of file diff --git a/source/_posts/推荐2款软件,也许你用得上.md b/source/_posts/推荐2款软件,也许你用得上.md new file mode 100755 index 0000000..a038c40 --- /dev/null +++ b/source/_posts/推荐2款软件,也许你用得上.md @@ -0,0 +1,33 @@ +--- +title: 推荐2款软件,也许你用得上 +date: 2024-05-11 13:43:00 +categories: 学习笔记 +headimg: https://yhehe.com/images/1114535881.webp #博客封面图 +tags: +--- +## 1、WiFi密码一键查看器!完全免费 + +WiFi 密码揭示器(查找器)是一个小型免费软件实用程序,它将显示您所有保存的 WiFi 密码。如果您忘记或丢失了无线网络密码 – 此工具适合您。它适用于 Windows XP、Vista、Windows 7 和 Windows 8(32 位和 64 位)。 +官方下载:【[点击前往](https://www.magicaljellybean.com/wifi-password-revealer/)】 + + +## 2、LockHunter 文件锁解锁器,删除无法被删除的文件或文件夹 + +LockHunter 是一个免费工具,可以删除被您不知道的东西阻止的文件。 LockHunter 对于对抗恶意软件和其他无故阻止文件的程序非常有用。与其他类似工具不同,它会将文件删除到回收站中,因此如果错误删除,您可以恢复它们。 + +主要特征 +显示锁定文件或文件夹的进程 +为您提供有关流程的详细信息 +允许解锁、删除、复制或重命名锁定的文件 +可以在下次操作系统重新启动时删除文件 +允许终止锁定进程 +允许从硬盘驱动器中删除锁定进程 +可以从进程中卸载 DLL +集成到资源管理器菜单中 +它将文件删除到回收站中,因此如果误删除,您可以恢复它们 +支持 32 位和 64 位 Windows + + +官方下载:【[点击前往](https://lockhunter.com/)】 + + diff --git a/source/_posts/更详细的pinghsu主题设置教程 .md b/source/_posts/更详细的pinghsu主题设置教程 .md new file mode 100755 index 0000000..145cabc --- /dev/null +++ b/source/_posts/更详细的pinghsu主题设置教程 .md @@ -0,0 +1,173 @@ +--- +title: 更详细的pinghsu主题设置教程 +date: 2023-12-18 02:28:00 +categories: 学习笔记 +urlname: 10 +tags: +--- +这篇教程,属于新手向,请和pingshu主题搭配使用。教程分为三个部分,分别为typecho后台设置,typecho插件使用,pinghsu主题设置 +typecho后台设置 +基本设置 + +登录到typecho后台,进入设置-基本设置 + +站点名称,站点地址是你安装好typecho的一些基本信息, + +站点描述和关键词,是你首页的seo信息,得填 + +pinghsu和lpisme主题都集成了基本的seo功能,对文章页都做了关键字和描述 + +剩下的就根据你自己的需要去改吧,下图是我的设置 + +基本设置.png +评论设置 + +pinghsu和lpisme主题启用Pjax都需要提前关闭开启反垃圾保护,因为这段js会和pjax的js有冲突 + +另外我们的评论垃圾处理可以通过插件来过滤 + +其他就根据你的需要去改吧,下图是我的设置 + +评论设置.png +阅读设置 + +这部分比较简单,其中每页文章数目是首页文章数目的设置,我是设置为12 + +其他就根据你的需要去改吧,下图是我的设置 + +阅读设置.png +永久链接 + +这部分属于伪静态的内容 + +我web环境是LNMPA,可以直接用.htaccess去实现伪静态 + +我的.htaccess为 + +[object Object],[object Object],[object Object] + +如果是LNMP,可以通过修改你站点的nginx的conf配置实现,代码如下 + +[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object] + +其他就根据你的需要去改吧,下图是我的设置 + +永久链接.png +typecho插件使用 + +之前我写过一篇《目前我在用的一些Typecho插件》 + +目前我依然也是在使用这些插件 + +其中我对Typecho缓存插件进行了修改,可以去看我另外一篇《修复TpCache一个无法触发缓存刷新的bug》的最后部分 + +另外我也通过修改typecho系统让其支持了文章链接添加新窗口跳转,可以看我另外一篇《给Typecho的文章链接添加新窗口跳转》 +pinghsu主题设置 + +这部分在这篇《Pinghsu,A Typecho Theme》里已经写得很详细了 + +需要注意的是,创建归档页,选择页面模板的时候,还需要填写archive字段 + +功能开关部分,建议开启的有 Pjax加速,DNS预解析,其他就根据你的需要去启用吧 + +如果你想获取跟我一样的友情链接页面,因为是typecho开发版,支持在页面内写
      • + +所以你可以直接在
          内联一个class="flinks",然后在
        • 插入你的友链,即可 + +主题亮点 + +页面预加载与DNS预解析保证极快访问速度 +无JQuery,无前端框架,无webfont +几乎零代码冗余,几乎每句代码都是有意义的 +HighlightJS代码高亮,支持22种编程代码 +响应式设计,支持平板与手机,访问体验甚至优于桌面 +支持图片CDN镜像,支持多种文章缩略图设置 +支持首页三栏和单栏选择,文章题图和色块 +支持文章目录、相关文章与数学公式渲染 +支持文章个性化标徽设置,10种标徽选择 +支持个人社交按钮,社交分享 +主题设置添加XSS检测,评论提交防止触发多次 +还有更多亮点等你去发现~ +更多预览 + +首页 - 三栏 首页 - 单栏 +首页-三栏.png 首页-单栏.png +文章内容页 - 题图 文章内容页 - 目录 +文章内容页-题图.png 文章内容页-目录.png +页面内容页 内容页 - 评论 +页面内容页.png 内容页-评论.png +分类页 模板归档页 +分类页.png 模版归档页.png +搜索页 404 +搜索页.png 404页.png +移动端 - 首页 移动端 - 文章页 移动端 - 分类页 +移动端-首页.png 移动端-内容页.png 移动端-分类页.png +主题使用 + +到 Github 下载,点击"Download ZIP"下载,解压后将文件夹改名为pinghsu后上传到 /usr/themes,并启用主题 + +如果需要更新主题,则先下载最新文件,然后覆盖原文件即可完成更新,部分新增加的功能需要到后台开启才会生效 + +注意事项:目前主题仅在 typecho 开发版,PHP7.0 下测试通过,其他情况未作太多测试 + +外观设置 + +外观设置主要分为四部分,分别为 logo、icon 的设置,功能开关,社交按钮设置,图片CDN镜像 + +使用注意事项都在设置里写得比较清楚了,如果遇到不明白的地方,可以给我留言反馈 + +下面有几点补充 + +CDN设置部分仅仅测试了七牛的,理论上也支持有镜像服务的CDN +创建模板归档页,无论选择了哪个模板都要加上自定义字段archive +独立搜索页 + +设置方法看这里:Here + +文章缩略图 + +文章设置缩略图方法有四种,自定义字段thumb,文章附件第一张图片,文章内图片,默认缩略图 + +优先级顺序 :自定义字段 thumb -> 附件第一张图片 -> 文章图片 -> 默认缩略图 -> 随机图片 -> 无 + +缩略图尺寸大小,高度至少有250px,宽度大于高度,推荐高度为400px的 + +个性化标徽 + +个性化标徽出现的地方有首页、分类页,标签页,作者页和相关文章 + +设置方法是在文章编辑内填写自定义字段,支持的字段如下 + +book 、 game 、 note 、 chat 、 code 、 image 、 web 、 link 、 design 、 lock + +个性化色块 + +个性化色块需要到外观设置那开启才能激活使用,色块出现的地方有首页,分类页,标签页,独立搜索页等等 + +设置方法是在文章编辑内填写自定义字段,支持的字段如下 + +blue、purple、green、yellow、red + +友情链接 + +如果你想获取跟我一样的友情链接页面,因为是 typecho 开发版,支持在页面内写
          • + +所以你可以直接在
              内联一个class="flinks",然后在
            • 插入你的友链,即可 + +更多设置教程 : Here + +浏览器兼容情况 + +这个····现代浏览器都兼容···· + +Contributing + +All kinds of contributions (enhancements, new features, documentation & code improvements, issues & bugs reporting) are welcome. + +欢迎各种形式的贡献,包括但不限于优化,添加功能,文档 & 代码的改进,问题和 bugs 的报告。 + +License + +Open sourced under the MIT license. + +根据 MIT 许可证开源。 \ No newline at end of file diff --git a/source/_posts/曾经的热闹景象已经远去.md b/source/_posts/曾经的热闹景象已经远去.md new file mode 100755 index 0000000..c29d2d8 --- /dev/null +++ b/source/_posts/曾经的热闹景象已经远去.md @@ -0,0 +1,19 @@ +--- +title: 曾经的热闹景象已经远去 +date: 2024-03-26 13:08:00 +categories: 记录生活 +headimg: https://yhehe.com/images/cjrn/1587066873.jpg #博客封面图 +description: 羽毛球拍的线松了,想要重新穿线。一大早前往市体育场,但我印象中那里周边总是有卖体育用品的店铺,今天却发现所有店铺都不开门了,看起来似乎已经全部搬走了。 +tags: + - 回忆 +--- +羽毛球拍的线松了,想要重新穿线。一大早前往市体育场,但我印象中那里周边总是有卖体育用品的店铺,今天却发现所有店铺都不开门了,看起来似乎已经全部搬走了。 + +尽管如此,我既然来了,便决定在这个我从小玩耍的体育场里多转转。进入后,熟悉的篮球场显得有些荒凉,周围长满了杂草。虽然有人在维护环境,但仍然无法掩盖这一片寂静的气息。游泳馆也已关闭,而我学会游泳就是在这里。曾经,几十张乒乓球桌一字排开,等个桌子要花上好半天,如今却一个都找不到了。以前锻炼的人也变得寥寥无几。 + +周边的居民大多已经搬走,随着城市的扩张,各处都有了新的锻炼场所。市区早已失去了昔日的繁华,只留下了一些过往的记忆。唯一还保持着活力的是对面的实验小学,毕竟那是一所重点小学。 +![微信图片_20240326204422.jpg](https://yhehe.com/images/cjrn/1587066873.jpg) +![微信图片_20240326204440.jpg](https://yhehe.com/images/cjrn/4217171535.jpg) +![微信图片_20240326204454.jpg](https://yhehe.com/images/cjrn/4156105296.jpg) +![微信图片_20240326204502.jpg](https://yhehe.com/images/cjrn/211038625.jpg) + diff --git a/source/_posts/朋友相聚.md b/source/_posts/朋友相聚.md new file mode 100755 index 0000000..ab6c901 --- /dev/null +++ b/source/_posts/朋友相聚.md @@ -0,0 +1,23 @@ +--- +title: 朋友相聚 +date: 2024-01-14 05:47:00 +categories: 记录生活 +headimg: https://bu.dusays.com/2024/02/15/65ce12631341b.jpg +description: 昨晚,与多年未见的朋友们欢聚,畅谈往事,仿佛回到了那个年轻而充满激情的时光。这次相聚,让我感受到岁月的流转,也让我深刻体会到那段时光的天真与冲动。 +tags: +- 聚会 +- 吃喝 +--- + +{% audio http://music.163.com/song/media/outer/url?id=1315217468.mp3 %} +---------- +昨晚,与多年未见的朋友们欢聚,畅谈往事,仿佛回到了那个年轻而充满激情的时光。这次相聚,让我感受到岁月的流转,也让我深刻体会到那段时光的天真与冲动。 + +我们述说着曾经的点点滴滴,回忆起年少时的梦想和追逐。似乎能够听到当时年轻而坚定的心跳声 + +大家都在各自的生活中奔波劳碌,但这次见面,重新发现了那份纯真。我们看到彼此脸上岁月的印记,却依然能够感受到心底深处的那份默契和亲切 + +时光或许让我们变得成熟,但心中对友情的热爱却从未改变?? + +在这个匆匆而过的时代,珍惜友情显得尤为重要。纵使岁月变迁,友谊之花依然绚烂绽放 +![微信图片_20240115135910.jpg](https://bu.dusays.com/2024/02/15/65ce12631341b.jpg) \ No newline at end of file diff --git a/source/_posts/民乐园万达.md b/source/_posts/民乐园万达.md new file mode 100755 index 0000000..7439414 --- /dev/null +++ b/source/_posts/民乐园万达.md @@ -0,0 +1,21 @@ +--- +title: 民乐园万达 +date: 2024-01-21 12:50:00 +categories: 记录生活 +headimg: https://bu.dusays.com/2024/02/12/65c99b7e780be.jpg +description: 今天收工没事,在回家的路上去解放路万达转了一圈,为啥来这里转,还是前阵子看房,家人觉得这里不错,地理位置在市中心,地铁方便,楼下卖吃的喝的啥都有,还有商场。 +tags: +- 随拍 +- 溜达 +--- +>今天收工没事,在回家的路上去解放路万达转了一圈,为啥来这里转,还是前阵子看房,家人觉得这里不错,地理位置在市中心,地铁方便,楼下卖吃的喝的啥都有,还有商场。 +>考虑再三没要,原因有很多。。。这里就不打字了。。。。 + +![](https://bu.dusays.com/2024/02/12/65c99b7e780be.jpg) +![](https://bu.dusays.com/2024/02/12/65c99a1a32468.jpg) +![](https://bu.dusays.com/2024/02/12/65c99a4eb83ce.jpg) +![](https://bu.dusays.com/2024/02/12/65c99a1cda4d5.jpg) +![](https://bu.dusays.com/2024/02/12/65c99a1c7f0d2.jpg) +![](https://bu.dusays.com/2024/02/12/65c99a1c286d8.jpg) +![](https://bu.dusays.com/2024/02/12/65c99a19a51fa.jpg) +![](https://bu.dusays.com/2024/02/12/65c99a0b8c280.jpg) \ No newline at end of file diff --git a/source/_posts/永乐春拍精品巡展-西安站.md b/source/_posts/永乐春拍精品巡展-西安站.md new file mode 100755 index 0000000..e053d60 --- /dev/null +++ b/source/_posts/永乐春拍精品巡展-西安站.md @@ -0,0 +1,42 @@ +--- +title: 永乐春拍精品巡展-西安站 +date: 2024-06-10 12:24:00 +categories: 记录生活 +headimg: https://yhehe.com/images/309893088.jpg #博客封面图 +description: 走进画展大厅,心中在想,要是我的多好啊,个个精品价值不菲。 +tags: +- 字画 +--- +> 走进画展大厅,心中在想,要是我的多好啊,个个精品价值不菲?。 +> 墙上悬挂的画作仿佛有生命般,静静诉说着每一位艺术家笔下的故事。这次展出的作品不仅有吴冠中、李可>染、徐悲鸿、齐白石、张大千等中国画家的杰作,还有一些颇具韵味的油画。 + +---------- + 首先映入眼帘的是吴冠中的作品。他的画作以独特的线条和色彩运用,勾勒出了一幅充满活力和生机的自然 景观。那简洁而富有韵律的线条,仿佛在画布上跳舞,带领观者在抽象与具象之间徜徉。吴冠中的画,让我 感受到了一种宁静与激荡并存的力量。 +![微信图片_20240610200724.jpg](https://yhehe.com/images/3998032056.jpg) +![微信图片_20240610200616.jpg](https://yhehe.com/images/3849654027.jpg) + +> 接下来,是李可染的山水画。他的作品以浓重的墨色和精细的笔触,描绘出了气势磅礴的山川河流。那层层>叠叠的山峦,仿佛在告诉我们大自然的雄伟与壮丽。李可染的画,让我心中生出一种对自然的敬畏之情。 + +![微信图片_20240610202024.jpg](https://yhehe.com/images/2439963218.jpg) + +>徐悲鸿的作品,以其精湛的技艺和深刻的情感,描绘了生动的马匹和人物。那奔腾的骏马,仿佛要跃出画>布,带领我们奔向无垠的草原。 + +![微信图片_20240610200654.jpg](https://yhehe.com/images/1070727026.jpg) + +>齐白石的作品,则以其独特的写意风格,展示了他对生活的细腻观察和深刻理解。他的画作,看似简单,却>蕴含着无穷的意味。每一个笔触,每一个色块,都充满了灵性与智慧。这副作品480W + +![微信图片_20240610200750.jpg](https://yhehe.com/images/2112290467.jpg) + +>张大千的画作,融合了传统与创新。他的山水画,不仅继承了古人的技法,还融入了自己的创意和情感。那>些绚丽的色彩,流畅的线条,构成了一幅幅美丽的画卷。张大千的作品,让我领略到了一种跨越时空的艺术魅>力。 + +![微信图片_20240610200625.jpg](https://yhehe.com/images/3943808564.jpg) +![微信图片_20240610200659.jpg](https://yhehe.com/images/3653561249.jpg) +![微信图片_20240610200702.jpg](https://yhehe.com/images/151629347.jpg) + +>在这些中国画作之外,展厅中还有一些油画作品。这些油画,以其独特的质感和色彩表现,展示了不同的艺>术风格和创作理念。每一幅油画,都如同一扇窗,带领我走进不同的世界,体验不同的情感。 + +![微信图片_20240610200740.jpg](https://yhehe.com/images/204737791.jpg) +![微信图片_20240610200640.jpg](https://yhehe.com/images/1368959999.jpg) +![微信图片_20240610200737.jpg](https://yhehe.com/images/939781980.jpg) + +>每一幅画作,都是他们心灵的写照,是他们对世界的理解与感悟 让我大饱眼福 \ No newline at end of file diff --git a/source/_posts/永恒的龙珠传奇 缅怀漫画巨匠鸟山明.md b/source/_posts/永恒的龙珠传奇 缅怀漫画巨匠鸟山明.md new file mode 100755 index 0000000..1f7387d --- /dev/null +++ b/source/_posts/永恒的龙珠传奇 缅怀漫画巨匠鸟山明.md @@ -0,0 +1,26 @@ +--- +title: 永恒的龙珠传奇 缅怀漫画巨匠鸟山明 +date: 2024-03-13 08:58:00 +categories: 记录生活 +headimg: https://yhehe.com/images/qlz/1203354269.jpg #博客封面图 +description: 鸟山明先生的离世,无疑让无数动漫爱好者感到了沉重的哀悼。作为《七龙珠》这一经典动漫的创作者,他将永远留在世人的记忆之中。 +tags: + - 漫画 + - 七龙珠 +--- + +鸟山明先生的离世,无疑让无数动漫爱好者感到了沉重的哀悼。作为《七龙珠》这一经典动漫的创作者,他将永远留在世人的记忆之中。 +![v2-40eb48da4079b208da7371b156b7e514_r.jpg](https://yhehe.com/images/qlz/3225600923.jpg) + +2024年3月1日——《七龙珠》系列漫画的作者鸟山明先生因病医治无效,在东京都内一家医院去世,享年82岁。这位被誉为"漫画之神"的大师就这样永远地离开了我们。 +![ad10.png](https://yhehe.com/images/qlz/3737838135.png) +鸟山明1941年出生于东京都,从小就对漫画有着浓厚的兴趣。1984年,他推出了自己最杰出的代表作《七龙珠》,这部融合了东方武术、科幻、冒险等元素的漫画作品一经问世,便在全球掀起了一股"龙珠热"。 +说到这里我的说一下,五路口的书摊,是我经常留恋徘徊的地方,就为了能把新到的七龙珠翻几页,当时我记得一本要1块多,贵的让我无法想象。哎~ 一直到到后来买了个全套,这也算是为自己了个心愿吧。喜欢里边的汽车,喜欢布尔玛,喜欢幽默搞笑的故事情节,喜欢一次次的虎口脱险。 +![ad7.jpg](https://yhehe.com/images/qlz/1379926219.jpg) +《七龙珠》在各地都有着广泛的影响力和超高人气。无论是漫画还是后来的动画版,都曾获得过无数的大奖。我当时看着黑猫警长的时候还在想,要是七龙珠能有动画片就好了。没记错的话 好像圣斗士的动画片比七龙珠要早一点。 +![ad2.png](https://yhehe.com/images/qlz/1416052999.png) +除了爆款动漫大作,鸟山明先生还为人师表钻研创作,教导无数年轻漫画家。他的离世无疑是漫画界的一大损失,但他创造的不朽作品将永远流传下去,继续影响和启发新一代漫画迷。 +![ad3.png](https://yhehe.com/images/qlz/282304092.png) +正如《七龙珠》中悟空那句名言:"我还会再回来的!"鸟山明先生虽然谢世,但他对漫画艺术的执着追求和贡献将继续催生新的龙珠传奇,激励着一代又一代的梦想者。让我们永远怀念这位漫画巨匠! +![p97209566.webp](https://yhehe.com/images/qlz/3657148480.webp) + diff --git a/source/_posts/海南之行.md b/source/_posts/海南之行.md new file mode 100755 index 0000000..378bb5a --- /dev/null +++ b/source/_posts/海南之行.md @@ -0,0 +1,49 @@ +--- +title: 海南之行 +date: 2024-08-21 11:47:00 +headimg: https://yhehe.com/images/3417357704.jpg #博客封面图 +description: 炎热的夏天,选择了出门游玩,可想而知。受罪啊~ #章的简短描述,概述文章内容,可以用于SEO优化,帮助搜索引擎和用户快速了解文章主题。 +categories: 记录生活 +tags: + - 海南 + - 旅行 +--- +炎热的夏天,选择了出门游玩,可想而知。受罪啊~ + +---------- +* 开车到湛江徐闻县, 从秀英港登船,船开了大概2个小时,远远的看见海口市,漂亮而干净。 +![IMG_6729.jpg](https://yhehe.com/images/hnzx/3906201499.jpg) + +---------- +竟然还停靠了一艘军舰,哎,黄土高原的娃娃 都没见过军舰,不过我看这个军舰炮不大啊。 +![IMG_6733.jpg](https://yhehe.com/images/hnzx/3007125499.jpg) + +---------- +安顿好之后,先吃个清补凉,降降温。别看感觉不咋样,稀不拉几的,味道还是可以的。 +![IMG_6769.jpg](https://yhehe.com/images/hnzx/76397363.jpg) +![IMG_6770.jpg](https://yhehe.com/images/hnzx/2093114833.jpg) + +---------- +小区环境还是可以的,干净了啥都好。 +![IMG_6741.jpg](https://yhehe.com/images/hnzx/343249373.jpg) +![IMG_6778.jpg](https://yhehe.com/images/hnzx/2283018544.jpg) +![IMG_6779.jpg](https://yhehe.com/images/hnzx/111153317.jpg) +![2022_02_07_11_20_IMG_4712 (1).jpg](https://yhehe.com/images/hnzx/1764297551.jpg) + +---------- +走,去海边转转。一边感受着微风拂面的阳光明媚, +一边欣赏蓝天白云和海岸风光,简直是惬意无比。 +不过,画面是唯美的,现实是灼热的,大多数人应该和我一样,都是顶着太阳燃烧着青春的余热吧。 +![IMG_6815.jpg](https://yhehe.com/images/hnzx/485368304.jpg) +![IMG_6819.jpg](https://yhehe.com/images/hnzx/1294845348.jpg) +![IMG_6831.jpg](https://yhehe.com/images/hnzx/540954845.jpg) +![IMG_6837.jpg](https://yhehe.com/images/hnzx/879353965.jpg) + + + + + + + + + diff --git a/source/_posts/游戏厅抓娃娃.md b/source/_posts/游戏厅抓娃娃.md new file mode 100755 index 0000000..c054539 --- /dev/null +++ b/source/_posts/游戏厅抓娃娃.md @@ -0,0 +1,16 @@ +--- +title: 游戏厅抓娃娃 +date: 2024-02-01 11:57:00 +categories: 记录生活 +headimg: https://yhehe.com/images/yxt/3057805356.webp +description: 上在人生的旅程中,我们常常会迷失在繁忙的日常中,忘却了曾经那份纯真的喜悦。然而,有时只需要一次回顾,一次穿越时光的体验,我们就能重新点燃那颗童真的心。踏入了曾经青涩岁月的游戏厅,发现那里的抓娃娃、赛车游戏,成为唤起美好回忆的魔法之地。 +tags: +- 溜达 +--- +在人生的旅程中,我们常常会迷失在繁忙的日常中,忘却了曾经那份纯真的喜悦。然而,有时只需要一次回顾,一次穿越时光的体验,我们就能重新点燃那颗童真的心。踏入了曾经青涩岁月的游戏厅,发现那里的抓娃娃、赛车游戏,成为唤起美好回忆的魔法之地。 + +![65bcd8c39433a.webp](https://yhehe.com/images/yxt//3057805356.webp) +![微信图片_20240202193924.jpg](https://yhehe.com/images/yxt/65bcd8d2bfb53.jpg) +![微信图片_20240202193929.jpg](https://yhehe.com/images/yxt/65bcd8dc5c788.jpg) +![微信图片_20240202193944.jpg](https://yhehe.com/images/yxt/65bcd98242860.jpg) +![微信图片_20240202193936.jpg](https://yhehe.com/images/yxt/65bcd8e5b69d8.jpg) \ No newline at end of file diff --git a/source/_posts/现在的银行转个钱真难啊.md b/source/_posts/现在的银行转个钱真难啊.md new file mode 100755 index 0000000..b1f0013 --- /dev/null +++ b/source/_posts/现在的银行转个钱真难啊.md @@ -0,0 +1,29 @@ +--- +title: 现在的银行转个钱真难啊 +date: 2024-04-24 04:03:00 +categories: 记录生活 +headimg: https://yhehe.com/images/2915014426.webp #博客封面图 +description: 要用钱,因为数额略大,去银行办理。对不起,办不了,您的卡有上限。那咋办,能去掉上线不。对不起,不行。除非拿出相关证明。证明你是给谁转账,并做什么用。转个帐,要啥证明呢。您还有其他银行的卡吗,要不您去其它银行办理转账吧。没有,就有你们建行的卡。。 #章的简短描述,概述文章内容,可以用于SEO优化,帮助搜索引擎和用户快速了解文章主题。 +tags: + - 银行 +--- + +要用钱,因为数额略大,去银行办理。 +对不起,办不了,您的卡有上限。 +那咋办,能去掉上线不。 +对不起,不行。除非拿出相关证明。证明你是给谁转账,并做什么用。 +转个帐,要啥证明呢。 +您还有其他银行的卡吗,要不您去其它银行办理转账吧。 +没有,就有你们建行的卡。 +这个,先生没证明真给你办不了。 +哎。。。无名之火用上心头。 +去,把你们经理叫来。 +经理来了。 +又把之前对话说了一遍。 +经理说,因为以前电线诈骗从他们银行转出去过钱,很多人都受到处罚了,所以现在很谨慎。 +我心想谨慎。。。。那就是还能办啊。 +对经理说,不能办是吧,把不能办理的文件拿来让我看看,如果文件上写的是不能去掉转账上限,我就不办理了。 +经理支啊吾啊的。 +我说没规定,没文件。麻烦你麻溜给我一办,别让人发火,闹大了,我一介草民没啥,对你们银行影响不好。 +经理考虑了一下。最后把我领到一个柜台给办理了。 +这件事让我感受到,你的东西随时都可以不是你的。 \ No newline at end of file diff --git a/source/_posts/电脑上安装 Google Play ,安装安卓应用和安卓游戏更简单更方便.md b/source/_posts/电脑上安装 Google Play ,安装安卓应用和安卓游戏更简单更方便.md new file mode 100755 index 0000000..2c3df60 --- /dev/null +++ b/source/_posts/电脑上安装 Google Play ,安装安卓应用和安卓游戏更简单更方便.md @@ -0,0 +1,30 @@ +--- +title: 电脑上安装 Google Play ,安装安卓应用和安卓游戏更简单更方便 +date: 2024-06-18 15:06:00 +categories: 学习笔记 +headimg: https://yhehe.com/images/1813519644.webp #博客封面图 +tags: +--- + +最低要求 +操作系统: Windows 10 (v2004) 及以上 +存储: 具有 10 GB 可用存储空间的固态硬盘 (SSD) +图片: Intel? UHD 显卡 630 GPU 或同等显卡 +处理器: 4 个 CPU 实体内核(有些游戏需要 Intel CPU) +内存: 8 GB RAM +Windows 管理员账号 +必须开启硬件虚拟化功能 +中文简体版【[点击下载](https://play.google.com/googleplaygames?hl)】 + +中文繁体版【[点击下载](https://play.google.com/googleplaygames?hl=zh_TW)】 + +开启虚拟化提升性能,不同的主板有不同的开启方式,但是步骤大致相同 + +这个华硕的主板 +![8989.webp](https://yhehe.com/usr/uploads/2024/06/3452876167.webp) + +这是AMD主板 +![AMD.webp](https://yhehe.com/usr/uploads/2024/06/436133071.webp) + + + diff --git a/source/_posts/省图书馆.md b/source/_posts/省图书馆.md new file mode 100755 index 0000000..ff34d6a --- /dev/null +++ b/source/_posts/省图书馆.md @@ -0,0 +1,26 @@ +--- +title: 省图书馆 +date: 2024-02-25 08:01:00 +categories: 记录生活 +headimg: https://yhehe.com/images/stsg/521167680.jpg +description: 下班没事,路过省图书馆。心想我还没进去过呢,不如进去看看是个啥样。说实话 这放以前,咱是扭头就走啊。现在还挺喜欢那种安静学习的氛围。我说办张卡,人家还要身份证和现金,我问那不是看不成了吗?哈哈~随便看!!只要不拿走就随便看,办卡也是为了能拿走才需要办卡的。 +tags: +- 图书馆 +--- +下班没事,路过省图书馆。心想我还没进去过呢,不如进去看看是个啥样。 +说实话 这放以前,咱是扭头就走啊。现在还挺喜欢那种安静学习的氛围。 +我说办张卡,人家还要身份证和现金,我问那不是看不成了吗? +哈哈,随便看!! +只要不拿走就随便看,办卡也是为了能拿走才需要办卡的。 +哎~咱格局小了不是。 +那以后有时间就过来蹭了。 + +![IMG_5459.jpg](https://yhehe.com/images/stsg/521167680.jpg) +![IMG_5460.jpg](https://yhehe.com/images/stsg/767801405.jpg) +![IMG_5461.jpg](https://yhehe.com/images/stsg/261565865.jpg) +![IMG_5462.jpg](https://yhehe.com/images/stsg/4242768785.jpg) +![IMG_5463.jpg](https://yhehe.com/images/stsg/968045738.jpg) +![IMG_5464.jpg](https://yhehe.com/images/stsg/1098781199.jpg) +![IMG_5466.jpg](https://yhehe.com/images/stsg/1809524367.jpg) +![IMG_5467.jpg](https://yhehe.com/images/stsg/3673245295.jpg) + diff --git a/source/_posts/看到那个飞机了吗?.md b/source/_posts/看到那个飞机了吗?.md new file mode 100755 index 0000000..828bf00 --- /dev/null +++ b/source/_posts/看到那个飞机了吗?.md @@ -0,0 +1,19 @@ +--- +title: 看到那个飞机了吗? +date: 2024-01-24 08:39:00 +categories: 记录生活 +urlname: 83 +tags: +- 随拍 +--- + +#### 世界不是非黑即白,而我喜就是欢胡乱涂抹。 + + +![65b0cc9a2cf3e.jpg](https://bu.dusays.com/2024/01/25/65b22c8459450.jpg) + + +---------- + + + diff --git a/source/_posts/第一次喝黑水.md b/source/_posts/第一次喝黑水.md new file mode 100755 index 0000000..27082e7 --- /dev/null +++ b/source/_posts/第一次喝黑水.md @@ -0,0 +1,14 @@ +--- +title: 第一次喝黑水 +date: 2024-03-04 07:48:00 +categories: 记录生活 +headimg: https://yhehe.com/images/3557260237.jpg #博客封面图 +description: 听说是桑葚做的~哈哈,这个名字起的还真是个性~ +tags: +- 吃喝 +--- +听说是桑葚做的~哈哈,这个名字起的还真是个性 +![223.jpg](https://yhehe.com/images/3557260237.jpg) + + + diff --git a/source/_posts/篡改猴 (Tampermonkey)强大的浏览器插件.md b/source/_posts/篡改猴 (Tampermonkey)强大的浏览器插件.md new file mode 100755 index 0000000..0fecf18 --- /dev/null +++ b/source/_posts/篡改猴 (Tampermonkey)强大的浏览器插件.md @@ -0,0 +1,40 @@ +--- +title: 篡改猴 (Tampermonkey)强大的浏览器插件 +date: 2024-04-14 03:10:00 +categories: 学习笔记 +headimg: https://yhehe.com/images/3240672758.jpg #博客封面图 +description: 当我说我用插件免费看电影的时候,竟然我的老师杜都没用过。我想应该写一个关于Tampermonkey介绍,让更多人使用。不可能谁都知道任何的工具和插件。大家发现好用的东西共享出来,才会让更多人知。 +tags: +- 软件 +--- + +当我说我用插件免费看电影的时候,竟然我的老师杜都没用过。 +我想应该写一个关于Tampermonkey介绍,让更多人使用。 +不可能谁都知道任何的工具和插件。 +大家发现好用的东西共享出来,才会让更多人知道。 + +---------- +篡改猴 (Tampermonkey) 是拥有 超过 1000 万用户 的最流行的浏览器扩展之一。 它适用于 Chrome、Microsoft Edge、Safari、Opera Next 和 Firefox。 +有些人也会把篡改猴(Tampermonkey)称作油猴(Greasemonkey),尽管后者只是一款仅适用于 Firefox 浏览器的浏览器扩展程序。 +它允许用户自定义并增强您最喜爱的网页的功能。用户脚本是小型 JavaScript 程序,可用于向网页添加新功能或修改现有功能。使用 篡改猴,您可以轻松在任何网站上创建、管理和运行这些用户脚本。 +例如,使用 篡改猴,您可以向网页添加一个新按钮,可以快速在社交媒体上分享链接,或自动填写带有个人信息的表格。在数字化时代,这特别有用,因为网页常常被用作访问广泛的服务和应用程序的用户界面。 +此外,篡改猴 使您轻松找到并安装其他用户创建的用户脚本。这意味着您可以快速轻松地访问为您喜爱的网页定制的广泛库,而无需花费数小时编写自己的代码。 +无论您是希望为您的站点添加新功能的 Web 开发人员,还是只是希望 改善在线体验的普通用户,篡改猴 都是您的工具箱中的一个很好的工具。 + +---------- + +### 第一步:安装一个用户脚本管理器 + +要使用用户脚本,您首先需要安装一个用户脚本管理器。您可以根据当前使用的浏览器来选择一个用户脚本管理器。 +[下载地址](https://greasyfork.org/zh-CN) + +### 第二步:安装一个用户脚本 +在网站搜索你的需求,会出来很多相关脚本。比如我想看电影就搜爱奇艺,选择排名高且更新频繁的脚本使用,点击安装脚本就行。 +[链接](https://greasyfork.org/zh-CN/scripts) + +### 第三步:启用脚本 +安装完以后一本默认都是打开的状态,要是没有启用,你可以在浏览器设置中开启篡改猴,然后点开篡改猴中的管理面板,打开你需要使用的插件就行。最后打开你需要使用插件的网站。比如我打开爱奇艺后看视频,就会出现一个标志,你点开就知道怎么使用了。 + +---------- +有的插件启用后和网页完满融合,你的需要找找才能知道在哪里。 +有许多好的插件等待你的发现,最后祝您使用愉快, diff --git a/source/_posts/胡辣汤就数他最强.md b/source/_posts/胡辣汤就数他最强.md new file mode 100755 index 0000000..838b56d --- /dev/null +++ b/source/_posts/胡辣汤就数他最强.md @@ -0,0 +1,13 @@ +--- +title: 胡辣汤就数他最强 +date: 2024-01-21 06:59:00 +categories: 记录生活 +headimg: https://bu.dusays.com/2024/02/12/65c9980ab4f9b.jpg +description: 好久没喝他家胡辣汤了,今起了个大早,直奔他家,靠,还是那么多的人???,排队 领餐。开干。。。。。 +tags: +- 胡辣汤 +--- + >好久没喝他家胡辣汤了,今起了个大早,直奔他家,靠,还是那么多的人???,排队 领餐。开干。。。。。 + +![香喷喷](https://bu.dusays.com/2024/02/12/65c9980ab4f9b.jpg "香喷喷") +![hulat](https://bu.dusays.com/2024/02/12/65c9980909be4.jpg "香喷喷") diff --git a/source/_posts/西安第一场雪.md b/source/_posts/西安第一场雪.md new file mode 100755 index 0000000..22c2952 --- /dev/null +++ b/source/_posts/西安第一场雪.md @@ -0,0 +1,22 @@ +--- +title: 西安第一场雪 +date: 2023-12-17 06:19:00 +categories: 记录生活 +tags: +- 雪 +--- + + + +>### 西安的第一场雪 很大 漂亮极了,希望这来年是个丰收的季节 + +![请输入图片描述][1] +![请输入图片描述][2] + + + +>雪花如诗,漫天飞舞。在寒冷的冬日里,愿有人为你点燃一堆篝火,暖和你的手,温暖你的心。 + + + [1]: https://bu.dusays.com/2024/02/13/65cadd9b876b7.jpeg + [2]: https://bu.dusays.com/2024/02/13/65cadd9a7e095.jpeg \ No newline at end of file diff --git a/source/_posts/谢谢“晚风咖啡”老板的coffee~.md b/source/_posts/谢谢“晚风咖啡”老板的coffee~.md new file mode 100755 index 0000000..d291fe8 --- /dev/null +++ b/source/_posts/谢谢“晚风咖啡”老板的coffee~.md @@ -0,0 +1,17 @@ +--- +title: 谢谢“晚风咖啡”老板的coffee~ +date: 2024-03-29 08:15:37 +categories: 记录生活 +headimg: https://yhehe.com/images/2537963421.jpg #博客封面图 +description: 平时在店门口喝茶,总会有人问我 “晚风咖啡”怎么走,我呢,总是不厌其烦的耐心指路。我的内心真实写照:主要问路的都是美女。哈哈 今天晚风咖啡的老板一下拿来了十几杯咖啡招待我们。还说 客人上去说地方难找啊,幸亏下边的小哥给指路,要不真找不到。可能反馈的多了,老板就重视了,今天来和我们拉下关系。 +tags: + - 晚风 + - 咖啡 +--- + + +平时在店门口喝茶,总会有人问我 “晚风咖啡”怎么走,我呢,总是不厌其烦的耐心指路。 +我的内心真实写照:主要问路的都是美女。哈哈 +今天晚风咖啡的老板一下拿来了十几杯咖啡招待我们。还说 客人上去说地方难找啊,幸亏下边的小哥给指路,要不真找不到。 +可能反馈的多了,老板就重视了,今天来和我们拉下关系。 +他的咖啡店听说风景还不错,我倒是真还没上去过,今天老板盛情邀请,由于还要看店,只能说改天去看看,也打个卡吧。 diff --git a/source/_posts/迈向2024:轻松生活,简单快乐.md b/source/_posts/迈向2024:轻松生活,简单快乐.md new file mode 100755 index 0000000..d0dd8be --- /dev/null +++ b/source/_posts/迈向2024:轻松生活,简单快乐.md @@ -0,0 +1,22 @@ +--- +title: 迈向2024:轻松生活,简单快乐 +date: 2024-01-01 13:51:00 +categories: 记录生活 +headimg: https://yhehe.com/images/2813026408.jpg +description: 回顾过去的一年。岁月留下了痕迹,经历了风风雨雨,不禁感慨万分,有欢乐也有难过。然而,过去的一切已经成为历史,我们应眼向前方,勇敢积极的面对新的一年。 +tags: +- 心情 +- 跨年 +--- + +>回顾过去的一年。岁月留下了痕迹,经历了风风雨雨,不禁感慨万分,有欢乐也有难过。然而,过去的一切已经成为历史,我们应眼向前方,勇敢积极的面对新的一年。 +---------- + +>始终相信乐观是生活的调味品,无论遇到什么事情,都试着用一个微笑迎接。人生路上有风有雨,但笑对生活,相信每一天都变得更有趣。 +---------- + +>让我们对未来充满期许,勇敢面对新的挑战,把握新的机遇。每一次的努力都将成为未来的美好回忆,让我们一同期待着更好的明天。 +---------- + +![](https://yhehe.com/images/3362504470.jpeg) + diff --git a/source/_posts/雨天.md b/source/_posts/雨天.md new file mode 100755 index 0000000..d16be9c --- /dev/null +++ b/source/_posts/雨天.md @@ -0,0 +1,16 @@ +--- +title: 雨天 +date: 2024-04-01 06:55:00 +categories: 记录生活 +headimg: https://yhehe.com/images/3606978280.jpg #博客封面图 +description: 原本天气预报说下午8点有雨,谁知道现在就开始下起来了。玩着电脑,听着雨声,喝一杯茶,回忆一些烂淞的过去。悠哉、悠哉。今天是愚人节,没收到一个谎言。要承认,老了,包括身边的人。早已失去了玩闹的心情~ +tags: + - 雨天 + - 心情 +--- +原本天气预报说下午8点有雨,谁知道现在就开始下起来了。 +玩着电脑,听着雨声,喝一杯茶,回忆一些烂淞的过去。悠哉、悠哉。 +今天是愚人节,没收到一个谎言。 +要承认,老了,包括身边的人。早已失去了玩闹的心情~ +![yu](https://yhehe.com/images/2840251280.jpg) +{% video https://yhehe.com/music/4277019225.mp4 %} diff --git a/source/_posts/音乐添加.md b/source/_posts/音乐添加.md new file mode 100755 index 0000000..8b1eba4 --- /dev/null +++ b/source/_posts/音乐添加.md @@ -0,0 +1,26 @@ +--- +title: 音乐添加 +date: 2023-12-18 14:35:00 +categories: 学习笔记 +urlname: 11 +tags: +--- + + +### 一、纯代码免插件方式 +#### 1、文章需要的位置放入下列代码即可 + + + +#### 2、添加视频方法 +同上,文章需要的位置放入下列代码即可 + + + +### 二、插件方式 +上传Typecho目录下的/usr/plugins?目录 +2、要把文件夹名改为Meting +3、后台启用插件就可以在文章页面添加音乐了! + + + \ No newline at end of file diff --git a/source/_volantis/bodyEnd.ejs b/source/_volantis/bodyEnd.ejs new file mode 100755 index 0000000..3395cc3 --- /dev/null +++ b/source/_volantis/bodyEnd.ejs @@ -0,0 +1,24 @@ + \ No newline at end of file diff --git a/source/_volantis/first.styl b/source/_volantis/first.styl new file mode 100755 index 0000000..231738d --- /dev/null +++ b/source/_volantis/first.styl @@ -0,0 +1,11 @@ +article hr + background-image: none; + height: 2em; + border: none; + margin: 1em 0 1em; + text-align: center; + &:after + content: "···"; + letter-spacing: 2em; + padding-left: 2em; + font-weight: 700; diff --git a/source/_volantis/headBegin.ejs b/source/_volantis/headBegin.ejs new file mode 100755 index 0000000..39d5712 --- /dev/null +++ b/source/_volantis/headBegin.ejs @@ -0,0 +1,38 @@ + diff --git a/source/_volantis/theme_plus/comments.ejs b/source/_volantis/theme_plus/comments.ejs new file mode 100755 index 0000000..4c24d47 --- /dev/null +++ b/source/_volantis/theme_plus/comments.ejs @@ -0,0 +1,24 @@ +<% + var checkComment = true; + if (page.comments && page.comments == false) { + checkComment = false; + } +%> +<% if (checkComment&&(theme.comments.service && theme.comments.service.length > 0)) { %> + +
              + +

              <%- theme.comments && theme.comments.title %>

              + <% if (theme.comments && theme.comments.subtitle) { %> +

              <%- theme.comments.subtitle %>

              + <% } %> + +
              + +
              + +<% } else { %> + <% page.comments = false; %> +<% } %> diff --git a/source/about/index.md b/source/about/index.md new file mode 100755 index 0000000..7c6855e --- /dev/null +++ b/source/about/index.md @@ -0,0 +1,17 @@ +--- +layout: docs +seo_title: 关于 +bottom_meta: false +sidebar: [] +twikoo: + placeholder: 有什么想对我说的呢? +comments: false +--- + + +Hi…🐟 +everyone! I’m **Hehe.** I’m passionate about computers and the internet, my hobby is playing pool, and I have a special fondness for games. In the field of computers, I enjoy constantly learning new technologies. Pool is my way of relieving stress, and gaming is a way for me to interact with friends. I like making new friends, so if you share these interests, let’s connect and exchange experiences! +![me..hehe](https://photo.yhehe.com/hehe.jpg) + + + diff --git a/source/categories/index.md b/source/categories/index.md new file mode 100755 index 0000000..19dfdb3 --- /dev/null +++ b/source/categories/index.md @@ -0,0 +1,7 @@ +--- +title: 文章分类 +layout: category +top_meta: false +cover: false +sidebar: [] +--- diff --git a/source/contributors/index.md b/source/contributors/index.md new file mode 100755 index 0000000..ec47bd8 --- /dev/null +++ b/source/contributors/index.md @@ -0,0 +1,87 @@ +--- +layout: page +title: 鸣谢项目和社区贡献者 +cover: true +sidebar: [] +music: + server: netease # netease, tencent, kugou, xiami, baidu + type: song # song, playlist, album, search, artist + id: 41630480 # song id / playlist id / album id / search keyword + autoplay: true +--- + +Volantis 社区的发展离不开团队大佬们的无私奉献和社区小伙伴们的热情互助。每一个心怀梦想、有着独特见解的朋友都可以成为团队的一员。目前 Volantis 社区正处于建设初期,我们缺少各方面的人才,如果您使用主题至少一个月且长期活跃于社区,例如: + +- 解答 [issues](https://github.com/volantis-x/hexo-theme-volantis/issues) / [discussions](https://github.com/volantis-x/hexo-theme-volantis/discussions) +- 提交有效的建议 +- 官网文档补全/纠错 +- 发现并收录有意思的文章(搭建博客方面)到官网 + +我们非常欢迎您的加入,请在{% btn, 论坛, https://github.com/volantis-x/hexo-theme-volantis/discussions %}发帖告诉我们。 + + + + +## 感谢开发者 + +{% contributors api:https://raw.github.vlts.cc/volantis-x/github-api-cache/output/v2/repos/volantis-x/hexo-theme-volantis/contributors%3Fper_page%3D100%26direction%3Dasc/data.json %} + +## 感谢社区建设者 + +{% contributors api:https://raw.github.vlts.cc/volantis-x/github-api-cache/output/v2/repos/volantis-x/community/contributors%3Fper_page%3D100%26direction%3Dasc/data.json %} + +## 如何参与社区建设 + +社区建设主要包括 {% btn, Issues, https://github.com/volantis-x/hexo-theme-volantis/issues %} {% btn, Discussions(论坛), https://github.com/volantis-x/hexo-theme-volantis/discussions %} {% btn, 官网博客收录, #如何收录博客 %} {% btn, 官网文档维护, #如何维护文档 %} 几个方面。 + + +### 如何维护文档 + +目前 Volantis 已是已知的 Hexo 主题中文档最全面的,但仍有部分功能缺少明确的文档、部分文档已经过时,如果您发现了遗漏或者错误之处,我们非常希望您能够帮忙完善一下。 + +Volantis 官网支持 CI ,您可以直接在线编辑源码: + +{% link 在线编辑文档::https://github.com/volantis-x/community/tree/main/source::https://unpkg.com/volantis-static@0.0.1649552113628/media/twemoji/assets/svg/270f.svg %} + + +### 发布与分享文章 + +每位用户在使用或更新主题的时候都需要阅读官网的文档,收录的相关内容能帮助用户更高效地上手,同时也能够提高被收录的文章的曝光率。如果在官网能看到更多的有价值的文章,就会有更多 Volantis 用户或者非 Volantis 用户来访问。 + +如果您有或者发现了与 Hexo 博客搭建相关的文章,可以转载外链到 Volantis 官网,示例如下: + +```md _posts/blogs/2020-05-17-pjax.md +--- +title: Volantis 主题部署 Pjax +date: 2020-05-17 +updated: 2020-08-07 +categories: [开发心得] +author: inkss +link: https://inkss.cn/blog/76993423/ +description: 本篇文章记录了我对 Volantis 主题做 Pjax 兼容的种种,大抵算是种记录吧~ +headimg: # 可以设置文章头图 +backup: https://web.archive.org/web/xxxxxxxxxx # 将页面存档到互联网档案馆 archive.org 的存档链接 https://web.archive.org/save +--- +``` + +如果这篇文章的作者是第一次出现在官网,还需要在 `_data/author.yml` 文件中添加作者信息,例如: + +```yaml _data/author.yml +... +inkss: + name: 枋柚梓 + avatar: https://cdn.jsdelivr.net/gh/inkss/common@1.4.2/hexo/img/static/avatar.jpg + url: https://inkss.cn +``` + +{% noteblock warning %} +**注意事项** +1. 文章存放在 `_posts/blogs/` 目录中,且文件名格式为「年-月-日-文章话题」。 +2. 鼓励原创文章,摘要部分300字符以内。如果想不出摘要可以不写,不要在摘要里重复一遍文章标题。 +3. 最好选择一个文章分类,如果现有的分类中没有合适的,可以自己新增。 +4. 如果有文章头图,请确保图片内最多只有一个单词或短语,图片不清晰或者与文章无关的话不建议使用。 +5. 不仅限于自己的文章,可以在征得文章作者同意的情况下将其链接收录到官网。 +{% endnoteblock %} + + +{% link 在线编辑文档::https://github.com/volantis-x/community/tree/main/source/_posts/blogs::https://unpkg.com/volantis-static@0.0.1649552113628/media/twemoji/assets/svg/1f4dd.svg %} diff --git a/source/friends/index.md b/source/friends/index.md new file mode 100755 index 0000000..9520143 --- /dev/null +++ b/source/friends/index.md @@ -0,0 +1,18 @@ +--- +layout: friends # 必须 +title: ❤❤❤❤❤ # 可选,这是友链页的标题 +--- +## 本站信息 + * 站点名称:和和日志 + * 站点网址:https://blog.yhehe.com + * 站点头像:https://photo.yhehe.com/tp/wk.webp + * 站点描述:生活记录,平淡而充实 + +## 申请友链须知 + * 您的网站已稳定运行两个月以上 + * 您的网站文章数量至少30篇以上 + * 先将本站链接放置在您的网站中 + * 您的网站已开启SSL,支持HTTPS访问 + * 您的网站已备案且正确悬挂ICP备案号 + * 本站不收录有反动、色情、赌博等不良内容或提供不良内容链接的网站 + \ No newline at end of file diff --git a/source/images/1016492437.png b/source/images/1016492437.png new file mode 100755 index 0000000..cc08c07 Binary files /dev/null and b/source/images/1016492437.png differ diff --git a/source/images/1070727026.jpg b/source/images/1070727026.jpg new file mode 100755 index 0000000..93cfb07 Binary files /dev/null and b/source/images/1070727026.jpg differ diff --git a/source/images/1077270914.jpg b/source/images/1077270914.jpg new file mode 100755 index 0000000..ae6786b Binary files /dev/null and b/source/images/1077270914.jpg differ diff --git a/source/images/1114535881.webp b/source/images/1114535881.webp new file mode 100755 index 0000000..13e50ff Binary files /dev/null and b/source/images/1114535881.webp differ diff --git a/source/images/1160243444.jpg b/source/images/1160243444.jpg new file mode 100755 index 0000000..209ab46 Binary files /dev/null and b/source/images/1160243444.jpg differ diff --git a/source/images/1244981333.png b/source/images/1244981333.png new file mode 100755 index 0000000..c699df5 Binary files /dev/null and b/source/images/1244981333.png differ diff --git a/source/images/1249358914.jpg b/source/images/1249358914.jpg new file mode 100755 index 0000000..d90f393 Binary files /dev/null and b/source/images/1249358914.jpg differ diff --git a/source/images/1268611866.webp b/source/images/1268611866.webp new file mode 100755 index 0000000..5e56970 Binary files /dev/null and b/source/images/1268611866.webp differ diff --git a/source/images/1289050677.jpg b/source/images/1289050677.jpg new file mode 100755 index 0000000..5bb5fc0 Binary files /dev/null and b/source/images/1289050677.jpg differ diff --git a/source/images/1354968797.jpg b/source/images/1354968797.jpg new file mode 100755 index 0000000..6861c3e Binary files /dev/null and b/source/images/1354968797.jpg differ diff --git a/source/images/1368959999.jpg b/source/images/1368959999.jpg new file mode 100755 index 0000000..aed1166 Binary files /dev/null and b/source/images/1368959999.jpg differ diff --git a/source/images/1370160430.jpg b/source/images/1370160430.jpg new file mode 100755 index 0000000..31a51ab Binary files /dev/null and b/source/images/1370160430.jpg differ diff --git a/source/images/1414757029.jpg b/source/images/1414757029.jpg new file mode 100755 index 0000000..aeb8872 Binary files /dev/null and b/source/images/1414757029.jpg differ diff --git a/source/images/143624192.jpg b/source/images/143624192.jpg new file mode 100755 index 0000000..53a0354 Binary files /dev/null and b/source/images/143624192.jpg differ diff --git a/source/images/1437574502.jpg b/source/images/1437574502.jpg new file mode 100755 index 0000000..0abf0ef Binary files /dev/null and b/source/images/1437574502.jpg differ diff --git a/source/images/1470542986.jpeg b/source/images/1470542986.jpeg new file mode 100755 index 0000000..f428cf5 Binary files /dev/null and b/source/images/1470542986.jpeg differ diff --git a/source/images/151629347.jpg b/source/images/151629347.jpg new file mode 100755 index 0000000..94019fc Binary files /dev/null and b/source/images/151629347.jpg differ diff --git a/source/images/1555795792.jpg b/source/images/1555795792.jpg new file mode 100755 index 0000000..668aea9 Binary files /dev/null and b/source/images/1555795792.jpg differ diff --git a/source/images/1794613199.png b/source/images/1794613199.png new file mode 100755 index 0000000..cd2957d Binary files /dev/null and b/source/images/1794613199.png differ diff --git a/source/images/1813519644.webp b/source/images/1813519644.webp new file mode 100755 index 0000000..a7be059 Binary files /dev/null and b/source/images/1813519644.webp differ diff --git a/source/images/1868064702.png b/source/images/1868064702.png new file mode 100755 index 0000000..c71b39b Binary files /dev/null and b/source/images/1868064702.png differ diff --git a/source/images/1940261270.jpg b/source/images/1940261270.jpg new file mode 100755 index 0000000..b1d3afb Binary files /dev/null and b/source/images/1940261270.jpg differ diff --git a/source/images/1985877959.jpeg b/source/images/1985877959.jpeg new file mode 100755 index 0000000..35fb1b8 Binary files /dev/null and b/source/images/1985877959.jpeg differ diff --git a/source/images/2.jpg b/source/images/2.jpg new file mode 100755 index 0000000..c0c8892 Binary files /dev/null and b/source/images/2.jpg differ diff --git a/source/images/2005928414.jpg b/source/images/2005928414.jpg new file mode 100755 index 0000000..b17f873 Binary files /dev/null and b/source/images/2005928414.jpg differ diff --git a/source/images/2041963392.jpeg b/source/images/2041963392.jpeg new file mode 100755 index 0000000..ca41d70 Binary files /dev/null and b/source/images/2041963392.jpeg differ diff --git a/source/images/204737791.jpg b/source/images/204737791.jpg new file mode 100755 index 0000000..dc57f0b Binary files /dev/null and b/source/images/204737791.jpg differ diff --git a/source/images/2095612369.png b/source/images/2095612369.png new file mode 100755 index 0000000..5f95b3f Binary files /dev/null and b/source/images/2095612369.png differ diff --git a/source/images/2112290467.jpg b/source/images/2112290467.jpg new file mode 100755 index 0000000..b5cbc58 Binary files /dev/null and b/source/images/2112290467.jpg differ diff --git a/source/images/2130435262.webp b/source/images/2130435262.webp new file mode 100755 index 0000000..99147cb Binary files /dev/null and b/source/images/2130435262.webp differ diff --git a/source/images/2159988775.jpg b/source/images/2159988775.jpg new file mode 100755 index 0000000..4b5519b Binary files /dev/null and b/source/images/2159988775.jpg differ diff --git a/source/images/2438252332.webp b/source/images/2438252332.webp new file mode 100755 index 0000000..ecff406 Binary files /dev/null and b/source/images/2438252332.webp differ diff --git a/source/images/2439963218.jpg b/source/images/2439963218.jpg new file mode 100755 index 0000000..cc26017 Binary files /dev/null and b/source/images/2439963218.jpg differ diff --git a/source/images/2537963421.jpg b/source/images/2537963421.jpg new file mode 100755 index 0000000..9e133ab Binary files /dev/null and b/source/images/2537963421.jpg differ diff --git a/source/images/2580751174.jpg b/source/images/2580751174.jpg new file mode 100755 index 0000000..ed1e7c6 Binary files /dev/null and b/source/images/2580751174.jpg differ diff --git a/source/images/2609559317.jpeg b/source/images/2609559317.jpeg new file mode 100755 index 0000000..9b6238e Binary files /dev/null and b/source/images/2609559317.jpeg differ diff --git a/source/images/267053218.jpg b/source/images/267053218.jpg new file mode 100755 index 0000000..dd98f16 Binary files /dev/null and b/source/images/267053218.jpg differ diff --git a/source/images/2708752772.jpg b/source/images/2708752772.jpg new file mode 100755 index 0000000..8e0ca92 Binary files /dev/null and b/source/images/2708752772.jpg differ diff --git a/source/images/2813026408.jpg b/source/images/2813026408.jpg new file mode 100755 index 0000000..3725354 Binary files /dev/null and b/source/images/2813026408.jpg differ diff --git a/source/images/2829302099.png b/source/images/2829302099.png new file mode 100755 index 0000000..186ad9c Binary files /dev/null and b/source/images/2829302099.png differ diff --git a/source/images/2840251280.jpg b/source/images/2840251280.jpg new file mode 100755 index 0000000..38a3dfc Binary files /dev/null and b/source/images/2840251280.jpg differ diff --git a/source/images/285357368.jpeg b/source/images/285357368.jpeg new file mode 100755 index 0000000..c840a32 Binary files /dev/null and b/source/images/285357368.jpeg differ diff --git a/source/images/2865371149.jpeg b/source/images/2865371149.jpeg new file mode 100755 index 0000000..888b657 Binary files /dev/null and b/source/images/2865371149.jpeg differ diff --git a/source/images/2915014426.webp b/source/images/2915014426.webp new file mode 100755 index 0000000..09cf3bc Binary files /dev/null and b/source/images/2915014426.webp differ diff --git a/source/images/3032842933.jpg b/source/images/3032842933.jpg new file mode 100755 index 0000000..e172e10 Binary files /dev/null and b/source/images/3032842933.jpg differ diff --git a/source/images/309893088.jpg b/source/images/309893088.jpg new file mode 100755 index 0000000..6b205ea Binary files /dev/null and b/source/images/309893088.jpg differ diff --git a/source/images/3151334889.png b/source/images/3151334889.png new file mode 100755 index 0000000..b519384 Binary files /dev/null and b/source/images/3151334889.png differ diff --git a/source/images/3240672758.jpg b/source/images/3240672758.jpg new file mode 100755 index 0000000..258b016 Binary files /dev/null and b/source/images/3240672758.jpg differ diff --git a/source/images/3362504470.jpeg b/source/images/3362504470.jpeg new file mode 100755 index 0000000..58c555e Binary files /dev/null and b/source/images/3362504470.jpeg differ diff --git a/source/images/3417357704.jpg b/source/images/3417357704.jpg new file mode 100755 index 0000000..d8f8ae4 Binary files /dev/null and b/source/images/3417357704.jpg differ diff --git a/source/images/3452876167.webp b/source/images/3452876167.webp new file mode 100755 index 0000000..203f304 Binary files /dev/null and b/source/images/3452876167.webp differ diff --git a/source/images/3460684823.jpg b/source/images/3460684823.jpg new file mode 100755 index 0000000..fbdd1c6 Binary files /dev/null and b/source/images/3460684823.jpg differ diff --git a/source/images/3516593133.jpeg b/source/images/3516593133.jpeg new file mode 100755 index 0000000..528f7bd Binary files /dev/null and b/source/images/3516593133.jpeg differ diff --git a/source/images/3557260237.jpg b/source/images/3557260237.jpg new file mode 100755 index 0000000..e2b64d7 Binary files /dev/null and b/source/images/3557260237.jpg differ diff --git a/source/images/3585035435.jpg b/source/images/3585035435.jpg new file mode 100755 index 0000000..7ba4f74 Binary files /dev/null and b/source/images/3585035435.jpg differ diff --git a/source/images/3606978280.jpg b/source/images/3606978280.jpg new file mode 100755 index 0000000..e21cd28 Binary files /dev/null and b/source/images/3606978280.jpg differ diff --git a/source/images/3629227640.jpg b/source/images/3629227640.jpg new file mode 100755 index 0000000..1a814c4 Binary files /dev/null and b/source/images/3629227640.jpg differ diff --git a/source/images/3653561249.jpg b/source/images/3653561249.jpg new file mode 100755 index 0000000..97bcbde Binary files /dev/null and b/source/images/3653561249.jpg differ diff --git a/source/images/3668127288.jpg b/source/images/3668127288.jpg new file mode 100755 index 0000000..a90e275 Binary files /dev/null and b/source/images/3668127288.jpg differ diff --git a/source/images/3677823159.png b/source/images/3677823159.png new file mode 100755 index 0000000..87435cd Binary files /dev/null and b/source/images/3677823159.png differ diff --git a/source/images/3717301590.jpg b/source/images/3717301590.jpg new file mode 100755 index 0000000..7920ca2 Binary files /dev/null and b/source/images/3717301590.jpg differ diff --git a/source/images/3720919279.jpg b/source/images/3720919279.jpg new file mode 100755 index 0000000..20c1888 Binary files /dev/null and b/source/images/3720919279.jpg differ diff --git a/source/images/3849654027.jpg b/source/images/3849654027.jpg new file mode 100755 index 0000000..7055e7a Binary files /dev/null and b/source/images/3849654027.jpg differ diff --git a/source/images/3943808564.jpg b/source/images/3943808564.jpg new file mode 100755 index 0000000..9981480 Binary files /dev/null and b/source/images/3943808564.jpg differ diff --git a/source/images/3944962017.webp b/source/images/3944962017.webp new file mode 100755 index 0000000..66da620 Binary files /dev/null and b/source/images/3944962017.webp differ diff --git a/source/images/3957780053.jpeg b/source/images/3957780053.jpeg new file mode 100755 index 0000000..a791f15 Binary files /dev/null and b/source/images/3957780053.jpeg differ diff --git a/source/images/3998032056.jpg b/source/images/3998032056.jpg new file mode 100755 index 0000000..3d9c301 Binary files /dev/null and b/source/images/3998032056.jpg differ diff --git a/source/images/4027661787.jpg b/source/images/4027661787.jpg new file mode 100755 index 0000000..2b6469a Binary files /dev/null and b/source/images/4027661787.jpg differ diff --git a/source/images/4098673435.jpg b/source/images/4098673435.jpg new file mode 100755 index 0000000..8bdb9ab Binary files /dev/null and b/source/images/4098673435.jpg differ diff --git a/source/images/4174296041.jpg b/source/images/4174296041.jpg new file mode 100755 index 0000000..9ddfb2e Binary files /dev/null and b/source/images/4174296041.jpg differ diff --git a/source/images/4190591040.png b/source/images/4190591040.png new file mode 100755 index 0000000..806e3f4 Binary files /dev/null and b/source/images/4190591040.png differ diff --git a/source/images/4202432307.jpg b/source/images/4202432307.jpg new file mode 100755 index 0000000..be196bd Binary files /dev/null and b/source/images/4202432307.jpg differ diff --git a/source/images/4253447116.jpg b/source/images/4253447116.jpg new file mode 100755 index 0000000..738b79f Binary files /dev/null and b/source/images/4253447116.jpg differ diff --git a/source/images/4255724896.jpg b/source/images/4255724896.jpg new file mode 100755 index 0000000..971b728 Binary files /dev/null and b/source/images/4255724896.jpg differ diff --git a/source/images/4274251910.png b/source/images/4274251910.png new file mode 100755 index 0000000..3f40168 Binary files /dev/null and b/source/images/4274251910.png differ diff --git a/source/images/434845943.jpg b/source/images/434845943.jpg new file mode 100755 index 0000000..d7e734d Binary files /dev/null and b/source/images/434845943.jpg differ diff --git a/source/images/436133071.webp b/source/images/436133071.webp new file mode 100755 index 0000000..c2a8c97 Binary files /dev/null and b/source/images/436133071.webp differ diff --git a/source/images/551291610.jpg b/source/images/551291610.jpg new file mode 100755 index 0000000..1038707 Binary files /dev/null and b/source/images/551291610.jpg differ diff --git a/source/images/614856839.jpg b/source/images/614856839.jpg new file mode 100755 index 0000000..1ead3bf Binary files /dev/null and b/source/images/614856839.jpg differ diff --git a/source/images/710260381.jpg b/source/images/710260381.jpg new file mode 100755 index 0000000..47d7289 Binary files /dev/null and b/source/images/710260381.jpg differ diff --git a/source/images/8072931.jpg b/source/images/8072931.jpg new file mode 100755 index 0000000..5e6590f Binary files /dev/null and b/source/images/8072931.jpg differ diff --git a/source/images/864650402.png b/source/images/864650402.png new file mode 100755 index 0000000..4dc16da Binary files /dev/null and b/source/images/864650402.png differ diff --git a/source/images/924810267.webp b/source/images/924810267.webp new file mode 100755 index 0000000..249edc0 Binary files /dev/null and b/source/images/924810267.webp differ diff --git a/source/images/939781980.jpg b/source/images/939781980.jpg new file mode 100755 index 0000000..c50f7d0 Binary files /dev/null and b/source/images/939781980.jpg differ diff --git a/source/images/982554244.png b/source/images/982554244.png new file mode 100755 index 0000000..a4c8b1a Binary files /dev/null and b/source/images/982554244.png differ diff --git a/source/images/AB Download Manager.webp b/source/images/AB Download Manager.webp new file mode 100755 index 0000000..7dea9d5 Binary files /dev/null and b/source/images/AB Download Manager.webp differ diff --git a/source/images/ab.webp b/source/images/ab.webp new file mode 100755 index 0000000..acee67f Binary files /dev/null and b/source/images/ab.webp differ diff --git a/source/images/ab1.webp b/source/images/ab1.webp new file mode 100755 index 0000000..63bfae6 Binary files /dev/null and b/source/images/ab1.webp differ diff --git a/source/images/amei/1554749389.jpg b/source/images/amei/1554749389.jpg new file mode 100755 index 0000000..7d9a931 Binary files /dev/null and b/source/images/amei/1554749389.jpg differ diff --git a/source/images/amei/1593219383.jpg b/source/images/amei/1593219383.jpg new file mode 100755 index 0000000..fcd6b62 Binary files /dev/null and b/source/images/amei/1593219383.jpg differ diff --git a/source/images/amei/2286256548.jpg b/source/images/amei/2286256548.jpg new file mode 100755 index 0000000..d8b5b77 Binary files /dev/null and b/source/images/amei/2286256548.jpg differ diff --git a/source/images/amei/3721720307.jpg b/source/images/amei/3721720307.jpg new file mode 100755 index 0000000..db5ecdf Binary files /dev/null and b/source/images/amei/3721720307.jpg differ diff --git a/source/images/amei/3746848212.jpg b/source/images/amei/3746848212.jpg new file mode 100755 index 0000000..ef966f1 Binary files /dev/null and b/source/images/amei/3746848212.jpg differ diff --git a/source/images/cjrn/1587066873.jpg b/source/images/cjrn/1587066873.jpg new file mode 100755 index 0000000..2b06fe4 Binary files /dev/null and b/source/images/cjrn/1587066873.jpg differ diff --git a/source/images/cjrn/211038625.jpg b/source/images/cjrn/211038625.jpg new file mode 100755 index 0000000..16d5e2c Binary files /dev/null and b/source/images/cjrn/211038625.jpg differ diff --git a/source/images/cjrn/4156105296.jpg b/source/images/cjrn/4156105296.jpg new file mode 100755 index 0000000..d709d7b Binary files /dev/null and b/source/images/cjrn/4156105296.jpg differ diff --git a/source/images/cjrn/4217171535.jpg b/source/images/cjrn/4217171535.jpg new file mode 100755 index 0000000..c336dac Binary files /dev/null and b/source/images/cjrn/4217171535.jpg differ diff --git a/source/images/grs/2498428064.jpg b/source/images/grs/2498428064.jpg new file mode 100755 index 0000000..74f5133 Binary files /dev/null and b/source/images/grs/2498428064.jpg differ diff --git a/source/images/grs/3074873262.jpeg b/source/images/grs/3074873262.jpeg new file mode 100755 index 0000000..a1c345c Binary files /dev/null and b/source/images/grs/3074873262.jpeg differ diff --git a/source/images/grs/3875409297.jpg b/source/images/grs/3875409297.jpg new file mode 100755 index 0000000..bec630f Binary files /dev/null and b/source/images/grs/3875409297.jpg differ diff --git a/source/images/grs/449089508.jpg b/source/images/grs/449089508.jpg new file mode 100755 index 0000000..7810947 Binary files /dev/null and b/source/images/grs/449089508.jpg differ diff --git a/source/images/grs/780658240.jpg b/source/images/grs/780658240.jpg new file mode 100755 index 0000000..3230a50 Binary files /dev/null and b/source/images/grs/780658240.jpg differ diff --git a/source/images/grs/817993974.jpg b/source/images/grs/817993974.jpg new file mode 100755 index 0000000..101e924 Binary files /dev/null and b/source/images/grs/817993974.jpg differ diff --git a/source/images/hexo.png b/source/images/hexo.png new file mode 100755 index 0000000..b9c4234 Binary files /dev/null and b/source/images/hexo.png differ diff --git a/source/images/hnzx/111153317.jpg b/source/images/hnzx/111153317.jpg new file mode 100755 index 0000000..2b0c4dc Binary files /dev/null and b/source/images/hnzx/111153317.jpg differ diff --git a/source/images/hnzx/1294845348.jpg b/source/images/hnzx/1294845348.jpg new file mode 100755 index 0000000..456a6f6 Binary files /dev/null and b/source/images/hnzx/1294845348.jpg differ diff --git a/source/images/hnzx/1764297551.jpg b/source/images/hnzx/1764297551.jpg new file mode 100755 index 0000000..8d8cfcb Binary files /dev/null and b/source/images/hnzx/1764297551.jpg differ diff --git a/source/images/hnzx/2093114833.jpg b/source/images/hnzx/2093114833.jpg new file mode 100755 index 0000000..0b83482 Binary files /dev/null and b/source/images/hnzx/2093114833.jpg differ diff --git a/source/images/hnzx/2283018544.jpg b/source/images/hnzx/2283018544.jpg new file mode 100755 index 0000000..03e20c1 Binary files /dev/null and b/source/images/hnzx/2283018544.jpg differ diff --git a/source/images/hnzx/3007125499.jpg b/source/images/hnzx/3007125499.jpg new file mode 100755 index 0000000..1ff40db Binary files /dev/null and b/source/images/hnzx/3007125499.jpg differ diff --git a/source/images/hnzx/3417357704.jpg b/source/images/hnzx/3417357704.jpg new file mode 100755 index 0000000..d8f8ae4 Binary files /dev/null and b/source/images/hnzx/3417357704.jpg differ diff --git a/source/images/hnzx/343249373.jpg b/source/images/hnzx/343249373.jpg new file mode 100755 index 0000000..38a2158 Binary files /dev/null and b/source/images/hnzx/343249373.jpg differ diff --git a/source/images/hnzx/3906201499.jpg b/source/images/hnzx/3906201499.jpg new file mode 100755 index 0000000..a8d209a Binary files /dev/null and b/source/images/hnzx/3906201499.jpg differ diff --git a/source/images/hnzx/485368304.jpg b/source/images/hnzx/485368304.jpg new file mode 100755 index 0000000..7400746 Binary files /dev/null and b/source/images/hnzx/485368304.jpg differ diff --git a/source/images/hnzx/540954845.jpg b/source/images/hnzx/540954845.jpg new file mode 100755 index 0000000..0c8b0cb Binary files /dev/null and b/source/images/hnzx/540954845.jpg differ diff --git a/source/images/hnzx/76397363.jpg b/source/images/hnzx/76397363.jpg new file mode 100755 index 0000000..6110c14 Binary files /dev/null and b/source/images/hnzx/76397363.jpg differ diff --git a/source/images/hnzx/879353965.jpg b/source/images/hnzx/879353965.jpg new file mode 100755 index 0000000..d7a37d9 Binary files /dev/null and b/source/images/hnzx/879353965.jpg differ diff --git a/source/images/hugo.png b/source/images/hugo.png new file mode 100755 index 0000000..67ca354 Binary files /dev/null and b/source/images/hugo.png differ diff --git a/source/images/qlz/1203354269.jpg b/source/images/qlz/1203354269.jpg new file mode 100755 index 0000000..858af66 Binary files /dev/null and b/source/images/qlz/1203354269.jpg differ diff --git a/source/images/qlz/1379926219.jpg b/source/images/qlz/1379926219.jpg new file mode 100755 index 0000000..48ec94e Binary files /dev/null and b/source/images/qlz/1379926219.jpg differ diff --git a/source/images/qlz/1416052999.png b/source/images/qlz/1416052999.png new file mode 100755 index 0000000..18e5655 Binary files /dev/null and b/source/images/qlz/1416052999.png differ diff --git a/source/images/qlz/3225600923.jpg b/source/images/qlz/3225600923.jpg new file mode 100755 index 0000000..e4e39f7 Binary files /dev/null and b/source/images/qlz/3225600923.jpg differ diff --git a/source/images/qlz/3657148480.webp b/source/images/qlz/3657148480.webp new file mode 100755 index 0000000..d456e6f Binary files /dev/null and b/source/images/qlz/3657148480.webp differ diff --git a/source/images/qlz/3737838135.png b/source/images/qlz/3737838135.png new file mode 100755 index 0000000..1b88548 Binary files /dev/null and b/source/images/qlz/3737838135.png differ diff --git a/source/images/sefd.webp b/source/images/sefd.webp new file mode 100755 index 0000000..5c2908e Binary files /dev/null and b/source/images/sefd.webp differ diff --git a/source/images/shanhai/65b76ade0e508.jpg b/source/images/shanhai/65b76ade0e508.jpg new file mode 100755 index 0000000..421f8c8 Binary files /dev/null and b/source/images/shanhai/65b76ade0e508.jpg differ diff --git a/source/images/shanhai/65b76ae3ba9c9.jpg b/source/images/shanhai/65b76ae3ba9c9.jpg new file mode 100755 index 0000000..298a9d9 Binary files /dev/null and b/source/images/shanhai/65b76ae3ba9c9.jpg differ diff --git a/source/images/shanhai/65b76ae871cc5.jpg b/source/images/shanhai/65b76ae871cc5.jpg new file mode 100755 index 0000000..8c7d754 Binary files /dev/null and b/source/images/shanhai/65b76ae871cc5.jpg differ diff --git a/source/images/shanhai/65b76aecc911c.jpg b/source/images/shanhai/65b76aecc911c.jpg new file mode 100755 index 0000000..5c2b269 Binary files /dev/null and b/source/images/shanhai/65b76aecc911c.jpg differ diff --git a/source/images/stsg/1098781199.jpg b/source/images/stsg/1098781199.jpg new file mode 100755 index 0000000..f1b1642 Binary files /dev/null and b/source/images/stsg/1098781199.jpg differ diff --git a/source/images/stsg/1809524367.jpg b/source/images/stsg/1809524367.jpg new file mode 100755 index 0000000..de4d829 Binary files /dev/null and b/source/images/stsg/1809524367.jpg differ diff --git a/source/images/stsg/2125671714.jpg b/source/images/stsg/2125671714.jpg new file mode 100755 index 0000000..6ca6af6 Binary files /dev/null and b/source/images/stsg/2125671714.jpg differ diff --git a/source/images/stsg/2592969818.jpg b/source/images/stsg/2592969818.jpg new file mode 100755 index 0000000..d2f7ea3 Binary files /dev/null and b/source/images/stsg/2592969818.jpg differ diff --git a/source/images/stsg/261565865.jpg b/source/images/stsg/261565865.jpg new file mode 100755 index 0000000..acd4346 Binary files /dev/null and b/source/images/stsg/261565865.jpg differ diff --git a/source/images/stsg/521167680.jpg b/source/images/stsg/521167680.jpg new file mode 100755 index 0000000..730d05b Binary files /dev/null and b/source/images/stsg/521167680.jpg differ diff --git a/source/images/stsg/767801405.jpg b/source/images/stsg/767801405.jpg new file mode 100755 index 0000000..3f418b5 Binary files /dev/null and b/source/images/stsg/767801405.jpg differ diff --git a/source/images/stsg/968045738.jpg b/source/images/stsg/968045738.jpg new file mode 100755 index 0000000..58224b4 Binary files /dev/null and b/source/images/stsg/968045738.jpg differ diff --git a/source/images/tuding.svg b/source/images/tuding.svg new file mode 100755 index 0000000..47b9a68 --- /dev/null +++ b/source/images/tuding.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/source/images/xhsd/65bcd52fcfd88.jpg b/source/images/xhsd/65bcd52fcfd88.jpg new file mode 100755 index 0000000..880e981 Binary files /dev/null and b/source/images/xhsd/65bcd52fcfd88.jpg differ diff --git a/source/images/xhsd/65bcd5399171d.jpg b/source/images/xhsd/65bcd5399171d.jpg new file mode 100755 index 0000000..1f74a10 Binary files /dev/null and b/source/images/xhsd/65bcd5399171d.jpg differ diff --git a/source/images/xhsd/65bcd582ae676.jpg b/source/images/xhsd/65bcd582ae676.jpg new file mode 100755 index 0000000..c8ae0d3 Binary files /dev/null and b/source/images/xhsd/65bcd582ae676.jpg differ diff --git a/source/images/xhsd/65bcd58bd7585.jpg b/source/images/xhsd/65bcd58bd7585.jpg new file mode 100755 index 0000000..76cddf4 Binary files /dev/null and b/source/images/xhsd/65bcd58bd7585.jpg differ diff --git a/source/images/xiaoj/1041916829.jpg b/source/images/xiaoj/1041916829.jpg new file mode 100755 index 0000000..7c5ad33 Binary files /dev/null and b/source/images/xiaoj/1041916829.jpg differ diff --git a/source/images/xiaoj/2105756945.mp4 b/source/images/xiaoj/2105756945.mp4 new file mode 100755 index 0000000..c5cd358 Binary files /dev/null and b/source/images/xiaoj/2105756945.mp4 differ diff --git a/source/images/xiaoj/3679789941.jpg b/source/images/xiaoj/3679789941.jpg new file mode 100755 index 0000000..b5efc77 Binary files /dev/null and b/source/images/xiaoj/3679789941.jpg differ diff --git a/source/images/ydas/1069602030.jpg b/source/images/ydas/1069602030.jpg new file mode 100755 index 0000000..2724d04 Binary files /dev/null and b/source/images/ydas/1069602030.jpg differ diff --git a/source/images/ydas/1390391495.jpg b/source/images/ydas/1390391495.jpg new file mode 100755 index 0000000..6d3fc94 Binary files /dev/null and b/source/images/ydas/1390391495.jpg differ diff --git a/source/images/ydas/229762072.jpg b/source/images/ydas/229762072.jpg new file mode 100755 index 0000000..9b6c99a Binary files /dev/null and b/source/images/ydas/229762072.jpg differ diff --git a/source/images/ydas/2298008444.jpg b/source/images/ydas/2298008444.jpg new file mode 100755 index 0000000..f7fa1ce Binary files /dev/null and b/source/images/ydas/2298008444.jpg differ diff --git a/source/images/ydas/3029532758.jpg b/source/images/ydas/3029532758.jpg new file mode 100755 index 0000000..d5ed0d4 Binary files /dev/null and b/source/images/ydas/3029532758.jpg differ diff --git a/source/images/ydas/3638197849.jpg b/source/images/ydas/3638197849.jpg new file mode 100755 index 0000000..8ea5f55 Binary files /dev/null and b/source/images/ydas/3638197849.jpg differ diff --git a/source/images/yq.png b/source/images/yq.png new file mode 100755 index 0000000..5239512 Binary files /dev/null and b/source/images/yq.png differ diff --git a/source/images/yxt/3057805356.webp b/source/images/yxt/3057805356.webp new file mode 100755 index 0000000..6b12fa7 Binary files /dev/null and b/source/images/yxt/3057805356.webp differ diff --git a/source/images/yxt/65bcd8d2bfb53.jpg b/source/images/yxt/65bcd8d2bfb53.jpg new file mode 100755 index 0000000..10bb68e Binary files /dev/null and b/source/images/yxt/65bcd8d2bfb53.jpg differ diff --git a/source/images/yxt/65bcd8dc5c788.jpg b/source/images/yxt/65bcd8dc5c788.jpg new file mode 100755 index 0000000..c002b58 Binary files /dev/null and b/source/images/yxt/65bcd8dc5c788.jpg differ diff --git a/source/images/yxt/65bcd8e5b69d8.jpg b/source/images/yxt/65bcd8e5b69d8.jpg new file mode 100755 index 0000000..8b92bbe Binary files /dev/null and b/source/images/yxt/65bcd8e5b69d8.jpg differ diff --git a/source/images/yxt/65bcd98242860.jpg b/source/images/yxt/65bcd98242860.jpg new file mode 100755 index 0000000..b738a65 Binary files /dev/null and b/source/images/yxt/65bcd98242860.jpg differ diff --git a/source/itv.m3u b/source/itv.m3u new file mode 100755 index 0000000..7138471 --- /dev/null +++ b/source/itv.m3u @@ -0,0 +1,379 @@ +#EXTM3U x-tvg-url="https://live.fanmingming.com/e.xml.gz" +#EXTINF:-1 tvg-name="CCTV1" tvg-logo="https://live.fanmingming.com/tv/CCTV1.png" group-title="央视",CCTV 1 +http://gslbserv.itv.cmvideo.cn/6000000001000029752/1.m3u8?channel-id=wasusyt&Contentid=6000000001000029752&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV1" tvg-logo="https://live.fanmingming.com/tv/CCTV1.png" group-title="央视",CCTV 1 50 FPS +http://gslbserv.itv.cmvideo.cn/5000000004000002226/1.m3u8?channel-id=bestzb&Contentid=5000000004000002226&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV1" tvg-logo="https://live.fanmingming.com/tv/CCTV1.png" group-title="央视",CCTV 1 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265001/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265001&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV2" tvg-logo="https://live.fanmingming.com/tv/CCTV2.png" group-title="央视",CCTV 2 +http://gslbserv.itv.cmvideo.cn/1000000001000023315/1.m3u8?channel-id=ystenlive&Contentid=1000000001000023315&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV2" tvg-logo="https://live.fanmingming.com/tv/CCTV2.png" group-title="央视",CCTV 2 50 FPS +http://gslbserv.itv.cmvideo.cn/6000000001000014161/1.m3u8?channel-id=wasusyt&Contentid=6000000001000014161&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV2" tvg-logo="https://live.fanmingming.com/tv/CCTV2.png" group-title="央视",CCTV 2 HEVC +http://gslbserv.itv.cmvideo.cn/1000000001000023315/1.m3u8?channel-id=ystenlive&Contentid=1000000001000023315&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV3" tvg-logo="https://live.fanmingming.com/tv/CCTV3.png" group-title="央视",CCTV 3 +http://gslbserv.itv.cmvideo.cn/6000000001000022313/1.m3u8?channel-id=wasusyt&Contentid=6000000001000022313&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV3" tvg-logo="https://live.fanmingming.com/tv/CCTV3.png" group-title="央视",CCTV 3 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265003/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265003&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV4" tvg-logo="https://live.fanmingming.com/tv/CCTV4.png" group-title="央视",CCTV 4 50 FPS +http://gslbserv.itv.cmvideo.cn/5000000011000031102/1.m3u8?channel-id=bestzb&Contentid=5000000011000031102&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV4" tvg-logo="https://live.fanmingming.com/tv/CCTV4.png" group-title="央视",CCTV 4 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265004/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265004&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV5" tvg-logo="https://live.fanmingming.com/tv/CCTV5.png" group-title="央视",CCTV 5 +http://gslbserv.itv.cmvideo.cn/1000000005000025222/1.m3u8?channel-id=ystenlive&Contentid=1000000005000025222&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV5" tvg-logo="https://live.fanmingming.com/tv/CCTV5.png" group-title="央视",CCTV 5 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265005/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265005&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV5+" tvg-logo="https://live.fanmingming.com/tv/CCTV5+.png" group-title="央视",CCTV 5+ +http://gslbserv.itv.cmvideo.cn/6000000001000015875/1.m3u8?channel-id=wasusyt&Contentid=6000000001000015875&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV5+" tvg-logo="https://live.fanmingming.com/tv/CCTV5+.png" group-title="央视",CCTV 5+ HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265016/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265016&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV6" tvg-logo="https://live.fanmingming.com/tv/CCTV6.png" group-title="央视",CCTV 6 +http://gslbserv.itv.cmvideo.cn/1000000001000001737/1.m3u8?channel-id=ystenlive&Contentid=1000000001000001737&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV6" tvg-logo="https://live.fanmingming.com/tv/CCTV6.png" group-title="央视",CCTV 6 50 FPS +http://gslbserv.itv.cmvideo.cn/6000000001000004574/1.m3u8?channel-id=wasusyt&Contentid=6000000001000004574&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV6" tvg-logo="https://live.fanmingming.com/tv/CCTV6.png" group-title="央视",CCTV 6 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265006/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265006&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV7" tvg-logo="https://live.fanmingming.com/tv/CCTV7.png" group-title="央视",CCTV 7 +http://gslbserv.itv.cmvideo.cn/1000000001000024341/1.m3u8?channel-id=ystenlive&Contentid=1000000001000024341&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV7" tvg-logo="https://live.fanmingming.com/tv/CCTV7.png" group-title="央视",CCTV 7 50 FPS +http://gslbserv.itv.cmvideo.cn/6000000001000009055/1.m3u8?channel-id=wasusyt&Contentid=6000000001000009055&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV7" tvg-logo="https://live.fanmingming.com/tv/CCTV7.png" group-title="央视",CCTV 7 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265007/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265007&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV8" tvg-logo="https://live.fanmingming.com/tv/CCTV8.png" group-title="央视",CCTV 8 +http://gslbserv.itv.cmvideo.cn/6000000001000001070/1.m3u8?channel-id=wasusyt&Contentid=6000000001000001070&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV8" tvg-logo="https://live.fanmingming.com/tv/CCTV8.png" group-title="央视",CCTV 8 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265008/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265008&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV9" tvg-logo="https://live.fanmingming.com/tv/CCTV9.png" group-title="央视",CCTV 9 +http://gslbserv.itv.cmvideo.cn/1000000001000014583/1.m3u8?channel-id=ystenlive&Contentid=1000000001000014583&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV9" tvg-logo="https://live.fanmingming.com/tv/CCTV9.png" group-title="央视",CCTV 9 50 FPS +http://gslbserv.itv.cmvideo.cn/6000000001000032162/1.m3u8?channel-id=wasusyt&Contentid=6000000001000032162&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV9" tvg-logo="https://live.fanmingming.com/tv/CCTV9.png" group-title="央视",CCTV 9 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265009/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265009&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV10" tvg-logo="https://live.fanmingming.com/tv/CCTV10.png" group-title="央视",CCTV 10 +http://gslbserv.itv.cmvideo.cn/1000000001000023734/1.m3u8?channel-id=ystenlive&Contentid=1000000001000023734&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV10" tvg-logo="https://live.fanmingming.com/tv/CCTV10.png" group-title="央视",CCTV 10 50 FPS +http://gslbserv.itv.cmvideo.cn/5000000004000012827/1.m3u8?channel-id=bestzb&Contentid=5000000004000012827&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV10" tvg-logo="https://live.fanmingming.com/tv/CCTV10.png" group-title="央视",CCTV 10 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265010/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265010&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV11" tvg-logo="https://live.fanmingming.com/tv/CCTV11.png" group-title="央视",CCTV 11 50 FPS +http://gslbserv.itv.cmvideo.cn/5000000011000031106/1.m3u8?channel-id=bestzb&Contentid=5000000011000031106&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV11" tvg-logo="https://live.fanmingming.com/tv/CCTV11.png" group-title="央视",CCTV 11 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265011/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265011&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV12" tvg-logo="https://live.fanmingming.com/tv/CCTV12.png" group-title="央视",CCTV 12 +http://gslbserv.itv.cmvideo.cn/1000000001000032494/1.m3u8?channel-id=ystenlive&Contentid=1000000001000032494&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV12" tvg-logo="https://live.fanmingming.com/tv/CCTV12.png" group-title="央视",CCTV 12 50 FPS +http://gslbserv.itv.cmvideo.cn/6000000001000022586/1.m3u8?channel-id=wasusyt&Contentid=6000000001000022586&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV12" tvg-logo="https://live.fanmingming.com/tv/CCTV12.png" group-title="央视",CCTV 12 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265012/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265012&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV13" tvg-logo="https://live.fanmingming.com/tv/CCTV13.png" group-title="央视",CCTV 13 50 FPS +http://gslbserv.itv.cmvideo.cn/5000000011000031108/1.m3u8?channel-id=bestzb&Contentid=5000000011000031108&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV14" tvg-logo="https://live.fanmingming.com/tv/CCTV14.png" group-title="央视",CCTV 14 +http://gslbserv.itv.cmvideo.cn/1000000001000008170/1.m3u8?channel-id=ystenlive&Contentid=1000000001000008170&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV14" tvg-logo="https://live.fanmingming.com/tv/CCTV14.png" group-title="央视",CCTV 14 50 FPS +http://gslbserv.itv.cmvideo.cn/5000000004000006673/1.m3u8?channel-id=bestzb&Contentid=5000000004000006673&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV14" tvg-logo="https://live.fanmingming.com/tv/CCTV14.png" group-title="央视",CCTV 14 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265013/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265013&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV15" tvg-logo="https://live.fanmingming.com/tv/CCTV15.png" group-title="央视",CCTV 15 50 FPS +http://gslbserv.itv.cmvideo.cn/5000000011000031109/1.m3u8?channel-id=bestzb&Contentid=5000000011000031109&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV15" tvg-logo="https://live.fanmingming.com/tv/CCTV15.png" group-title="央视",CCTV 15 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265014/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265014&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV16" tvg-logo="https://live.fanmingming.com/tv/CCTV16.png" group-title="央视",CCTV 16 +http://gslbserv.itv.cmvideo.cn/1000000006000233002/1.m3u8?channel-id=ystenlive&Contentid=1000000006000233002&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV16" tvg-logo="https://live.fanmingming.com/tv/CCTV16.png" group-title="央视",CCTV 16 4K HEVC +http://gslbserv.itv.cmvideo.cn/5000000008000023254/1.m3u8?channel-id=bestzb&Contentid=5000000008000023254&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV17" tvg-logo="https://live.fanmingming.com/tv/CCTV17.png" group-title="央视",CCTV 17 +http://gslbserv.itv.cmvideo.cn/1000000006000268004/1.m3u8?channel-id=ystenlive&Contentid=1000000006000268004&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CCTV17" tvg-logo="https://live.fanmingming.com/tv/CCTV17.png" group-title="央视",CCTV 17 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265015/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265015&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CGTN" tvg-logo="https://live.fanmingming.com/tv/CGTN.png" group-title="央视",CGTN +http://gslbserv.itv.cmvideo.cn/7745129417417101820/1.m3u8?channel-id=hnbblive&Contentid=7745129417417101820&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CGTN纪录" tvg-logo="https://live.fanmingming.com/tv/CGTN纪录.png" group-title="央视",CGTN记录 +http://gslbserv.itv.cmvideo.cn/7114647837765104058/1.m3u8?channel-id=hnbblive&Contentid=7114647837765104058&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CETV1" tvg-logo="https://live.fanmingming.com/tv/CETV1.png" group-title="央视",CETV-1 +http://gslbserv.itv.cmvideo.cn/5000000002000002652/1.m3u8?channel-id=bestzb&Contentid=5000000002000002652&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="CETV4" tvg-logo="https://live.fanmingming.com/tv/CETV4.png" group-title="央视",CETV-4 +http://gslbserv.itv.cmvideo.cn/5000000011000031126/1.m3u8?channel-id=bestzb&Contentid=5000000011000031126&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="北京卫视" tvg-logo="https://live.fanmingming.com/tv/北京卫视.png" group-title="卫视",北京卫视 +http://gslbserv.itv.cmvideo.cn/6000000001000020451/1.m3u8?channel-id=wasusyt&Contentid=6000000001000020451&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="北京卫视" tvg-logo="https://live.fanmingming.com/tv/北京卫视.png" group-title="卫视",北京卫视 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265027/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265027&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="北京纪实科教" tvg-logo="https://live.fanmingming.com/tv/北京纪实科教.png" group-title="地方",纪实科教 +http://gslbserv.itv.cmvideo.cn/1000000001000001910/1.m3u8?channel-id=ystenlive&Contentid=1000000001000001910&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="北京纪实科教" tvg-logo="https://live.fanmingming.com/tv/北京纪实科教.png" group-title="地方",纪实科教 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265020/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265020&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="卡酷少儿" tvg-logo="https://live.fanmingming.com/tv/卡酷少儿.png" group-title="地方",卡酷少儿 +http://gslbserv.itv.cmvideo.cn/7851974109718180595/1.m3u8?channel-id=bestzb&Contentid=7851974109718180595&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="安徽卫视" tvg-logo="https://live.fanmingming.com/tv/安徽卫视.png" group-title="卫视",安徽卫视 +http://gslbserv.itv.cmvideo.cn/1000000001000030159/1.m3u8?channel-id=ystenlive&Contentid=1000000001000030159&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="安徽卫视" tvg-logo="https://live.fanmingming.com/tv/安徽卫视.png" group-title="卫视",安徽卫视 50 FPS +http://gslbserv.itv.cmvideo.cn/6000000001000009954/1.m3u8?channel-id=wasusyt&Contentid=6000000001000009954&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="安徽卫视" tvg-logo="https://live.fanmingming.com/tv/安徽卫视.png" group-title="卫视",安徽卫视 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265025/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265025&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="东南卫视" tvg-logo="https://live.fanmingming.com/tv/东南卫视.png" group-title="卫视",东南卫视 +http://gslbserv.itv.cmvideo.cn/5000000004000010584/1.m3u8?channel-id=bestzb&Contentid=5000000004000010584&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="东南卫视" tvg-logo="https://live.fanmingming.com/tv/东南卫视.png" group-title="卫视",东南卫视 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265033/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265033&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="甘肃卫视" tvg-logo="https://live.fanmingming.com/tv/甘肃卫视.png" group-title="卫视",甘肃卫视 +http://gslbserv.itv.cmvideo.cn/5000000011000031121/1.m3u8?channel-id=bestzb&Contentid=5000000011000031121&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="广东卫视" tvg-logo="https://live.fanmingming.com/tv/广东卫视.png" group-title="卫视",广东卫视 +http://gslbserv.itv.cmvideo.cn/1000000001000014176/1.m3u8?channel-id=ystenlive&Contentid=1000000001000014176&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="广东卫视" tvg-logo="https://live.fanmingming.com/tv/广东卫视.png" group-title="卫视",广东卫视 50 FPS +http://gslbserv.itv.cmvideo.cn/6000000001000031076/1.m3u8?channel-id=wasusyt&Contentid=6000000001000031076&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="广东卫视" tvg-logo="https://live.fanmingming.com/tv/广东卫视.png" group-title="卫视",广东卫视 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265034/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265034&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="广西卫视" tvg-logo="https://live.fanmingming.com/tv/广西卫视.png" group-title="卫视",广西卫视 +http://gslbserv.itv.cmvideo.cn/5000000011000031118/1.m3u8?channel-id=bestzb&Contentid=5000000011000031118&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="贵州卫视" tvg-logo="https://live.fanmingming.com/tv/贵州卫视.png" group-title="卫视",贵州卫视 +http://gslbserv.itv.cmvideo.cn/5000000004000025843/1.m3u8?channel-id=bestzb&Contentid=5000000004000025843&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="海南卫视" tvg-logo="https://live.fanmingming.com/tv/海南卫视.png" group-title="卫视",海南卫视 +http://gslbserv.itv.cmvideo.cn/5000000004000006211/1.m3u8?channel-id=bestzb&Contentid=5000000004000006211&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="河北卫视" tvg-logo="https://live.fanmingming.com/tv/河北卫视.png" group-title="卫视",河北卫视 +http://gslbserv.itv.cmvideo.cn/5000000006000040016/1.m3u8?channel-id=bestzb&Contentid=5000000006000040016&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="河南卫视" tvg-logo="https://live.fanmingming.com/tv/河南卫视.png" group-title="卫视",河南卫视 +http://gslbserv.itv.cmvideo.cn/5000000011000031119/1.m3u8?channel-id=bestzb&Contentid=5000000011000031119&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="黑龙江卫视" tvg-logo="https://live.fanmingming.com/tv/黑龙江卫视.png" group-title="卫视",黑龙江卫视 +http://gslbserv.itv.cmvideo.cn/1000000001000001925/1.m3u8?channel-id=ystenlive&Contentid=1000000001000001925&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="黑龙江卫视" tvg-logo="https://live.fanmingming.com/tv/黑龙江卫视.png" group-title="卫视",黑龙江卫视 50 FPS +http://gslbserv.itv.cmvideo.cn/6000000001000016510/1.m3u8?channel-id=wasusyt&Contentid=6000000001000016510&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="黑龙江卫视" tvg-logo="https://live.fanmingming.com/tv/黑龙江卫视.png" group-title="卫视",黑龙江卫视 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265029/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265029&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="湖北卫视" tvg-logo="https://live.fanmingming.com/tv/湖北卫视.png" group-title="卫视",湖北卫视 +http://gslbserv.itv.cmvideo.cn/1000000001000024621/1.m3u8?channel-id=ystenlive&Contentid=1000000001000024621&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="湖北卫视" tvg-logo="https://live.fanmingming.com/tv/湖北卫视.png" group-title="卫视",湖北卫视 50 FPS +http://gslbserv.itv.cmvideo.cn/6000000001000015436/1.m3u8?channel-id=wasusyt&Contentid=6000000001000015436&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="湖北卫视" tvg-logo="https://live.fanmingming.com/tv/湖北卫视.png" group-title="卫视",湖北卫视 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265023/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265023&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="湖南卫视" tvg-logo="https://live.fanmingming.com/tv/湖南卫视.png" group-title="卫视",湖南卫视 +http://gslbserv.itv.cmvideo.cn/5000000004000006692/1.m3u8?channel-id=bestzb&Contentid=5000000004000006692&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="湖南卫视" tvg-logo="https://live.fanmingming.com/tv/湖南卫视.png" group-title="卫视",湖南卫视 50 FPS +http://gslbserv.itv.cmvideo.cn/6000000001000018044/1.m3u8?channel-id=wasusyt&Contentid=6000000001000018044&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="湖南卫视" tvg-logo="https://live.fanmingming.com/tv/湖南卫视.png" group-title="卫视",湖南卫视 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265024/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265024&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="金鹰纪实" tvg-logo="https://live.fanmingming.com/tv/金鹰纪实.png" group-title="地方",金鹰纪实 +http://gslbserv.itv.cmvideo.cn/5000000011000031203/1.m3u8?channel-id=bestzb&Contentid=5000000011000031203&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="快乐垂钓" tvg-logo="https://live.fanmingming.com/tv/快乐垂钓.png" group-title="地方",快乐垂钓 +http://gslbserv.itv.cmvideo.cn/5000000011000031206/1.m3u8?channel-id=bestzb&Contentid=5000000011000031206&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="茶" tvg-logo="https://live.fanmingming.com/tv/茶.png" group-title="地方",茶友频道 +http://gslbserv.itv.cmvideo.cn/5000000011000031209/1.m3u8?channel-id=bestzb&Contentid=5000000011000031209&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="吉林卫视" tvg-logo="https://live.fanmingming.com/tv/吉林卫视.png" group-title="卫视",吉林卫视 +http://gslbserv.itv.cmvideo.cn/5000000011000031117/1.m3u8?channel-id=bestzb&Contentid=5000000011000031117&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="江苏卫视" tvg-logo="https://live.fanmingming.com/tv/江苏卫视.png" group-title="卫视",江苏卫视 50 FPS +http://gslbserv.itv.cmvideo.cn/6000000001000014861/1.m3u8?channel-id=wasusyt&Contentid=6000000001000014861&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="江苏卫视" tvg-logo="https://live.fanmingming.com/tv/江苏卫视.png" group-title="卫视",江苏卫视 +http://gslbserv.itv.cmvideo.cn/1000000001000001828/1.m3u8?channel-id=ystenlive&Contentid=1000000001000001828&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="江苏卫视" tvg-logo="https://live.fanmingming.com/tv/江苏卫视.png" group-title="卫视",江苏卫视 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265030/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265030&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="江西卫视" tvg-logo="https://live.fanmingming.com/tv/江西卫视.png" group-title="卫视",江西卫视 +http://gslbserv.itv.cmvideo.cn/1000000006000268001/1.m3u8?channel-id=ystenlive&Contentid=1000000006000268001&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="江西卫视" tvg-logo="https://live.fanmingming.com/tv/江西卫视.png" group-title="卫视",江西卫视 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265032/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265032&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="辽宁卫视" tvg-logo="https://live.fanmingming.com/tv/辽宁卫视.png" group-title="卫视",辽宁卫视 +http://gslbserv.itv.cmvideo.cn/5000000004000011671/1.m3u8?channel-id=bestzb&Contentid=5000000004000011671&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="辽宁卫视" tvg-logo="https://live.fanmingming.com/tv/辽宁卫视.png" group-title="卫视",辽宁卫视 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265022/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265022&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="青海卫视" tvg-logo="https://live.fanmingming.com/tv/青海卫视.png" group-title="卫视",青海卫视 +http://gslbserv.itv.cmvideo.cn/1000000002000013359/1.m3u8?channel-id=ystenlive&Contentid=1000000002000013359&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="山东卫视" tvg-logo="https://live.fanmingming.com/tv/山东卫视.png" group-title="卫视",山东卫视 +http://gslbserv.itv.cmvideo.cn/1000000001000016568/1.m3u8?channel-id=ystenlive&Contentid=1000000001000016568&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="山东卫视" tvg-logo="https://live.fanmingming.com/tv/山东卫视.png" group-title="卫视",山东卫视 50 FPS +http://gslbserv.itv.cmvideo.cn/6000000001000004134/1.m3u8?channel-id=wasusyt&Contentid=6000000001000004134&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="山东卫视" tvg-logo="https://live.fanmingming.com/tv/山东卫视.png" group-title="卫视",山东卫视 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265019/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265019&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="东方卫视" tvg-logo="https://live.fanmingming.com/tv/东方卫视.png" group-title="卫视",东方卫视 +http://gslbserv.itv.cmvideo.cn/6000000001000003639/1.m3u8?channel-id=wasusyt&Contentid=6000000001000003639&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="东方卫视" tvg-logo="https://live.fanmingming.com/tv/东方卫视.png" group-title="卫视",东方卫视 50 FPS +http://gslbserv.itv.cmvideo.cn/5000000004000014098/1.m3u8?channel-id=bestzb&Contentid=5000000004000014098&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="东方卫视" tvg-logo="https://live.fanmingming.com/tv/东方卫视.png" group-title="卫视",东方卫视 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265018/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265018&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="上海外语" tvg-logo="https://live.fanmingming.com/tv/上海外语.png" group-title="地方",上海ICS外语 +http://gslbserv.itv.cmvideo.cn/5000000010000030951/1.m3u8?channel-id=bestzb&Contentid=5000000010000030951&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="第一财经" tvg-logo="https://live.fanmingming.com/tv/上海第一财经.png" group-title="地方",第一财经 +http://gslbserv.itv.cmvideo.cn/5000000010000027146/1.m3u8?channel-id=bestzb&Contentid=5000000010000027146&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="东方财经" tvg-logo="https://live.fanmingming.com/tv/东方财经.png" group-title="地方",东方财经 +http://gslbserv.itv.cmvideo.cn/5000000007000010003/1.m3u8?channel-id=bestzb&Contentid=5000000007000010003&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="东方影视" tvg-logo="https://live.fanmingming.com/tv/东方影视.png" group-title="地方",东方影视 +http://gslbserv.itv.cmvideo.cn/5000000010000032212/1.m3u8?channel-id=bestzb&Contentid=5000000010000032212&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="上海都市" tvg-logo="https://live.fanmingming.com/tv/上海都市.png" group-title="地方",上海都市 +http://gslbserv.itv.cmvideo.cn/5000000010000018926/1.m3u8?channel-id=bestzb&Contentid=5000000010000018926&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="法治天地" tvg-logo="https://live.fanmingming.com/tv/法治天地.png" group-title="地方",法治天地 +http://gslbserv.itv.cmvideo.cn/2000000002000000014/1.m3u8?channel-id=hnbblive&Contentid=2000000002000000014&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="哈哈炫动" tvg-logo="https://live.fanmingming.com/tv/哈哈炫动.png" group-title="地方",哈哈炫动 +http://gslbserv.itv.cmvideo.cn/5000000011000031123/1.m3u8?channel-id=bestzb&Contentid=5000000011000031123&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="纪实人文" tvg-logo="https://live.fanmingming.com/tv/纪实人文.png" group-title="地方",纪实人文 50 FPS +http://gslbserv.itv.cmvideo.cn/5000000004000010282/1.m3u8?channel-id=bestzb&Contentid=5000000004000010282&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="纪实人文" tvg-logo="https://live.fanmingming.com/tv/纪实人文.png" group-title="地方",纪实人文 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265021/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265021&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="五星体育" tvg-logo="https://live.fanmingming.com/tv/五星体育.png" group-title="地方",五星体育 +http://gslbserv.itv.cmvideo.cn/5000000010000017540/1.m3u8?channel-id=bestzb&Contentid=5000000010000017540&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="上海新闻综合" tvg-logo="https://live.fanmingming.com/tv/上视新闻.png" group-title="地方",新闻综合 +http://gslbserv.itv.cmvideo.cn/5000000011000031110/1.m3u8?channel-id=bestzb&Contentid=5000000011000031110&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="深圳卫视" tvg-logo="https://live.fanmingming.com/tv/深圳卫视.png" group-title="卫视",深圳卫视 +http://gslbserv.itv.cmvideo.cn/5000000004000007410/1.m3u8?channel-id=bestzb&Contentid=5000000004000007410&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="深圳卫视" tvg-logo="https://live.fanmingming.com/tv/深圳卫视.png" group-title="卫视",深圳卫视 50 FPS +http://gslbserv.itv.cmvideo.cn/6000000001000002116/1.m3u8?channel-id=wasusyt&Contentid=6000000001000002116&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="深圳卫视" tvg-logo="https://live.fanmingming.com/tv/深圳卫视.png" group-title="卫视",深圳卫视 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265028/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265028&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="四川卫视" tvg-logo="https://live.fanmingming.com/tv/四川卫视.png" group-title="卫视",四川卫视 +http://gslbserv.itv.cmvideo.cn/5000000004000006119/1.m3u8?channel-id=bestzb&Contentid=5000000004000006119&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="天津卫视" tvg-logo="https://live.fanmingming.com/tv/天津卫视.png" group-title="卫视",天津卫视 +http://gslbserv.itv.cmvideo.cn/5000000004000006827/1.m3u8?channel-id=bestzb&Contentid=5000000004000006827&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="天津卫视" tvg-logo="https://live.fanmingming.com/tv/天津卫视.png" group-title="卫视",天津卫视 50 FPS +http://gslbserv.itv.cmvideo.cn/6000000001000009186/1.m3u8?channel-id=wasusyt&Contentid=6000000001000009186&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="天津卫视" tvg-logo="https://live.fanmingming.com/tv/天津卫视.png" group-title="卫视",天津卫视 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265026/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265026&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="云南卫视" tvg-logo="https://live.fanmingming.com/tv/云南卫视.png" group-title="卫视",云南卫视 +http://gslbserv.itv.cmvideo.cn/5000000011000031120/1.m3u8?channel-id=bestzb&Contentid=5000000011000031120&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="浙江卫视" tvg-logo="https://live.fanmingming.com/tv/浙江卫视.png" group-title="卫视",浙江卫视 50 FPS +http://gslbserv.itv.cmvideo.cn/5000000004000007275/1.m3u8?channel-id=bestzb&Contentid=5000000004000007275&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="浙江卫视" tvg-logo="https://live.fanmingming.com/tv/浙江卫视.png" group-title="卫视",浙江卫视 +http://gslbserv.itv.cmvideo.cn/1000000001000014260/1.m3u8?channel-id=ystenlive&Contentid=1000000001000014260&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="浙江卫视" tvg-logo="https://live.fanmingming.com/tv/浙江卫视.png" group-title="卫视",浙江卫视 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265031/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265031&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="重庆卫视" tvg-logo="https://live.fanmingming.com/tv/重庆卫视.png" group-title="卫视",重庆卫视 +http://gslbserv.itv.cmvideo.cn/1000000001000001096/1.m3u8?channel-id=ystenlive&Contentid=1000000001000001096&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="重庆卫视" tvg-logo="https://live.fanmingming.com/tv/重庆卫视.png" group-title="卫视",重庆卫视 HEVC +http://gslbserv.itv.cmvideo.cn/1000000005000265017/1.m3u8?channel-id=ystenlive&Contentid=1000000005000265017&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="华数4K" tvg-logo="https://live.fanmingming.com/tv/华数4K.png" group-title="其他",华数4K +http://gslbserv.itv.cmvideo.cn/6000000003000004748/1.m3u8?channel-id=wasusyt&Contentid=6000000003000004748&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="纯享4K" tvg-logo="https://live.fanmingming.com/tv/纯享4K.png" group-title="其他",纯享4K +http://gslbserv.itv.cmvideo.cn/1000000004000011651/1.m3u8?channel-id=ystenlive&Contentid=1000000004000011651&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="咪咕视频" tvg-logo="https://live.fanmingming.com/tv/咪咕视频.png" group-title="其他",咪咕4K 1 +http://gslbserv.itv.cmvideo.cn/3000000010000005180/1.m3u8?channel-id=FifastbLive&Contentid=3000000010000005180&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="咪咕视频" tvg-logo="https://live.fanmingming.com/tv/咪咕视频.png" group-title="其他",咪咕4K 2 +http://gslbserv.itv.cmvideo.cn/3000000010000015686/1.m3u8?channel-id=FifastbLive&Contentid=3000000010000015686&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="咪咕视频" tvg-logo="https://live.fanmingming.com/tv/咪咕视频.png" group-title="其他",咪咕全民热练 +http://gslbserv.itv.cmvideo.cn/3000000020000031315/1.m3u8?channel-id=FifastbLive&Contentid=3000000020000031315&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="求索动物" tvg-logo="https://live.fanmingming.com/tv/求索动物.png" group-title="其他",求索动物 +http://gslbserv.itv.cmvideo.cn/6000000002000010046/1.m3u8?channel-id=wasusyt&Contentid=6000000002000010046&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="求索纪录" tvg-logo="https://live.fanmingming.com/tv/求索纪录.png" group-title="其他",求索纪录 +http://gslbserv.itv.cmvideo.cn/6000000002000032052/1.m3u8?channel-id=wasusyt&Contentid=6000000002000032052&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="求索科学" tvg-logo="https://live.fanmingming.com/tv/求索科学.png" group-title="其他",求索科学 +http://gslbserv.itv.cmvideo.cn/6000000002000032344/1.m3u8?channel-id=wasusyt&Contentid=6000000002000032344&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="求索生活" tvg-logo="https://live.fanmingming.com/tv/求索生活.png" group-title="其他",求索生活 +http://gslbserv.itv.cmvideo.cn/6000000002000003382/1.m3u8?channel-id=wasusyt&Contentid=6000000002000003382&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv精品综合" tvg-logo="https://live.fanmingming.com/tv/NEWTV精品综合.png" group-title="NewTV",NewTV精品综合 +http://gslbserv.itv.cmvideo.cn/1000000004000019008/1.m3u8?channel-id=ystenlive&Contentid=1000000004000019008&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv精品大剧" tvg-logo="https://live.fanmingming.com/tv/NEWTV精品大剧.png" group-title="NewTV",NewTV精品大剧 +http://gslbserv.itv.cmvideo.cn/1000000004000013968/1.m3u8?channel-id=ystenlive&Contentid=1000000004000013968&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv精品纪录" tvg-logo="https://live.fanmingming.com/tv/NEWTV精品纪录.png" group-title="NewTV",NewTV精品纪录 +http://gslbserv.itv.cmvideo.cn/1000000004000013730/1.m3u8?channel-id=ystenlive&Contentid=1000000004000013730&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv精品体育" tvg-logo="https://live.fanmingming.com/tv/NEWTV精品体育.png" group-title="NewTV",NewTV精品体育 +http://gslbserv.itv.cmvideo.cn/1000000004000014634/1.m3u8?channel-id=ystenlive&Contentid=1000000004000014634&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv精品萌宠" tvg-logo="https://live.fanmingming.com/tv/NEWTV精品萌宠.png" group-title="NewTV",NewTV精品萌宠 +http://gslbserv.itv.cmvideo.cn/1000000006000032328/1.m3u8?channel-id=ystenlive&Contentid=1000000006000032328&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv爱情喜剧" tvg-logo="https://live.fanmingming.com/tv/NEWTV爱情喜剧.png" group-title="NewTV",NewTV爱情喜剧 +http://gslbserv.itv.cmvideo.cn/2000000003000000010/1.m3u8?channel-id=hnbblive&Contentid=2000000003000000010&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv超级电视剧" tvg-logo="https://live.fanmingming.com/tv/NEWTV超级电视剧.png" group-title="NewTV",NewTV超级电视剧 +http://gslbserv.itv.cmvideo.cn/1000000006000268003/1.m3u8?channel-id=ystenlive&Contentid=1000000006000268003&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv超级电影" tvg-logo="https://live.fanmingming.com/tv/NEWTV超级电影.png" group-title="NewTV",NewTV超级电影 +http://gslbserv.itv.cmvideo.cn/1000000003000012426/1.m3u8?channel-id=ystenlive&Contentid=1000000003000012426&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv超级体育" tvg-logo="https://live.fanmingming.com/tv/NEWTV超级体育.png" group-title="NewTV",NewTV超级体育 +http://gslbserv.itv.cmvideo.cn/1000000001000009601/1.m3u8?channel-id=ystenlive&Contentid=1000000001000009601&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv超级综艺" tvg-logo="https://live.fanmingming.com/tv/NEWTV超级综艺.png" group-title="NewTV",NewTV超级综艺 +http://gslbserv.itv.cmvideo.cn/1000000006000268002/1.m3u8?channel-id=ystenlive&Contentid=1000000006000268002&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv潮妈辣婆" tvg-logo="https://live.fanmingming.com/tv/NEWTV潮妈辣婆.png" group-title="NewTV",NewTV潮妈辣婆 +http://gslbserv.itv.cmvideo.cn/2000000003000000018/1.m3u8?channel-id=hnbblive&Contentid=2000000003000000018&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv东北热剧" tvg-logo="https://live.fanmingming.com/tv/NEWTV东北热剧.png" group-title="NewTV",NewTV东北热剧 +http://gslbserv.itv.cmvideo.cn/1000000005000266013/1.m3u8?channel-id=ystenlive&Contentid=1000000005000266013&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv动作电影" tvg-logo="https://live.fanmingming.com/tv/NEWTV动作电影.png" group-title="NewTV",NewTV动作电影 +http://gslbserv.itv.cmvideo.cn/1000000004000018653/1.m3u8?channel-id=ystenlive&Contentid=1000000004000018653&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv古装剧场" tvg-logo="https://live.fanmingming.com/tv/NEWTV古装剧场.png" group-title="NewTV",NewTV古装剧场 +http://gslbserv.itv.cmvideo.cn/2000000003000000024/1.m3u8?channel-id=hnbblive&Contentid=2000000003000000024&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv欢乐剧场" tvg-logo="https://live.fanmingming.com/tv/NEWTV欢乐剧场.png" group-title="NewTV",NewTV欢乐剧场 +http://gslbserv.itv.cmvideo.cn/1000000005000266012/1.m3u8?channel-id=ystenlive&Contentid=1000000005000266012&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv家庭剧场" tvg-logo="https://live.fanmingming.com/tv/NEWTV家庭剧场.png" group-title="NewTV",NewTV家庭剧场 +http://gslbserv.itv.cmvideo.cn/1000000004000008284/1.m3u8?channel-id=ystenlive&Contentid=1000000004000008284&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv金牌综艺" tvg-logo="https://live.fanmingming.com/tv/NEWTV金牌综艺.png" group-title="NewTV",NewTV金牌综艺 +http://gslbserv.itv.cmvideo.cn/1000000004000026167/1.m3u8?channel-id=ystenlive&Contentid=1000000004000026167&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv惊悚悬疑" tvg-logo="https://live.fanmingming.com/tv/NEWTV惊悚悬疑.png" group-title="NewTV",NewTV惊悚悬疑 +http://gslbserv.itv.cmvideo.cn/1000000004000024282/1.m3u8?channel-id=ystenlive&Contentid=1000000004000024282&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv军旅剧场" tvg-logo="https://live.fanmingming.com/tv/NEWTV军旅剧场.png" group-title="NewTV",NewTV军旅剧场 +http://gslbserv.itv.cmvideo.cn/2000000003000000014/1.m3u8?channel-id=hnbblive&Contentid=2000000003000000014&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv军事评论" tvg-logo="https://live.fanmingming.com/tv/NEWTV军事评论.png" group-title="NewTV",NewTV军事评论 +http://gslbserv.itv.cmvideo.cn/2000000003000000022/1.m3u8?channel-id=hnbblive&Contentid=2000000003000000022&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv魅力潇湘" tvg-logo="https://live.fanmingming.com/tv/NEWTV魅力潇湘.png" group-title="NewTV",NewTV魅力潇湘 +http://gslbserv.itv.cmvideo.cn/1000000001000006197/1.m3u8?channel-id=ystenlive&Contentid=1000000001000006197&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv明星大片" tvg-logo="https://live.fanmingming.com/tv/NEWTV明星大片.png" group-title="NewTV",NewTV明星大片 +http://gslbserv.itv.cmvideo.cn/2000000003000000016/1.m3u8?channel-id=hnbblive&Contentid=2000000003000000016&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv农业致富" tvg-logo="https://live.fanmingming.com/tv/NEWTV农业致富.png" group-title="NewTV",NewTV农业致富 +http://gslbserv.itv.cmvideo.cn/2000000003000000003/1.m3u8?channel-id=hnbblive&Contentid=2000000003000000003&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv武博世界" tvg-logo="https://live.fanmingming.com/tv/NEWTV武博世界.png" group-title="NewTV",NewTV武博世界 +http://gslbserv.itv.cmvideo.cn/2000000003000000007/1.m3u8?channel-id=hnbblive&Contentid=2000000003000000007&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv炫舞未来" tvg-logo="https://live.fanmingming.com/tv/NEWTV炫舞未来.png" group-title="NewTV",NewTV炫舞未来 +http://gslbserv.itv.cmvideo.cn/1000000001000000515/1.m3u8?channel-id=ystenlive&Contentid=1000000001000000515&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv怡伴健康" tvg-logo="https://live.fanmingming.com/tv/NEWTV怡伴健康.png" group-title="NewTV",NewTV怡伴健康 +http://gslbserv.itv.cmvideo.cn/1000000005000266011/1.m3u8?channel-id=ystenlive&Contentid=1000000005000266011&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="newtv中国功夫" tvg-logo="https://live.fanmingming.com/tv/NEWTV中国功夫.png" group-title="NewTV",NewTV中国功夫 +http://gslbserv.itv.cmvideo.cn/2000000003000000009/1.m3u8?channel-id=hnbblive&Contentid=2000000003000000009&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="黑莓电影" tvg-logo="https://live.fanmingming.com/tv/黑莓电影.png" group-title="NewTV",NewTV黑莓电影 +http://gslbserv.itv.cmvideo.cn/1000000004000019624/1.m3u8?channel-id=ystenlive&Contentid=1000000004000019624&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="黑莓动画" tvg-logo="https://live.fanmingming.com/tv/黑莓动画.png" group-title="NewTV",NewTV黑莓动画 +http://gslbserv.itv.cmvideo.cn/1000000004000021734/1.m3u8?channel-id=ystenlive&Contentid=1000000004000021734&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="哒啵电竞" tvg-logo="https://live.fanmingming.com/tv/哒啵电竞.png" group-title="NewTV",NewTV哒啵电竞 +http://gslbserv.itv.cmvideo.cn/1000000006000032327/1.m3u8?channel-id=ystenlive&Contentid=1000000006000032327&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="哒啵赛事" tvg-logo="https://live.fanmingming.com/tv/哒啵赛事.png" group-title="NewTV",NewTV哒啵赛事 +http://gslbserv.itv.cmvideo.cn/1000000001000003775/1.m3u8?channel-id=ystenlive&Contentid=1000000001000003775&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="动漫秀场" tvg-logo="https://live.fanmingming.com/tv/动漫秀场.png" group-title="SiTV",动漫秀场 +http://gslbserv.itv.cmvideo.cn/5000000011000031113/1.m3u8?channel-id=bestzb&Contentid=5000000011000031113&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="都市剧场" tvg-logo="https://live.fanmingming.com/tv/都市剧场.png" group-title="SiTV",都市剧场 +http://gslbserv.itv.cmvideo.cn/5000000011000031111/1.m3u8?channel-id=bestzb&Contentid=5000000011000031111&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="法治天地" tvg-logo="https://live.fanmingming.com/tv/法治天地.png" group-title="SiTV",法治天地 +http://gslbserv.itv.cmvideo.cn/9001547084732463424/1.m3u8?channel-id=bestzb&Contentid=9001547084732463424&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="欢笑剧场" tvg-logo="https://live.fanmingming.com/tv/欢笑剧场.png" group-title="SiTV",欢笑剧场 +http://gslbserv.itv.cmvideo.cn/5000000002000009455/1.m3u8?channel-id=bestzb&Contentid=5000000002000009455&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="欢笑剧场" tvg-logo="https://live.fanmingming.com/tv/欢笑剧场.png" group-title="SiTV",欢笑剧场 4K +http://gslbserv.itv.cmvideo.cn/5000000007000010001/1.m3u8?channel-id=bestzb&Contentid=5000000007000010001&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="金色学堂" tvg-logo="https://live.fanmingming.com/tv/金色学堂.png" group-title="SiTV",金色学堂 +http://gslbserv.itv.cmvideo.cn/5000000010000026105/1.m3u8?channel-id=bestzb&Contentid=5000000010000026105&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="劲爆体育" tvg-logo="https://live.fanmingming.com/tv/劲爆体育.png" group-title="SiTV",劲爆体育 +http://gslbserv.itv.cmvideo.cn/5000000002000029972/1.m3u8?channel-id=bestzb&Contentid=5000000002000029972&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="乐游" tvg-logo="https://live.fanmingming.com/tv/乐游.png" group-title="SiTV",乐游 +http://gslbserv.itv.cmvideo.cn/5000000011000031112/1.m3u8?channel-id=bestzb&Contentid=5000000011000031112&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="魅力足球" tvg-logo="https://live.fanmingming.com/tv/魅力足球.png" group-title="SiTV",魅力足球 +http://gslbserv.itv.cmvideo.cn/5000000011000031207/1.m3u8?channel-id=bestzb&Contentid=5000000011000031207&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="七彩戏剧" tvg-logo="https://live.fanmingming.com/tv/七彩戏剧.png" group-title="SiTV",七彩戏剧 +http://gslbserv.itv.cmvideo.cn/5000000011000031116/1.m3u8?channel-id=bestzb&Contentid=5000000011000031116&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="生活时尚" tvg-logo="https://live.fanmingming.com/tv/生活时尚.png" group-title="SiTV",生活时尚 +http://gslbserv.itv.cmvideo.cn/5000000002000019634/1.m3u8?channel-id=bestzb&Contentid=5000000002000019634&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="游戏风云" tvg-logo="https://live.fanmingming.com/tv/游戏风云.png" group-title="SiTV",游戏风云 +http://gslbserv.itv.cmvideo.cn/5000000011000031114/1.m3u8?channel-id=bestzb&Contentid=5000000011000031114&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="iHOT爱电竞" tvg-logo="https://live.fanmingming.com/tv/IHOT爱电竞.png" group-title="iHOT",iHOT爱电竞 +http://gslbserv.itv.cmvideo.cn/6000000006000230630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000230630&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="iHOT爱谍战" tvg-logo="https://live.fanmingming.com/tv/IHOT爱谍战.png" group-title="iHOT",iHOT爱谍战 +http://gslbserv.itv.cmvideo.cn/6000000006000070630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000070630&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="iHOT爱动漫" tvg-logo="https://live.fanmingming.com/tv/IHOT爱动漫.png" group-title="iHOT",iHOT爱动漫 +http://gslbserv.itv.cmvideo.cn/6000000006000280630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000280630&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="iHOT爱都市" tvg-logo="https://live.fanmingming.com/tv/IHOT爱都市.png" group-title="iHOT",iHOT爱都市 +http://gslbserv.itv.cmvideo.cn/6000000006000080630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000080630&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="iHOT爱怀旧" tvg-logo="https://live.fanmingming.com/tv/IHOT爱怀旧.png" group-title="iHOT",iHOT爱怀旧 +http://gslbserv.itv.cmvideo.cn/6000000006000260630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000260630&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="iHOT爱经典" tvg-logo="https://live.fanmingming.com/tv/IHOT爱经典.png" group-title="iHOT",iHOT爱经典 +http://gslbserv.itv.cmvideo.cn/6000000006000060630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000060630&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="iHOT爱科幻" tvg-logo="https://live.fanmingming.com/tv/IHOT爱科幻.png" group-title="iHOT",iHOT爱科幻 +http://gslbserv.itv.cmvideo.cn/6000000006000020630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000020630&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="iHOT爱科学" tvg-logo="https://live.fanmingming.com/tv/IHOT爱科学.png" group-title="iHOT",iHOT爱科学 +http://gslbserv.itv.cmvideo.cn/6000000006000160630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000160630&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="iHOT爱浪漫" tvg-logo="https://live.fanmingming.com/tv/IHOT爱浪漫.png" group-title="iHOT",iHOT爱浪漫 +http://gslbserv.itv.cmvideo.cn/6000000006000040630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000040630&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="iHOT爱历史" tvg-logo="https://live.fanmingming.com/tv/IHOT爱历史.png" group-title="iHOT",iHOT爱历史 +http://gslbserv.itv.cmvideo.cn/6000000006000150630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000150630&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="iHOT爱旅行" tvg-logo="https://live.fanmingming.com/tv/IHOT爱旅行.png" group-title="iHOT",iHOT爱旅行 +http://gslbserv.itv.cmvideo.cn/6000000006000250630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000250630&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="iHOT爱奇谈" tvg-logo="https://live.fanmingming.com/tv/IHOT爱奇谈.png" group-title="iHOT",iHOT爱奇谈 +http://gslbserv.itv.cmvideo.cn/6000000006000270630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000270630&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="iHOT爱青春" tvg-logo="https://live.fanmingming.com/tv/IHOT爱青春.png" group-title="iHOT",iHOT爱青春 +http://gslbserv.itv.cmvideo.cn/6000000006000100630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000100630&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="iHOT爱赛车" tvg-logo="https://live.fanmingming.com/tv/IHOT爱赛车.png" group-title="iHOT",iHOT爱赛车 +http://gslbserv.itv.cmvideo.cn/6000000006000240630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000240630&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="iHOT爱体育" tvg-logo="https://live.fanmingming.com/tv/IHOT爱体育.png" group-title="iHOT",iHOT爱体育 +http://gslbserv.itv.cmvideo.cn/6000000006000290630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000290630&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="iHOT爱玩具" tvg-logo="https://live.fanmingming.com/tv/IHOT爱玩具.png" group-title="iHOT",iHOT爱玩具 +http://gslbserv.itv.cmvideo.cn/6000000006000220630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000220630&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="iHOT爱喜剧" tvg-logo="https://live.fanmingming.com/tv/IHOT爱喜剧.png" group-title="iHOT",iHOT爱喜剧 +http://gslbserv.itv.cmvideo.cn/6000000006000010630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000010630&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="iHOT爱悬疑" tvg-logo="https://live.fanmingming.com/tv/IHOT爱悬疑.png" group-title="iHOT",iHOT爱悬疑 +http://gslbserv.itv.cmvideo.cn/6000000006000050630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000050630&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="iHOT爱幼教" tvg-logo="https://live.fanmingming.com/tv/IHOT爱幼教.png" group-title="iHOT",iHOT爱幼教 +http://gslbserv.itv.cmvideo.cn/6000000006000180630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000180630&livemode=1&stbId=3 +#EXTINF:-1 tvg-name="iHOT爱院线" tvg-logo="https://live.fanmingming.com/tv/IHOT爱院线.png" group-title="iHOT",iHOT爱院线 +http://gslbserv.itv.cmvideo.cn/6000000006000030630/1.m3u8?channel-id=wasusyt&Contentid=6000000006000030630&livemode=1&stbId=3 diff --git a/source/logo.jpg b/source/logo.jpg new file mode 100755 index 0000000..c0c8892 Binary files /dev/null and b/source/logo.jpg differ diff --git a/source/music/164279280.mp3 b/source/music/164279280.mp3 new file mode 100755 index 0000000..c2d07d2 Binary files /dev/null and b/source/music/164279280.mp3 differ diff --git a/source/music/186230543.mp3 b/source/music/186230543.mp3 new file mode 100755 index 0000000..65a6298 Binary files /dev/null and b/source/music/186230543.mp3 differ diff --git a/source/music/2776462800.mp3 b/source/music/2776462800.mp3 new file mode 100755 index 0000000..2977b94 Binary files /dev/null and b/source/music/2776462800.mp3 differ diff --git a/source/music/2929110160.mp4 b/source/music/2929110160.mp4 new file mode 100755 index 0000000..d8e8b10 Binary files /dev/null and b/source/music/2929110160.mp4 differ diff --git a/source/music/3000629583.mp3 b/source/music/3000629583.mp3 new file mode 100755 index 0000000..a57ff0b Binary files /dev/null and b/source/music/3000629583.mp3 differ diff --git a/source/music/4277019225.mp4 b/source/music/4277019225.mp4 new file mode 100755 index 0000000..5516221 Binary files /dev/null and b/source/music/4277019225.mp4 differ diff --git a/source/music/Way.mp3 b/source/music/Way.mp3 new file mode 100755 index 0000000..3d23ba4 Binary files /dev/null and b/source/music/Way.mp3 differ diff --git a/source/music/fly.mp3 b/source/music/fly.mp3 new file mode 100755 index 0000000..3d23ba4 Binary files /dev/null and b/source/music/fly.mp3 differ diff --git a/source/ss/index.md b/source/ss/index.md new file mode 100755 index 0000000..df650fa --- /dev/null +++ b/source/ss/index.md @@ -0,0 +1,35 @@ +--- +layout: page +top_meta: false +bottom_meta: false +sidebar: [] +comments: false +title: 闲言碎语...🛵 +--- + + + + +
              +
              总计 0 条记录👽💖
              +
              +
              +
              + + + + + + + + + \ No newline at end of file diff --git a/source/ss/index.md2 b/source/ss/index.md2 new file mode 100755 index 0000000..e4361e2 --- /dev/null +++ b/source/ss/index.md2 @@ -0,0 +1,476 @@ + + + +
              + + \ No newline at end of file diff --git a/source/ss/ss.css b/source/ss/ss.css new file mode 100755 index 0000000..2dd3120 --- /dev/null +++ b/source/ss/ss.css @@ -0,0 +1,568 @@ +body.light-theme, +:root { + /* light theme color */ + --color-main: #222; + --color-background: #fff; + --color-text-bg: #eaeaea; + --color-text-hover: #eeeef1; + --color-memos-id: #536471; + --color-img-border: #cfd9de; + --color-tag: #2563eb; + --color-tag-hover: #54a3ff; + --color-fg-muted: #576061; + --color-border-default: #d0d7de; + --color-border-muted: #d8dee4; + --color-post-preview: #fff; + --color-memos-pre-bg: #f3f4f6;; + + /* variables for js, must be the same as these in @custom-media queries */ + --phoneWidth: (max-width: 684px); + --tabletWidth: (max-width: 900px); +} + +body.dark-theme { + /* dark theme colors */ + --color-main: #adbac7; + --color-background: #1c2128; + --color-text-bg: #22272e; + --color-text-hover: #272c32; + --color-memos-id: #71767b; + --color-img-border: #292a2d; + --color-tag: #539bf5; + --color-link: #539bf5; + --color-border-muted: #2d333b; + --color-post-preview: #4a4b50; + --color-memos-pre-bg: #2d333b; +} + +@media (prefers-color-scheme: light) { + body:not(.dark-theme) { + /* light theme color */ + --color-main: #222; + --color-background: #fff; + --color-text-bg: #eaeaea; + --color-text-hover: #eeeef1; + --color-memos-id: #536471; + --color-img-border: #cfd9de; + --color-tag: #2563eb; + --color-tag-hover: #54a3ff; + --color-fg-muted: #576061; + --color-border-default: #d0d7de; + --color-border-muted: #d8dee4; + --color-post-preview: #fff; + --color-memos-pre-bg: #f3f4f6; + } +} + +@media (prefers-color-scheme: dark) { + body:not(.light-theme) { + /* dark theme colors */ + --color-main: #adbac7; + --color-background: #1c2128; + --color-text-bg: #22272e; + --color-text-hover: #272c32; + --color-memos-id: #71767b; + --color-img-border: #292a2d; + --color-tag: #539bf5; + --color-link: #539bf5; + --color-border-muted: #2d333b; + --color-post-preview: #4a4b50; + --color-memos-pre-bg: #2d333b; + } +} +.pages a { + color: var(--color-main); + text-decoration: none; + margin-left: 1rem; +} + +.pages a:hover { + text-decoration: underline; +} + +h1 { + margin-bottom: 16px; + font-weight: 600; + line-height: 1.25; + margin: .67em 0; + margin-top: 0.67em; + margin-bottom: 0.67em; + font-weight: 600; + padding-bottom: .3em; + font-size: 2em; + border-bottom: 1px solid var(--color-border-muted); +} + +blockquote { + margin: 1em 0; + padding: 0 1em; + color: var(--color-fg-muted); + border-left: 0.25em solid var(--color-border-default); +} + +#main { + padding-top: 40px; +} + +.theme-toggle { + cursor: pointer; +} + +.total { + text-align: center; +} + +.memos { + min-height: 300px; + text-align: left; + width: 100%; + line-height: 2; + margin: 2rem 0; +} + +.memos a { + text-decoration: none; +} + +.memos a:hover { + text-decoration: underline; +} + +.memos ul { + margin-left: 0 !important; + padding-left: 0 !important; +} + +.memos__content { + flex-grow: 1; + margin-left: 50px; + position: relative; + max-width: 100%; + width: 100%; +} + +.memos__content:before { + content: ''; + position: absolute; + background: url('https://photo.yhehe.com/tp/wk1.png') no-repeat; + background-size: contain; + width: 40px; + height: 40px; + border-radius: 40px; + left: -50px; + top: 10px; + border: 0; + object-fit: cover; +} + +.memos__text { + position: relative; + background: var(--color-block); + padding: 1rem; + border-radius: 0.5rem; + font-size: 1rem; +} + +.timeline { + display: flex; + flex-direction: row; + flex-wrap: 当前rap; + margin-bottom: 1.5rem; +} + +.timeline:hover .memos__text:before { + background: var(--block-hover); + z-index: 1; +} + +.timeline:hover .memos__text { + background: var(--block-hover); +} + +.memos__text { + width: 100%; + overflow-wrap: break-word; + font-size: 1rem; + line-height: 1.75rem; +} + +.memos__text ul li { + list-style: none; +} + +.memos__text i { + margin: 0 0.25rem; +} + +.memos__text:before { + content: ""; + position: absolute; + top: 23px; + left: -7px; + width: 14px; + height: 14px; + transform: rotate(45deg); + border-radius: 3px; + background: var(--color-block); + z-index: 1; +} + +.memos__text pre { + margin-top: 0.25rem; + margin-bottom: 0.25rem; + max-width: 100%; + white-space: pre-wrap; + border-radius: 0.25rem; + background-color: var(--color-memos-pre-bg); + padding: 0.75rem; +} + +.memos__text code { + display: inline-block; + border-radius: 0.25rem; + background-color: var(--color-memos-pre-bg); + padding-left: 0.25rem; + padding-right: 0.25rem; + font-family: ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier 新,monospace; + font-size: .875rem; + line-height: 1.5rem; +} + +.memos__text pre code { + display: block; +} + +.memos__meta { + margin: 0; +} + +.memos__meta small { + font-size: 0.8rem; + font-weight: 500; + color: #8186a2; +} + +.memos__userinfo { + display: flex; + font-weight: 700; + align-items: center; +} + +.memos__verify { + margin-left: 2px; + max-width: 20px; + max-height: 20px; + color: #1d9bf0; + -moz-user-select: none; + -ms-user-select: none; + -webkit-user-select: none; + user-select: none; + vertical-align: text-bottom; + position: relative; + height: 1.25rem; + fill: currentcolor; + display: inline-block; + flex-shrink: 1; + margin-left: 4px; +} + +.memos__id { + font-size: 0.875rem; + overflow-wrap: break-word; + min-width: 0px; + box-sizing: border-box; + color: var(--color-memos-id); + display: inline; + white-space: pre-wrap; + word-wrap: break-word; + flex-shrink: 1; + font-weight: 400; + margin-left: 4px; +} + +.resource-wrapper { + display: flex; + width: 100%; + flex-direction: column; + align-items: flex-start; + justify-content: flex-start; +} + +.images-wrapper { + margin-top: 0.5rem; + display: grid; + width: 100%; + grid-template-columns: repeat(auto-fit, minmax(30%, 1fr)); + gap: 0.5rem; +} + +.resimg { + overflow: hidden; + border-radius: 0.25rem; + --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1); + --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow); + -ms-overflow-style: none; + scrollbar-width: none; + max-height: 404px; +} + +.timeline img, .resimg img { + display: block; + vertical-align: middle; + max-width: 100%; + cursor: pointer; + -o-object-fit: cover; + object-fit: cover; +} + +.tag-span { + color: var(--color-tag); +} + +.tag-span:hover { + color: var(--color-tag-hover); +} + +.load-btn { + color: var(--color-meta); + background-color: var(--color-block); + border-radius: 8px; + padding: 10px; + border: none; + margin-left: auto; + margin-right: auto; + width: 100%; +} + +.load-btn:hover { + background-color: var(--color-site-bg); +} + +.post-preview { + max-width: 780px; + height: 210px; + margin: 1em auto; + position: relative; + display: flex; + background: var(--color-post-preview); + border-radius: 4px; + box-shadow: 0 1px 2px rgba(0, 0, 0, .25), 0 0 1px rgba(0, 0, 0, .25); +} + +.post-preview--meta { + width: 75%; + padding: 25px; + overflow: hidden; +} + +.post-preview--middle { + line-height: 28px; +} + +.post-preview--title { + font-size: 18px; + margin: 0 !important; +} + +.post-preview--title a { + text-decoration: none; +} + +.post-preview--date { + font-size: 14px; + color: #999; +} + +.post-preview--excerpt { + font-size: 14px; + line-height: 1.825; +} + +.post-preview--excerpt p { + display: inline; + margin: 0; +} + +.post-preview section { + max-height: 75px; + overflow: hidden; +} + +.post-preview img { + height: 210px !important; +} + +.post-preview--image { + margin: 0 !important; + float: right; + border-radius: 0 !important; + border-top-right-radius: 2px !important; + border-bottom-right-radius: 2px !important; + border-top-left-radius: 0 !important; + border-bottom-left-radius: 0 !important; +} + + +.rating { + display: block; + line-height: 15px; +} + +.rating-star { + display: inline-block; + width: 75px; + height: 15px; + background-repeat: no-repeat; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEsAAAClCAYAAAAUAAAYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA5xJREFUeNrs3T9rFEEcxvG7qEQIglaCICKkin9AUEtBKxU7wS61VlYivgWj70TtNFj5BqzE7qxEWwsxKIoYn4UtluFmbm8nczvzm+/BjxyuDwNzu3uXD0+46f7LC5PA45Hm+WTYw1x2LRDc0jzTXB+wqMlsaLPutz8fDFjYZHYauAz3NBvt83XNnyUWNpn1nVm3OsHmsb3EomazzZnVXKMPNcc0xzUnNKc0Rzv/77fms+Z7O3vt9b1eU7bZrNN68l5zcolX4ofmsuZXTdnmMvyi2dR86Bmcac62P6vKrnVubpc0bxYE32nOab45N8YqsvPeDfcD4SOav4HjprPuu+H5BTt9LXDMfNbdLPfT678Fx6vKupt1o/O8+R3pkOaJ5/iktqx7z/qp+aq5q/nY+fczmheaK03Gs7D5rLtZdzSvA6/Ebc2u55j57HQB0TzW7AzkjiKzny6+2hlKNE8juMNcFqKBaIZndRlCNBBNgmx7ZkE0fbLtZkE0EA1EM17WuQwhGogGooFoss6296y52cNO+J6HLJoPaFdbsvA9zGerIxrPh85eWYgGooFoDiQbuAxp0UA0EVmdWbRo+ma1WbRoIBqIZtzsnHdDWjQQDUQD0WSbde5ZS2UhmtqJJtSEiVkXooFoIJre2VATJmZdiKZ2ogk1YSb8oVMvDeUPnSAaiCaPJkzMuhANRAPRQDQpsqEmTMy6EI11oolpwkA0EA1EcyDZmCYMRAPR+LMxTZjqiCamCQPRQDQQzehNGIgGooFoIJpVZ2OaMBBN7USTqgkD0UA0EE3vbKomDERTO9GkasKYJJpUTRiIBqKBaEZvwkA0EA1EA9GkyKZqwkA01olmrCYMRAPRQDR9LkO+0QmiKbAJUyTRjNWEgWggGohm9CYMRAPRQDQQzZDsWE0YiMYC0eTYhIFoIJrKiCbHJgxEY4FocmzCZEs0OTZhIBqIpjKiybEJA9FANBANROPL5tiEgWhKIJoSmzAQDURjjGhKbMJANCUQTYlNmNGIpsQmDEQD0RgjmhKbMBANRAPR1Es0JTZhIJpciMZaEwaigWgKJBprTRiIJheisdaESUo01powEA1EUyDRWGvCQDQQDURjm2isNWEgmlURzWw2q4pZIBqIJkOiCVyGJpkFolkV0ejMMvel28mIRptl7ku3IRqIpjCimfNuaJpZIBqIBqIpm2ice5Z5ZonJupvVkMRu4JW4qXnrOWY++1+AAQBw9BJSCTeN9wAAAABJRU5ErkJggg==); + overflow: hidden; +} + +.allstar10 { + background-position: 0px 0px; +} + +.allstar9 { + background-position: 0px -15px; +} + +.allstar8 { + background-position: 0px -30px; +} + +.allstar7 { + background-position: 0px -45px; +} + +.allstar6 { + background-position: 0px -60px; +} + +.allstar5 { + background-position: 0px -75px; +} + +.allstar4 { + background-position: 0px -90px; +} + +.allstar3 { + background-position: 0px -105px; +} + +.allstar2 { + background-position: 0px -120px; +} + +.allstar1 { + background-position: 0px -135px; +} + +.allstar0 { + background-position: 0px -150px; +} + +.rating-average { + color: #777; + display: inline-block; + font-size: 13px; + margin-left: 10px; +} + +.spotify-wrapper>iframe { + position: relative; + height: 152px; +} + +@media (max-width: 683px) { + + body { + padding: 45px 50px 45px 20px; + } + + .menu, + .title { + font-size: 1rem; + } + + .memos__content { + margin-left: 0; + } + + .memos__text:before { + display: none; + } + + .memos__userinfo { + margin-left: 30px; + } + + .memos__content:before { + border-radius: 25px; + height: 25px; + width: 25px; + left: 15px; + top: 15px; + z-index: 2; + } + + .load-btn { + margin-left: 0; + } + + .timeline ul li { + margin-left: 0; + } + + .timeline ul li div { + width: calc(100vw - 75px); + left: 30px; + max-width: 585px; + } + + .post-preview { + width: 95%; + } + + .post-preview--excerpt { + display: none; + } + + .post-preview--middle { + line-height: 19px; + } + + .load-btn { + margin-left: 0; + } +} + +.video-wrapper { + height: 0; + overflow: hidden; + padding-bottom: 56.25%; + position: relative; + width: 100%; +} + +.video-wrapper iframe { + border: 0; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +footer { + padding: 40px 0; + text-align: center; +} + +.hidden { + display: none !important; +} + +.filter{ + display:none; +} \ No newline at end of file diff --git a/source/tags/index.md b/source/tags/index.md new file mode 100755 index 0000000..d0d8dae --- /dev/null +++ b/source/tags/index.md @@ -0,0 +1,7 @@ +--- +title: 所有标签 +layout: tag +top_meta: false +bottom_meta: false +sidebar: [] +--- diff --git a/source/tp/tuding.svg b/source/tp/tuding.svg new file mode 100755 index 0000000..47b9a68 --- /dev/null +++ b/source/tp/tuding.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/.gitkeep b/themes/.gitkeep new file mode 100755 index 0000000..e69de29 diff --git a/themes/volantis/.github/ISSUE_TEMPLATE/config.yml b/themes/volantis/.github/ISSUE_TEMPLATE/config.yml new file mode 100755 index 0000000..3426609 --- /dev/null +++ b/themes/volantis/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: false +contact_links: + - name: 提问一个关于Volantis的问题或者寻求支持 + url: https://github.com/volantis-x/hexo-theme-volantis/discussions/new + about: Ask a question about volantis or get support + - name: 提问的智慧 + url: https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md + about: How To Ask Questions The Smart Way \ No newline at end of file diff --git a/themes/volantis/.github/ISSUE_TEMPLATE/zh-cn-1-help.yaml b/themes/volantis/.github/ISSUE_TEMPLATE/zh-cn-1-help.yaml new file mode 100755 index 0000000..c886ba6 --- /dev/null +++ b/themes/volantis/.github/ISSUE_TEMPLATE/zh-cn-1-help.yaml @@ -0,0 +1,89 @@ +name: 问题:使用遇到问题(报错、样式与示例不一致等) +description: 此模板适用于解决使用主题搭建博客遇到的问题。 +title: "【问题】:" +labels: help +body: + - type: markdown + attributes: + value: | + 请务必认真填写,足够的信息能帮助我们快速定位问题并及时修复。 + - type: checkboxes + id: checks + attributes: + label: 检查清单 + description: 请认真检查以下清单中的每一项,并在相符的项前打勾。 + options: + - label: 已经搜索过,没有发现类似 issue。 + - label: 已经搜索过[主题文档](https://volantis.js.org/),没有发现相关内容。 + - label: 已经尝试使用过[最新版](https://github.com/volantis-x/hexo-theme-volantis/releases),问题依旧存在。 + - type: dropdown + id: theme-version + attributes: + label: 主题版本 + description: 请选择您所使用的主题版本。 + options: + - 6.x + - 5.x + - 4.x + - Other + validations: + required: true + - type: input + id: bug-url + attributes: + label: 复现地址 + description: 请输入可供复现的访问地址。 + placeholder: "如: https://volantis.js.org/v5/getting-started/" + validations: + required: true + - type: textarea + id: description + attributes: + label: 问题描述 + description: 请告诉我们发生了什么? + placeholder: 请详细描述您所遇到的情况:复现步骤、操作过程、主题安装方式、仓库地址、截图等内容。 + validations: + required: true + - type: textarea + id: config-file + attributes: + label: 配置文件 + description: 请提供您的配置文件。 + value: | +
              站点配置文件

              + + ```yml + 在这里粘贴替换 `blog/_config.yml` 中修改过的部分 + ``` + +

              + +
              主题配置文件

              + + ```yml + 在这里粘贴替换 `themes/volantis/_config.yml` 中修改过的部分 + ``` + +

              + - type: textarea + id: environment + attributes: + label: 环境信息 + description: 请提供您的环境信息,打开终端在博客目录下执行命令获取内容。 + value: | +
              node.js & npm

              + + ``` + 在这里粘贴替换 `node -v && npm -v` 输出的信息 + ``` + +

              + +
              package.json

              + + ``` + 在这里粘贴替换 `npm ls --depth 0` 输出的信息 + ``` + +

              + diff --git a/themes/volantis/.github/ISSUE_TEMPLATE/zh-cn-5-feature-request.yaml b/themes/volantis/.github/ISSUE_TEMPLATE/zh-cn-5-feature-request.yaml new file mode 100755 index 0000000..1cdaaa1 --- /dev/null +++ b/themes/volantis/.github/ISSUE_TEMPLATE/zh-cn-5-feature-request.yaml @@ -0,0 +1,29 @@ +name: 建议:新增或优化某一项功能 +description: 此模板适用于建议以及讨论是否新增功能或者对现有功能作出调整。 +title: "【建议】:" +labels: feature-request +body: + - type: markdown + attributes: + value: | + 请务必认真填写,足够的信息能帮助我们了解具体的需求。 + - type: checkboxes + id: checks + attributes: + label: 检查清单 + description: 请认真检查以下清单中的每一项,并在相符的项前打勾。 + options: + - label: 已经搜索过,没有发现类似 issue。 + - label: 已经阅读 hexo 官方文档,未发现原生支持。 + - type: textarea + id: description + attributes: + label: 需求描述 + description: 请告诉我们您期望添加什么功能? + validations: + required: true + - type: textarea + id: link + attributes: + label: 参考链接 + description: 请提供可供我们参考的链接。 diff --git a/themes/volantis/.github/ISSUE_TEMPLATE/zh-cn-8-bug-report.yaml b/themes/volantis/.github/ISSUE_TEMPLATE/zh-cn-8-bug-report.yaml new file mode 100755 index 0000000..3665421 --- /dev/null +++ b/themes/volantis/.github/ISSUE_TEMPLATE/zh-cn-8-bug-report.yaml @@ -0,0 +1,72 @@ +name: 反馈:主题的代码错误 +description: 此模板适用于您已经定位到了问题的具体所在,不需要协助定位问题。报告给开发者予以修复。 +title: "【反馈】:" +labels: bug-report +body: + - type: markdown + attributes: + value: | + 请务必认真填写,足够的信息能帮助我们更快的解决问题。 + - type: checkboxes + id: checks + attributes: + label: 检查清单 + description: 请认真检查以下清单中的每一项,并在相符的项前打勾。 + options: + - label: 已经搜索过,没有发现类似 issue。 + - label: 已经将主题升级到最新版本。 + - label: 主题官网也存在这个问题。 + - type: input + id: bug-url + attributes: + label: 复现地址 + description: 请输入可供复现的访问地址。 + - type: textarea + id: description + attributes: + label: 复现步骤 + description: 请告诉我们发生了什么? + validations: + required: true + - type: textarea + id: config-file + attributes: + label: 配置文件 + description: 请提供您的配置文件。 + value: | +
              站点配置文件

              + + ```yml + 在这里粘贴替换 `blog/_config.yml` 中修改过的部分 + ``` + +

              + +
              主题配置文件

              + + ```yml + 在这里粘贴替换 `themes/volantis/_config.yml` 中修改过的部分 + ``` + +

              + - type: textarea + id: environment + attributes: + label: 环境信息 + description: 请提供您的环境信息,打开终端在博客目录下执行命令获取内容。 + value: | +
              node.js & npm

              + + ``` + 在这里粘贴替换 `node -v && npm -v` 输出的信息 + ``` + +

              + +
              package.json

              + + ``` + 在这里粘贴替换 `npm ls --depth 0` 输出的信息 + ``` + +

              \ No newline at end of file diff --git a/themes/volantis/.github/ISSUE_TEMPLATE/zh-cn-9-other-issue.yaml b/themes/volantis/.github/ISSUE_TEMPLATE/zh-cn-9-other-issue.yaml new file mode 100755 index 0000000..4ee27e4 --- /dev/null +++ b/themes/volantis/.github/ISSUE_TEMPLATE/zh-cn-9-other-issue.yaml @@ -0,0 +1,10 @@ +name: 其它:额外议题 +description: 使用此模板意味着您不需要帮助,也不需要开发者优先关注此话题。 +title: "【其它】:" +body: + - type: textarea + id: description + attributes: + label: 议题内容 + validations: + required: true \ No newline at end of file diff --git a/themes/volantis/.github/PULL_REQUEST_TEMPLATE.md b/themes/volantis/.github/PULL_REQUEST_TEMPLATE.md new file mode 100755 index 0000000..251dab2 --- /dev/null +++ b/themes/volantis/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,28 @@ +## PR Type + + + + + +- [ ] Bugfix. +- [ ] Feature. +- [ ] Code style update (formatting, local variables). +- [ ] Refactoring (no functional changes, no api changes). +- [ ] Build & CI related changes. +- [ ] Documentation. +- [ ] Translation. +- [ ] Other... Please describe: + +## Description + + + + +## Others + +- Issue resolved: + +- Screenshots with this changes: + +- Link to demo site with this changes: + diff --git a/themes/volantis/.github/config.yml b/themes/volantis/.github/config.yml new file mode 100755 index 0000000..d76f4bc --- /dev/null +++ b/themes/volantis/.github/config.yml @@ -0,0 +1,40 @@ +# Configuration for request-info - https://github.com/behaviorbot/request-info + +# *OPTIONAL* Comment to reply with +# Can be either a string : +requestInfoReplyComment: > + We would appreciate it if you could provide us with more info about this issue/pr! + +# Or an array: +# requestInfoReplyComment: +# - Ah no! young blade! That was a trifle short! +# - Tell me more ! +# - I am sure you can be more effusive + + +# *OPTIONAL* default titles to check against for lack of descriptiveness +# MUST BE ALL LOWERCASE +requestInfoDefaultTitles: + - update readme.md + - updates + +# *OPTIONAL* Label to be added to Issues and Pull Requests with insufficient information given +requestInfoLabelToAdd: 'need more info' + +# *OPTIONAL* Require Issues to contain more information than what is provided in the issue templates +# Will fail if the issue's body is equal to a provided template +checkIssueTemplate: true + +# *OPTIONAL* Require Pull Requests to contain more information than what is provided in the PR template +# Will fail if the pull request's body is equal to the provided template +checkPullRequestTemplate: true + +# *OPTIONAL* Only warn about insufficient information on these events type +# Keys must be lowercase. Valid values are 'issue' and 'pullRequest' +requestInfoOn: + pullRequest: true + issue: true + +# *OPTIONAL* Add a list of people whose Issues/PRs will not be commented on +# keys must be GitHub usernames +requestInfoUserstoExclude: diff --git a/themes/volantis/.github/dependabot.yml b/themes/volantis/.github/dependabot.yml new file mode 100755 index 0000000..2829afd --- /dev/null +++ b/themes/volantis/.github/dependabot.yml @@ -0,0 +1,18 @@ +version: 2 +updates: + # daily update for deps + - package-ecosystem: npm + directory: / + schedule: + interval: daily + time: '08:00' + timezone: Asia/Shanghai + open-pull-requests-limit: 50 + + # daily update for github actions + - package-ecosystem: github-actions + directory: / + schedule: + interval: daily + time: '08:00' + timezone: Asia/Shanghai \ No newline at end of file diff --git a/themes/volantis/.github/label-commenter-config.yml b/themes/volantis/.github/label-commenter-config.yml new file mode 100755 index 0000000..7a3656b --- /dev/null +++ b/themes/volantis/.github/label-commenter-config.yml @@ -0,0 +1,142 @@ +# .github/label-commenter-config.yml + +labels: + + # 等待完成自检 + - name: waiting checklist + labeled: + issue: + body: | + :wave: Hello, + Please follow the steps in the issue template for self-check, and then tell us the result of your operation, which will help us to help you solve the problem. + + :wave: 您好, + 请按照模板中的操作步骤进行自检,然后告诉我们您的操作结果,这将有助于我们协助您解决问题。 + + # 需要更多信息 + - name: need more info + labeled: + issue: + body: | + :wave: Hello, + We need more information to make suggestions. Please edit your issue again, complete the information requested in the template, and describe your issue in as much detail as possible. + + :wave: 您好, + 我们需要更多信息才能给出建议,请重新编辑您的 issue ,完善模板中要求提供的信息,并尽可能详细地描述您的问题。 + + # 请描述详细一点 + - name: describe in detail + labeled: + issue: + body: | + :wave: Hello, + Please describe your problem in as much detail as possible. If you don’t know how to describe the problem in detail, this article can help you: [How To Ask Questions The Smart Way](http://www.catb.org/~esr/faqs/smart-questions.html). + + :wave: 您好, + 请尽可能详细地描述您的问题。如果不知道如何详细地描述问题,这份教程可以帮助到您:[提问的智慧](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md) 。 + + # 文档中有答案 + - name: read docs + labeled: + issue: + body: | + :wave: Hello, + Your question is answered in the official documents of [Volantis](https://volantis.js.org) and [Hexo](https://hexo.io), if you can’t find it, you can try to search. + + :wave: 您好, + 您的疑问在 [Volantis](https://volantis.js.org) 和 [Hexo](https://hexo.io) 的官方文档有答案,如果找不到可以尝试进行搜索。 + + # 采纳的建议 + - name: todo + labeled: + issue: + body: | + :wave: Hello, + Your suggestion is great, we will add this feature in subsequent versions, thank you very much! + + :wave: 您好, + 您的建议很棒,我们将会在后续版本中加入这个功能,非常感谢! + + # 迟迟没有回复 + - name: waiting response + labeled: + issue: + body: | + :wave: Hello, + Are you still there? We are waiting for your response. If you do not reply, we will close this issue. + + :wave: 您好, + 还在吗?我们正等待您的回应,如果您迟迟没有回复,我们将会关闭这个 issue 。 + + ################ 关闭 ################ + # 重复的问题 + - name: duplicate + labeled: + issue: + body: | + :wave: Hello, + This is a duplicate issue, but we still appreciate your feedback. + + :wave: 您好, + 这是一个重复的问题,但我们仍然感谢您的反馈。 + action: close + + # 不予修复 + - name: wontfix + labeled: + issue: + body: | + :wave: Hello, + Due to the design or external issues, we will not deal with this, but we still appreciate your feedback. + + :wave: 您好, + 由于设计如此,或者是外界问题导致,我们不会对此进行处理,但仍然感谢您的反馈! + action: close + + # 由于没有回复而被关闭 + - name: losing contact + labeled: + issue: + body: | + :wave: Hello, + Due to your delay in replying, we closed this issue. + + :wave: 您好, + 由于您迟迟没有回复,我们关闭了这个 issue 。 + action: close + + # 问题得以解决 + - name: resolved + labeled: + issue: + body: | + :wave: Hello, + This issue has been marked as resolved. If there are other issues, please contact us with a new issue. + + :wave: 您好, + 此 issue 已经被标记为已解决,如果还有其它问题,请提出新的 issue 联系我们。 + action: close + + # BUG得以修复 + - name: fixed + labeled: + issue: + body: | + :wave: Hello, + This bug has been fixed, please update your volantis. + + :wave: 您好, + 此 BUG 已经被修复,请更新您的 Volantis 版本。 + action: close + + # Not following issue template + - name: 🙁 Not following issue template + labeled: + issue: + body: | + :wave: Hello, + This issue is being automatically closed because it does not follow the issue template. + + :wave: 您好, + 因为您没有按照模板中的操作步骤进行自检,这个issue将被自动关闭。 + action: close \ No newline at end of file diff --git a/themes/volantis/.github/labeler.yml b/themes/volantis/.github/labeler.yml new file mode 100755 index 0000000..5f77ce4 --- /dev/null +++ b/themes/volantis/.github/labeler.yml @@ -0,0 +1,26 @@ +# Configuration for labeler - https://github.com/actions/labeler + +Actions: + - changed-files: + - any-glob-to-any-file: .github/workflows/**/* +Dependencies: + - changed-files: + - any-glob-to-any-file: package.json +Configurations: + - changed-files: + - any-glob-to-any-file: _config.yml +CSS: + - changed-files: + - any-glob-to-any-file: source/css/**/* +JS: + - changed-files: + - any-glob-to-any-file: source/js/**/* +Layout: + - changed-files: + - any-glob-to-any-file: layout/**/* +Scripts: + - changed-files: + - any-glob-to-any-file: scripts/**/* +i18n: + - changed-files: + - any-glob-to-any-file: languages/**/* diff --git a/themes/volantis/.github/publish.sh b/themes/volantis/.github/publish.sh new file mode 100755 index 0000000..a4734bb --- /dev/null +++ b/themes/volantis/.github/publish.sh @@ -0,0 +1,63 @@ +#!/bin/bash +# +# https://volantis.js.org +# +# 只有 rc 阶段的测试版本和正式版本发布到 npm +# +# 1. 输入要发布的版本号 +# 2. 修改主题 _config.yml 中的 info.theme_version +# 3. 修改主题 package.json 中的 version +# 4. 提交 commit + +# 版本号 例如 4.0.0-rc.1 +VERSION=$1 + +# 替换版本号 +function prepare() { + text="'"${VERSION}"'"" # This is theme's version." + sed -i "" "s/^ theme_version:\([^\"]\{1,\}\)/ theme_version: ${text}/g" '_config.yml' + sed -i "" "s/^ \"version\":\([^,]\{1,\}\)/ \"version\": \"${VERSION}\"/g" 'package.json' +} + +# 提交 +function commit() { + msg="release: ${VERSION}" + + printf "\n\n> \033[32m%s\033[0m" 'git add --all' + printf "\n" + git add --all + + printf "\n\n> \033[32m%s\033[0m" 'git commit -m' + printf " \033[35m%s\033[0m" ${msg} + printf "\n" + git commit -m "${msg}" + + # 变基到 main 分支 + git checkout main + git rebase dev + # 切换回 dev 开发分支 + git checkout dev + + # 推送 + printf "\n\n> \033[32m%s\033[0m" 'git push origin --all' + printf "\n" + git push origin --all + + # done + printf "\n\n> \033[32m%s\033[0m\n" 'Congratulations!' +} + + +while : +do + case $VERSION in + '') + read -p "请输入要发布的版本号: " VERSION + ;; + *) + break + ;; + esac +done + +prepare && commit diff --git a/themes/volantis/.github/workflows/label-commenter.yml b/themes/volantis/.github/workflows/label-commenter.yml new file mode 100755 index 0000000..774e291 --- /dev/null +++ b/themes/volantis/.github/workflows/label-commenter.yml @@ -0,0 +1,23 @@ +name: Label Commenter + +on: + issues: + types: + - labeled + - unlabeled + pull_request_target: + types: + - labeled + - unlabeled + +jobs: + comment: + if: github.repository == 'volantis-x/hexo-theme-volantis' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Label Commenter + uses: peaceiris/actions-label-commenter@v1 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + config_file: .github/label-commenter-config.yml diff --git a/themes/volantis/.github/workflows/labeler.yml b/themes/volantis/.github/workflows/labeler.yml new file mode 100755 index 0000000..2b9df15 --- /dev/null +++ b/themes/volantis/.github/workflows/labeler.yml @@ -0,0 +1,13 @@ +name: Pull Request Labeler + +on: + - pull_request_target + +jobs: + triage: + if: github.repository == 'volantis-x/hexo-theme-volantis' + runs-on: ubuntu-latest + steps: + - uses: actions/labeler@v5 + with: + repo-token: "${{ secrets.GITHUB_TOKEN }}" \ No newline at end of file diff --git a/themes/volantis/.github/workflows/merge-conflicts.yml b/themes/volantis/.github/workflows/merge-conflicts.yml new file mode 100755 index 0000000..3ae68ab --- /dev/null +++ b/themes/volantis/.github/workflows/merge-conflicts.yml @@ -0,0 +1,15 @@ +name: Merge conflicts +on: + push: + branches: + - main + - dev +jobs: + triage: + if: github.repository == 'volantis-x/hexo-theme-volantis' + runs-on: ubuntu-latest + steps: + - uses: mschilde/auto-label-merge-conflicts@master + with: + CONFLICT_LABEL_NAME: "has conflicts" + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/themes/volantis/.github/workflows/merge-squash-main.yml b/themes/volantis/.github/workflows/merge-squash-main.yml new file mode 100755 index 0000000..d7e58e2 --- /dev/null +++ b/themes/volantis/.github/workflows/merge-squash-main.yml @@ -0,0 +1,34 @@ +name: merge-squash-main +on: + workflow_dispatch: + +jobs: + merge: + runs-on: ubuntu-latest + steps: + - name: merge-to-main + run: | + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "github-actions[bot]" + git clone https://github.com/volantis-x/hexo-theme-volantis.git hexo-theme-volantis + cd hexo-theme-volantis + git fetch origin + git checkout main + git reset --hard dc9134662502ed2aa8d39dfa09ffe81650a2b024 + git merge dev + git push --force "https://github-actions[bot]:${{ secrets.GITHUB_TOKEN }}@github.com/volantis-x/hexo-theme-volantis.git" main:main + - name: sync-coding + run: | + curl -u ${{ secrets.CODING_TOKEN_API }} \ + -v -X POST 'https://volantis-x.coding.net/api/cci/job/387490/trigger' \ + -H 'Content-Type: application/json' \ + -d ' + { + "envs": [ + { + "name": "BRANCH", + "value": "main", + "sensitive": 0 + } + ] + }' diff --git a/themes/volantis/.github/workflows/npm-publish.yml b/themes/volantis/.github/workflows/npm-publish.yml new file mode 100755 index 0000000..290ca4b --- /dev/null +++ b/themes/volantis/.github/workflows/npm-publish.yml @@ -0,0 +1,23 @@ +name: npm-publish +on: + workflow_dispatch: + # release: + # types: [published] + +jobs: + npm-publish: + name: npm-publish + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 12 + registry-url: https://registry.npmjs.org + - name: Publish + run: | + npm publish + env: + NODE_AUTH_TOKEN: ${{ secrets.npm_token }} diff --git a/themes/volantis/.github/workflows/pr-updater.yml b/themes/volantis/.github/workflows/pr-updater.yml new file mode 100755 index 0000000..ff74472 --- /dev/null +++ b/themes/volantis/.github/workflows/pr-updater.yml @@ -0,0 +1,17 @@ +name: PR update +on: + push: + branches: + - main + workflow_dispatch: + +jobs: + autoupdate: + if: github.repository == 'volantis-x/hexo-theme-volantis' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: update all prs + uses: maxkomarychev/pr-updater-action@v1.0.1 + with: + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/themes/volantis/.github/workflows/release-please.yml b/themes/volantis/.github/workflows/release-please.yml new file mode 100755 index 0000000..381f74d --- /dev/null +++ b/themes/volantis/.github/workflows/release-please.yml @@ -0,0 +1,59 @@ +name: release-please +on: + workflow_dispatch: + +jobs: + release-please: + if: github.repository == 'volantis-x/hexo-theme-volantis' + runs-on: ubuntu-latest + steps: + - uses: google-github-actions/release-please-action@v4 + with: + release-type: node + package-name: hexo-theme-volantis + include-v-in-tag: false + default-branch: dev + npm-publish: + if: ${{ contains(github.event.head_commit.message, 'chore(dev)') && contains(github.event.head_commit.message, 'release') && github.repository == 'volantis-x/hexo-theme-volantis' }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 16 + registry-url: https://registry.npmjs.org + - name: Publish + run: | + npm publish + env: + NODE_AUTH_TOKEN: ${{ secrets.npm_token }} + merge: + if: ${{ contains(github.event.head_commit.message, 'chore(dev)') && contains(github.event.head_commit.message, 'release') && github.repository == 'volantis-x/hexo-theme-volantis' }} + runs-on: ubuntu-latest + steps: + - name: merge-to-main + run: | + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "github-actions[bot]" + git clone https://github.com/volantis-x/hexo-theme-volantis.git hexo-theme-volantis + cd hexo-theme-volantis + git fetch --all + git checkout main + git reset --hard dc9134662502ed2aa8d39dfa09ffe81650a2b024 + git merge origin/dev + git push --force "https://github-actions[bot]:${{ secrets.GITHUB_TOKEN }}@github.com/volantis-x/hexo-theme-volantis.git" main:main + - name: sync-coding + run: | + curl -u ${{ secrets.CODING_TOKEN_API }} \ + -v -X POST 'https://volantis-x.coding.net/api/cci/job/387490/trigger' \ + -H 'Content-Type: application/json' \ + -d ' + { + "envs": [ + { + "name": "BRANCH", + "value": "main", + "sensitive": 0 + } + ] + }' diff --git a/themes/volantis/.github/workflows/sync-coding.yml b/themes/volantis/.github/workflows/sync-coding.yml new file mode 100755 index 0000000..28d3bc5 --- /dev/null +++ b/themes/volantis/.github/workflows/sync-coding.yml @@ -0,0 +1,27 @@ +name: Sync Coding + +on: + push: + release: + types: [published] + +jobs: + sync: + runs-on: ubuntu-latest + + steps: + - name: Run Curl + run: | + curl -u ${{ secrets.CODING_TOKEN_API }} \ + -v -X POST 'https://volantis-x.coding.net/api/cci/job/387490/trigger' \ + -H 'Content-Type: application/json' \ + -d ' + { + "envs": [ + { + "name": "BRANCH", + "value": "${{ github.ref_name }}", + "sensitive": 0 + } + ] + }' diff --git a/themes/volantis/.github/workflows/test-deploy.yml b/themes/volantis/.github/workflows/test-deploy.yml new file mode 100755 index 0000000..438724f --- /dev/null +++ b/themes/volantis/.github/workflows/test-deploy.yml @@ -0,0 +1,42 @@ +name: Test to deploy + +on: + push: + branches: + - 6.0 + - dev + - test +jobs: + dev: + runs-on: ubuntu-latest + name: A job to Test deploying for dev. + strategy: + matrix: + node_version: ['18', '16'] + steps: + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node_version }} + - name: Clone + run: | + git clone https://github.com/volantis-x/volantis-x.github.io + cd volantis-x.github.io + git clone -b ${{ github.ref_name }} https://github.com/volantis-x/hexo-theme-volantis themes/volantis + - name: Generate Public Files + run: | + cd volantis-x.github.io + npm i + npm install hexo-cli -g + npm run start + - name: Deploy + if: ${{ matrix.node_version == '16' }} + uses: peaceiris/actions-gh-pages@v4 + with: + deploy_key: ${{ secrets.MHUIG_DEPLOY_KEY }} + external_repository: volantis-x/volantis-x.github.io + publish_branch: gh-pages + force_orphan: true + publish_dir: ./volantis-x.github.io/public + user_name: 'github-actions[bot]' + user_email: 'github-actions[bot]@users.noreply.github.com' diff --git a/themes/volantis/.gitignore b/themes/volantis/.gitignore new file mode 100755 index 0000000..4a36957 --- /dev/null +++ b/themes/volantis/.gitignore @@ -0,0 +1,6 @@ +_site/ +.sass-cache/ +.jekyll-metadata +.DS_Store +node_modules +package-lock.json diff --git a/themes/volantis/.npmignore b/themes/volantis/.npmignore new file mode 100755 index 0000000..5a1db38 --- /dev/null +++ b/themes/volantis/.npmignore @@ -0,0 +1,5 @@ +.github/ +publish.sh +node_modules +node_modules +package-lock.json \ No newline at end of file diff --git a/themes/volantis/CHANGELOG.md b/themes/volantis/CHANGELOG.md new file mode 100755 index 0000000..eb6fdf4 --- /dev/null +++ b/themes/volantis/CHANGELOG.md @@ -0,0 +1,185 @@ +# Changelog + +## [5.7.6](https://github.com/volantis-x/hexo-theme-volantis/compare/v5.7.5...v5.7.6) (2022-09-05) + + +### Performance Improvements + +* **debug:** env pjax rightMenus ([7b569cc](https://github.com/volantis-x/hexo-theme-volantis/commit/7b569cce425c0b630f00e378449c4d8809e471fe)) +* **side:** 如果 sidebar 为空,隐藏 sidebar ([a264a8c](https://github.com/volantis-x/hexo-theme-volantis/commit/a264a8c6f7cb8fd2537af227bd0297fcb17d720c)) + +## [5.7.5](https://github.com/volantis-x/hexo-theme-volantis/compare/v5.7.4...v5.7.5) (2022-08-25) + + +### Bug Fixes + +* **pandown:** Uncaught TypeError: pandown is not a function ([371b1ec](https://github.com/volantis-x/hexo-theme-volantis/commit/371b1ece729a719f102854d3175ce440f90b4a14)) +* search ([7f11915](https://github.com/volantis-x/hexo-theme-volantis/commit/7f11915c4c672f427a6044e2614ed85e7e052587)) + +## [5.7.4](https://github.com/volantis-x/hexo-theme-volantis/compare/v5.7.3...v5.7.4) (2022-08-15) + + +### Bug Fixes + +* **#793:** 修复空值 ([302c98f](https://github.com/volantis-x/hexo-theme-volantis/commit/302c98fc5b0c725fb77c6bb33d7537f8f1f2062f)) + +## [5.7.3](https://github.com/volantis-x/hexo-theme-volantis/compare/v5.7.2...v5.7.3) (2022-08-15) + + +### Bug Fixes + +* **#781:** content_visibility: false ([0c719be](https://github.com/volantis-x/hexo-theme-volantis/commit/0c719be17e8affb28dd42c9c8bfb52e3e21d9790)) +* **#793:** cdn_version: false ([cf60678](https://github.com/volantis-x/hexo-theme-volantis/commit/cf6067860312fbd6afd4ba6c14867d9ef86832fd)) +* **#793:** 移除默认配置 ([4d82dff](https://github.com/volantis-x/hexo-theme-volantis/commit/4d82dff4d41c513cfa0124cbed7e42b60236d9de)) +* **#798:** footer version link 404 ([a2a2d90](https://github.com/volantis-x/hexo-theme-volantis/commit/a2a2d90dc96fd00bb14cd742e0f05d253ef4ebed)) + +## [5.7.2](https://github.com/volantis-x/hexo-theme-volantis/compare/v5.7.1...v5.7.2) (2022-08-01) + + +### Bug Fixes + +* fix Chinese urlencode displaying problem in permalink ([#794](https://github.com/volantis-x/hexo-theme-volantis/issues/794)) ([677b820](https://github.com/volantis-x/hexo-theme-volantis/commit/677b8207f7e0863470ffcb8fd9f287ca7ec1e9cf)) +* 加引号处理herf属性中空格导致的地址错误 ([#796](https://github.com/volantis-x/hexo-theme-volantis/issues/796)) ([2bb4043](https://github.com/volantis-x/hexo-theme-volantis/commit/2bb4043bbf58eb6080e3e5743817ad4420409937)) + +## [5.7.1](https://github.com/volantis-x/hexo-theme-volantis/compare/v5.7.0...v5.7.1) (2022-07-26) + + +### Bug Fixes + +* drop node 14 ([694046b](https://github.com/volantis-x/hexo-theme-volantis/commit/694046b934be663001226fedd4fb6b2535ec9d59)) + +## [5.7.0](https://github.com/volantis-x/hexo-theme-volantis/compare/v5.6.0...v5.7.0) (2022-07-15) + + +### Features + +* add LingQue.Monitor ([f6f166e](https://github.com/volantis-x/hexo-theme-volantis/commit/f6f166e0e2834bc3c765383b4c21643df9bf7dc6)) +* **tag:** add pandown ([#785](https://github.com/volantis-x/hexo-theme-volantis/issues/785)) ([efc1966](https://github.com/volantis-x/hexo-theme-volantis/commit/efc1966f1b976a0c59ef5b08da41838bda0e7a83)) + + +### Bug Fixes + +* **artalk:** imageUploader ([#782](https://github.com/volantis-x/hexo-theme-volantis/issues/782)) ([c573d0c](https://github.com/volantis-x/hexo-theme-volantis/commit/c573d0c59b3dda882d88475ce44635647c64e4eb)) + +## [5.6.0](https://github.com/volantis-x/hexo-theme-volantis/compare/v5.5.0...v5.6.0) (2022-06-30) + + +### ⚠ BREAKING CHANGES + +* **artalk:** imgUploader -> imageUploader + +### Bug Fixes + +* **comment:** disqus ([6656237](https://github.com/volantis-x/hexo-theme-volantis/commit/665623793b7610f2d9be8c1338c23e82f1b98159)) +* **highlightjs:** cdn npm ([2caa1fb](https://github.com/volantis-x/hexo-theme-volantis/commit/2caa1fb1e630381ed9ea019038a4d8580d17703c)) +* **meta:** counter ([7470b7a](https://github.com/volantis-x/hexo-theme-volantis/commit/7470b7abcfbc545e5552363c85b9562e42e75541)) +* **rightmenu:** [#779](https://github.com/volantis-x/hexo-theme-volantis/issues/779) ([9023ce5](https://github.com/volantis-x/hexo-theme-volantis/commit/9023ce573d8ad0595990dafb13553817d749fee8)) + + +### Code Refactoring + +* **artalk:** imgUploader -> imageUploader ([8cde195](https://github.com/volantis-x/hexo-theme-volantis/commit/8cde195b30c2111338ac2bcec45bcaf145867ccf)) + + +### Miscellaneous Chores + +* release 5.6.0 ([cd60196](https://github.com/volantis-x/hexo-theme-volantis/commit/cd60196d4dc730d9d8d238ad1958f868b103ebfb)) + +## [5.5.0](https://github.com/volantis-x/hexo-theme-volantis/compare/v5.4.0...v5.5.0) (2022-06-18) + + +### Features + +* **copyright:** 精确到文章的版权声明 ([1621fbb](https://github.com/volantis-x/hexo-theme-volantis/commit/1621fbb211057b037bb28328a364fbe4fc32df5a)) +* **scrollreveal&style.css:** slow network ([c31f54a](https://github.com/volantis-x/hexo-theme-volantis/commit/c31f54a01537bd68b83ed289a406b154499d8f21)) +* **widget:** 允许侧边栏卡片的粘性定位 ([5d5c9d5](https://github.com/volantis-x/hexo-theme-volantis/commit/5d5c9d5e7e288eb654922c4659dfdc5a1442ceda)) + + +### Bug Fixes + +* **artalk:** 深色模式主动切换修复 ([e4a7e2d](https://github.com/volantis-x/hexo-theme-volantis/commit/e4a7e2d247a8ab63365b1c0c6fc04e8f9bdb5656)) +* **background:** [#776](https://github.com/volantis-x/hexo-theme-volantis/issues/776) bing ([26dc230](https://github.com/volantis-x/hexo-theme-volantis/commit/26dc230ab6377356edb86a21e7c7267433110ac1)) +* **comment:** 指定地址的评论计数统计 ([482601a](https://github.com/volantis-x/hexo-theme-volantis/commit/482601ae02ce686bce1aff6b961dd6ead28a6985)) +* **rightmenu:** aplayer disable ([1c89b63](https://github.com/volantis-x/hexo-theme-volantis/commit/1c89b631371c89975f9977550d8a5c2f586b5fd5)) +* **walinecount:** 移除重复代码 ([2e2e05d](https://github.com/volantis-x/hexo-theme-volantis/commit/2e2e05d7ca19e94f6036c48b3448c58d0401e10b)) +* **widget:** z-index ([c9c823c](https://github.com/volantis-x/hexo-theme-volantis/commit/c9c823cf772f5c26f54ddc82064e5bba79c76331)) + + +### Performance Improvements + +* **GLOBAL_CONFIG:** 减少不必要的配置输出 ([2aa234f](https://github.com/volantis-x/hexo-theme-volantis/commit/2aa234f47be05c711f4af526d0e293f5dd8e7926)) + +## [5.4.0](https://github.com/volantis-x/hexo-theme-volantis/compare/v5.3.2...v5.4.0) (2022-06-09) + + +### Features + +* **VolantisRequest:** Fetch, POST, Get ([ea98dbc](https://github.com/volantis-x/hexo-theme-volantis/commit/ea98dbcc4c3a9bfc0bf6de452e0da826276ff29c)) + + +### Bug Fixes + +* **fcircle:** CDN ([#765](https://github.com/volantis-x/hexo-theme-volantis/issues/765)) ([35a2e97](https://github.com/volantis-x/hexo-theme-volantis/commit/35a2e971da07eb30e4cb9a0fdeaafe74580cbcd0)) + +### [5.3.2](https://github.com/volantis-x/hexo-theme-volantis/compare/v5.3.1...v5.3.2) (2022-05-24) + + +### Bug Fixes + +* **check:** Check environment first ([f5692dd](https://github.com/volantis-x/hexo-theme-volantis/commit/f5692dd862cb0790a656866853e41908b2967de6)) +* **revisioned:** calcFileHash ([1402b9e](https://github.com/volantis-x/hexo-theme-volantis/commit/1402b9ea7747bdcf60e6190b243970567c033528)) + +### [5.3.1](https://github.com/volantis-x/hexo-theme-volantis/compare/v5.3.0...v5.3.1) (2022-05-23) + + +### Bug Fixes + +* **bbtalk:** js config ([4bb7a12](https://github.com/volantis-x/hexo-theme-volantis/commit/4bb7a12a8d1ab384a223b946e7da1f3ecf60c9ac)) + +## [5.3.0](https://github.com/volantis-x/hexo-theme-volantis/compare/v5.2.0...v5.3.0) (2022-05-22) + + +### Features + +* **meta:** add artalk comment count ([75c5eeb](https://github.com/volantis-x/hexo-theme-volantis/commit/75c5eeb688d52289f466d8e26b84352d7dae74b9)) + + +### Bug Fixes + +* **artalk:** fancybox/darkmode ([c03684d](https://github.com/volantis-x/hexo-theme-volantis/commit/c03684dd6d7feced55969bddc4c357a65ec0333c)) +* **meta_library:** counter ([7d42316](https://github.com/volantis-x/hexo-theme-volantis/commit/7d42316a80909125938774b9685b4962486ecc65)) + +## [5.2.0](https://github.com/volantis-x/hexo-theme-volantis/compare/v5.1.1...v5.2.0) (2022-05-21) + + +### Features + +* **artalk:** Add support for using custom imgUploader ([b69c502](https://github.com/volantis-x/hexo-theme-volantis/commit/b69c502565d8b4d6d1ad1a58fdc3fc00ac200cef)) + +### [5.1.1](https://github.com/volantis-x/hexo-theme-volantis/compare/v5.1.0...v5.1.1) (2022-05-19) + + +### Bug Fixes + +* **#761:** overflow ([74e0d04](https://github.com/volantis-x/hexo-theme-volantis/commit/74e0d04a47d17c513f0d29ecaceb49b51d63ee18)) + +## [5.1.0](https://github.com/volantis-x/hexo-theme-volantis/compare/5.0.0...v5.1.0) (2022-05-19) + + +### Features + +* release-please ([97efd35](https://github.com/volantis-x/hexo-theme-volantis/commit/97efd352d3f44d7f12a813db89c07ab0ba56e188)) + + +### Bug Fixes + +* 703 ([034d684](https://github.com/volantis-x/hexo-theme-volantis/commit/034d6847050472d7fe89335d65f371112c7449e8)) +* 706 移动端菜单栏异常 ([e1f63b3](https://github.com/volantis-x/hexo-theme-volantis/commit/e1f63b33d47a992c278eb51471e5e2816ebc138f)) +* 713 ([e1233de](https://github.com/volantis-x/hexo-theme-volantis/commit/e1233de457648ea46597a5ec4875efc5011e58b5)) +* 740 ([a845788](https://github.com/volantis-x/hexo-theme-volantis/commit/a845788c9dbc1c251e93ca6e8b557d6e1bfb849e)) +* Discuss 评论系统适配深色模式 ([#752](https://github.com/volantis-x/hexo-theme-volantis/issues/752)) ([86002b6](https://github.com/volantis-x/hexo-theme-volantis/commit/86002b67af0060e21e9ac2514aeee64377e01e69)) +* error friendly ([3bffeab](https://github.com/volantis-x/hexo-theme-volantis/commit/3bffeabc2399cd3dda5816c13b1b56be25d7f95f)) +* no-title ([48c70f8](https://github.com/volantis-x/hexo-theme-volantis/commit/48c70f8c13dd4d6dc7fa1bb5226c5987fde7971f)) +* **twikoo:** 所有页面都说同一个path的bug ([14de40b](https://github.com/volantis-x/hexo-theme-volantis/commit/14de40bbe12e1e1679a60a58e0d501625d0e7ff2)) +* 为 Discuss 添加最低高度 ([#742](https://github.com/volantis-x/hexo-theme-volantis/issues/742)) ([9bf70de](https://github.com/volantis-x/hexo-theme-volantis/commit/9bf70debfb8a38da89a7bf5f7bd7634d504aa457)) +* 修复Discuss评论区表情包在深色模式下,css权重低的bug ([#753](https://github.com/volantis-x/hexo-theme-volantis/issues/753)) ([872baf7](https://github.com/volantis-x/hexo-theme-volantis/commit/872baf7481b1bb6e47381638c5c346fb232a398a)) diff --git a/themes/volantis/LICENSE b/themes/volantis/LICENSE new file mode 100755 index 0000000..3647692 --- /dev/null +++ b/themes/volantis/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 xaoxuu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/themes/volantis/README.md b/themes/volantis/README.md new file mode 100755 index 0000000..21dfe99 --- /dev/null +++ b/themes/volantis/README.md @@ -0,0 +1,61 @@ +

              + +

              + +[![](https://img.shields.io/npm/v/hexo-theme-volantis.svg?style=flat-square)](https://www.npmjs.com/package/hexo-theme-volantis) +[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-%23FE5196?logo=conventionalcommits&logoColor=white)](https://www.conventionalcommits.org/zh-hans/v1.0.0/) + +## Getting Started + +Check your environment: + +```yaml +Hexo: 5.4 ~ 6.x +hexo-cli: 4.3 ~ latest +node.js: 16.x LTS ~ latest LTS +npm: 8.x ~ latest LTS +``` + +Edit your `_config.yml`: + +```yaml +theme: volantis +``` + +Install Volantis in terminal: + +```bash +npm i hexo-theme-volantis +``` + +## Usage + +See docs: https://volantis.js.org + +or: https://volantis.vercel.app + +## Examples + +See examples: https://volantis.js.org/examples/ + +Add your blog to examples page: https://github.com/volantis-x/examples/issues/ + +## Feedback + +Feedback to developer: https://github.com/volantis-x/hexo-theme-volantis/issues/ + +Discuss with other users: https://github.com/volantis-x/hexo-theme-volantis/discussions/ + +## Screenshot + +![](https://i.loli.net/2020/03/18/f5PQlWisvm9zbgK.jpg) + +![](https://i.loli.net/2020/03/18/XWBGf95E2t1bdnl.jpg) + +![](https://i.loli.net/2020/03/18/1TpiUwhuskGm5SV.png) + +![](https://i.loli.net/2020/03/18/LZwBtR5YO4zQH9A.png) + +![](https://i.loli.net/2020/03/18/ySw8zGHRBrDtUg7.png) + +![](https://i.loli.net/2020/03/18/5QTMYsScOz41Vhg.png) diff --git a/themes/volantis/_cdn.yml b/themes/volantis/_cdn.yml new file mode 100755 index 0000000..a4c993f --- /dev/null +++ b/themes/volantis/_cdn.yml @@ -0,0 +1,445 @@ +# cdnjs 的 version 不能使用 latest + +volantis_style: + name: hexo-theme-volantis + file: css/style.css + local: true + npm: false + static: false + cdnjs: false +volantis_app: + name: hexo-theme-volantis + file: source/js/app.js + local: true + npm: true + static: false + cdnjs: false +volantis_aplayer: + name: hexo-theme-volantis + file: source/js/plugins/aplayer.js + local: true + npm: true + static: false + cdnjs: false +volantis_parallax: + name: hexo-theme-volantis + file: source/js/plugins/parallax.js + local: true + npm: true + static: false + cdnjs: false +volantis_rightMenus: + name: hexo-theme-volantis + file: source/js/plugins/rightMenus.js + local: true + npm: true + static: false + cdnjs: false +volantis_tags_sites: + name: hexo-theme-volantis + file: source/js/plugins/tags/sites.js + local: true + npm: true + static: false + cdnjs: false +volantis_tags_friends: + name: hexo-theme-volantis + file: source/js/plugins/tags/friends.js + local: true + npm: true + static: false + cdnjs: false +volantis_tags_contributors: + name: hexo-theme-volantis + file: source/js/plugins/tags/contributors.js + local: true + npm: true + static: false + cdnjs: false +volantis_search_hexo: + name: hexo-theme-volantis + file: source/js/search/hexo.js + local: true + npm: true + static: false + cdnjs: false +volantis_search_algolia: + name: hexo-theme-volantis + file: source/js/search/algolia.js + local: true + npm: true + static: false + cdnjs: false +algolia_search_v4: + name: algoliasearch + file: dist/algoliasearch-lite.umd.js + version: 4.24.0 + npm: true + static: false + cdnjs: false +instantsearch_v4: + name: instantsearch.js + file: dist/instantsearch.production.min.js + version: 4.74.2 + npm: true + static: false + cdnjs: false +volantis_search_meilisearch: + name: hexo-theme-volantis + file: source/js/search/meilisearch.js + local: true + npm: true + static: false + cdnjs: false +instant_meilisearch: + name: "@meilisearch/instant-meilisearch" + file: dist/instant-meilisearch.umd.min.js + version: 0.13.6 + npm: true + static: false + cdnjs: false +jquery: + name: jquery + file: dist/jquery.min.js + version: 3.7.1 + local: false + npm: true + static: true + cdnjs: true +fontawesome: + name: "@fortawesome/fontawesome-free" + cdnjs_name: font-awesome + file: css/all.min.css + version: 6.6.0 + npm: true + static: true + cdnjs: true +katex_js: + name: katex + cdnjs_name: KaTeX + file: dist/katex.min.js + version: 0.16.11 + npm: true + static: true + cdnjs: true +katex_css: + name: katex + cdnjs_name: KaTeX + file: dist/katex.min.css + version: 0.16.11 + npm: true + static: true + cdnjs: true +katex_render: + name: katex + cdnjs_name: KaTeX + file: dist/contrib/auto-render.min.js + version: 0.16.11 + npm: true + static: true + cdnjs: true +mathjax: + name: mathjax + file: es5/tex-mml-chtml.js + version: 3.2.2 + npm: true + static: true + cdnjs: true +markdown: + name: github-markdown-css + file: github-markdown.min.css + version: 5.7.0 + npm: true + static: true + cdnjs: true +marked: + name: marked + file: marked.min.js + version: 14.1.2 + npm: true + static: true + cdnjs: true +hlsjs: + name: hls.js + file: dist/hls.min.js + version: 1.5.15 + npm: true + static: true + cdnjs: true +fancybox_css: + name: "@fancyapps/ui" + cdnjs_name: fancyapps-ui + file: dist/fancybox/fancybox.css + version: 5.0.36 + npm: true + static: true + cdnjs: true +fancybox_js: + name: "@fancyapps/ui" + cdnjs_name: fancyapps-ui + file: dist/fancybox/fancybox.umd.js + version: 5.0.36 + npm: true + static: true + cdnjs: true +instant_page: + name: instant.page + file: instantpage.min.js + version: 5.2.0 + npm: true + static: true + cdnjs: true +flying-pages: + name: flying-pages + file: flying-pages.min.js + version: 2.1.2 + npm: false # 不是最新版本 npm三年没更新了 version: 2.0.6 + static: true + cdnjs: false +vanilla-lazyload: + name: vanilla-lazyload + file: dist/lazyload.min.js + version: 19.1.3 + npm: true + static: true + cdnjs: true +scrollreveal: + name: scrollreveal + cdnjs_name: scrollReveal.js + file: dist/scrollreveal.min.js + version: 4.0.9 + npm: true + static: true + cdnjs: true +nodewaves_css: + name: node-waves + file: dist/waves.min.css + version: 0.7.6 + npm: true + static: true + cdnjs: true +nodewaves_js: + name: node-waves + file: dist/waves.min.js + version: 0.7.6 + npm: true + static: true + cdnjs: true +aplayer_js: + name: aplayer + file: dist/APlayer.min.js + version: 1.10.1 + npm: true + static: true + cdnjs: true +aplayer_css: + name: aplayer + file: dist/APlayer.min.css + version: 1.10.1 + npm: true + static: true + cdnjs: true +meting: + name: meting + file: dist/Meting.min.js + version: 2.0.1 + npm: true + static: true + cdnjs: false +font-awesome-animation: + name: font-awesome-animation + file: css/font-awesome-animation.min.css + version: 1.1.1 + npm: true + static: true + cdnjs: false +comment_typing: + name: comment_typing + file: comment_typing.js + version: unknown + npm: false # comment_typing.js 来源未知 + static: true + cdnjs: false +busuanzi: + name: penndu + file: bsz.js + version: 13.0.0 + npm: true + static: true + cdnjs: false +artalk_js: + name: artalk + file: dist/Artalk.js + version: 2.9.1 + npm: true + static: false + cdnjs: true +artalk_css: + name: artalk + file: dist/Artalk.css + version: 2.9.1 + npm: true + static: false + cdnjs: true +artalk_katex: + name: "@artalk/plugin-katex" + file: dist/artalk-plugin-katex.js + version: 0.2.4 + npm: true + static: false + cdnjs: false +disqusjs_js: + name: disqusjs + file: dist/disqus.js + version: 1.3 + npm: true + static: false + cdnjs: false # 主题未适配 3.0.1 版本 +disqusjs_css: + name: disqusjs + file: dist/disqusjs.css + version: 1.3 + npm: true + static: false + cdnjs: false # 主题未适配 3.0.1 版本 +gitalk: + name: gitalk + file: dist/gitalk.min.js + version: 1.8.0 + npm: true + static: false + cdnjs: true +twikoo: + name: twikoo + file: dist/twikoo.min.js + version: 1.6.39 + npm: true + static: false + cdnjs: true +waline_css: + name: "@waline/client" + cdnjs_name: waline + file: dist/waline.css + version: 3.3.2 + npm: true + static: false + cdnjs: true +waline_js: + name: "@waline/client" + cdnjs_name: waline + file: dist/waline.js + version: 3.3.2 + npm: true + static: false + cdnjs: true +discuss: + name: discuss + file: dist/discuss.js + cdnjs_file: dist/discuss.js + cdnjs_no_min_file: true + version: 1.2.9 + npm: true + static: false + cdnjs: true +vssue_js: + name: vssue + file: dist/vssue.github.min.js + version: 1.4.8 + npm: true + static: false + cdnjs: false +vssue_css: + name: vssue + file: dist/vssue.min.css + version: 1.4.8 + npm: true + static: false + cdnjs: false +vssue_vue: + name: vue + file: dist/vue.runtime.min.js + version: 3.5.11 + npm: true + static: false + cdnjs: true +swiper_js: + name: swiper + cdnjs_name: Swiper + file: swiper-bundle.min.js + version: 11.1.14 + npm: true + static: true + cdnjs: true +swiper_css: + name: swiper + cdnjs_name: Swiper + file: swiper-bundle.min.css + version: 11.1.14 + npm: true + static: true + cdnjs: true +izitoast_css: + name: izitoast + file: dist/css/iziToast.min.css + version: 1.4.0 + npm: true + static: true + cdnjs: true +izitoast_js: + name: izitoast + file: dist/js/iziToast.min.js + version: 1.4.0 + npm: true + static: true + cdnjs: true +fcircle_css: + name: fcircle + file: fcircle.css + version: unknown + npm: false + static: true + cdnjs: false +fcircle_js: + name: fcircle + file: fcircle.js + version: unknown + npm: false + static: true + cdnjs: false +bbtalk: + name: bbtalk + file: dist/bbtalk.js + version: 0.2.0 + npm: true + static: false + cdnjs: false +artitalk: + name: artitalk + file: artitalk.js + version: 3.3.4 + npm: true + static: false + cdnjs: false +pace_js: + name: pace-js + cdnjs_name: pace + file: pace.min.js + version: 1.2.4 + npm: true + static: false + cdnjs: true +pace_css: + name: pace-js + cdnjs_name: pace + file: themes/${hexo.theme.config?.plugins?.pace?.color}/pace-theme-${hexo.theme.config?.plugins?.pace?.theme}.css + version: 1.2.4 + npm: true + static: false + cdnjs: true +memos_carousel_js: + name: penndu + file: memos_carousel.js + version: 13.0.0 + npm: true + static: false + cdnjs: false diff --git a/themes/volantis/_config.yml b/themes/volantis/_config.yml new file mode 100755 index 0000000..ee1cbc6 --- /dev/null +++ b/themes/volantis/_config.yml @@ -0,0 +1,1371 @@ + +# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +# 这里是 6.0.0-alpha 分支 +# Breaking Change 会放到这个分支 +# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +############################### Volantis ############################### +info: + theme_name: Volantis # This is theme's name. + theme_docs: https://volantis.js.org/ # This is theme's URL. + theme_repo: https://github.com/volantis-x/hexo-theme-volantis +# Debug 调试模式 +debug: env # false: 关闭调试模式, env:环境配置检查, rightMenus: 调试右键, cdn: 调试 CDN System +############################### 默认占位图 ############################### +default: + avatar: volantis-static/media/placeholder/avatar/round/3442075.svg # https://cdn.jsdelivr.net/gh/cdn-x/placeholder@1.0.1/avatar/round/3442075.svg + link: volantis-static/media/placeholder/link/8f277b4ee0ecd.svg # https://cdn.jsdelivr.net/gh/cdn-x/placeholder@1.0.1/link/8f277b4ee0ecd.svg + cover: volantis-static/media/placeholder/cover/76b86c0226ffd.svg # https://cdn.jsdelivr.net/gh/cdn-x/placeholder@1.0.1/cover/76b86c0226ffd.svg + image: volantis-static/media/placeholder/image/2659360.svg # https://cdn.jsdelivr.net/gh/cdn-x/placeholder@1.0.1/image/2659360.svg + + +############################### CDN System ############################### + +cdn_system: + # CDN 优先级 从高到低排序 写入 priority 列表即表示启用(enable) + priority: [custom, local, cdnjs, npm, static] + # ======================================================================== + # cdn数据配置文件见 "theme/_cdn.yml", 可以在 source/_data/cdn.yml 覆盖 theme/_cdn.yml + # 变量说明: + # 以下变量只能在 `prefix` 中使用。 + # ${site_root} 站点根目录 一般是 "/" + # 以下变量只能在 `format` 中使用。 + # ${prefix} CDN 链接前缀 + # ${name} package 名称 见 "theme/_cdn.yml" + # ${version} package 版本 见 "theme/_cdn.yml" + # ${file} 文件路径 见 "theme/_cdn.yml" + # ${min_file} 文件路径 ${file} 后添加 .min. (jsdelivr、cdnjs 官方自带压缩) + # ${timestamp} Hexo运行时的时间戳(eg:1661246702300), 可用于静态资源版本控制 format: ${prefix}${file}?v=${timestamp} + system_config: + # 自定义配置 使用 "theme/_cdn.yml" 中的名称作为配置项的键 + custom: + busuanzi: https://npm.elemecdn.com/penndu@1.0.0/bsz.js # 杜老师友情赞助 + #volantis_style: /css/style.css + #volantis_app: /js/app.js + + # 主题 /js与/css目录 (一般放在本地,可以在此处配置站点CDN),"theme/_cdn.yml" 中以 "volantis_" 开头的名称 + # Tip: 在本配置文件中 匹配以 "volantis-local" 开头的链接路径替换为该格式的前缀开头 prefix + local: + # CDN 链接前缀 + prefix: ${site_root} + # local CDN 格式 + format: ${prefix}${file} + # npm + # https://www.npmjs.com/ + # Tip: 在本配置文件中 匹配以 "volantis-npm" 开头的链接路径替换为该格式的前缀开头 prefix + npm: + # CDN 链接前缀 + prefix: https://unpkg.com + # npm CDN 格式 + format: ${prefix}/${name}@${version}/${file} + # volantis static 静态资源文件 npm 包 CDN 地址 + # https://github.com/volantis-x/volantis-static + # Tip: 在本配置文件中 匹配以 "volantis-static" 开头的链接路径替换为该格式的前缀开头 prefix + static: + # CDN 链接前缀 + prefix: https://unpkg.com/volantis-static@0.0.1660614606622 + # volantis-static CDN 格式 + format: ${prefix}/libs/${name}/${file} + # cdnjs + # https://cdnjs.com/ + # Tip: 在本配置文件中 匹配以 "volantis-cdnjs" 开头的链接路径替换为该格式的前缀开头 prefix + cdnjs: + # CDN 链接前缀 + prefix: https://cdn.bootcdn.net/ajax/libs + # cdnjs CDN 格式 + format: ${prefix}/${name}/${version}/${min_file} + # ======================================================================== + + + + + + +############################### CSP ############################### +# 内容安全策略( CSP ) meta 标签 http-equiv="Content-Security-Policy" +# https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP +# https://content-security-policy.com/ +# 也可以设为 false 在 HTTP 标头中设置 https://volantis.js.org/v5/advanced-settings/#设置-HTTP-响应标头 +csp: + enable: true + content: " + default-src 'self' https:; + block-all-mixed-content; + base-uri 'self' https:; + form-action 'self' https:; + worker-src 'self' https:; + connect-src 'self' https: *; + img-src 'self' data: https: *; + media-src 'self' https: *; + font-src 'self' data: https: *; + frame-src 'self' https: *; + manifest-src 'self' https: *; + child-src https:; + script-src 'self' https: 'unsafe-inline' *; + style-src 'self' https: 'unsafe-inline' *; + " + # 可以使用自动程序替换默认的 'unsafe-inline' 和 * 生成更严格的内容安全策略. + # 另可以参考官网之前的 gulp 方案.(CSP Level 3 :Safari 15.4+ Chrome 59+ Firefox 58+ Edge 79+) + # gulpfile.js https://gist.github.com/MHuiG/e50ce64fd94f641f679a0736fef925e4 + +######################################################################## +# https://web.dev/content-visibility/ +# https://www.caniuse.com/?search=content-visibility +content_visibility: false + +# 全局页面字符串替换 A => B (可用于临时修改错字等) +replace: + - https://cdn.jsdelivr.net/npm/ => https://unpkg.com/ + - https://cdn.jsdelivr.net/gh/ => https://gcore.jsdelivr.net/gh/ + + +# dns-prefetch preconnect x-dns-prefetch-control +dns_prefetch: + - https://unpkg.com + - https://cdn.bootcdn.net + +# 平滑滚动效果 +scroll_smooth: true +############################### Navigation Bar ############################### > start +# 注意事项:建议规范全站路径 URL 最后带一个 "/" 例如 "about/" +navbar: + visiable: auto # always, auto + logo: # choose [img] or [icon + title] + img: volantis-static/media/org.volantis/blog/Logo-NavBar@3x.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/Logo-NavBar@3x.png + icon: + title: + menu: + - name: 博客 + icon: fa-solid fa-rss + url: / + - name: 分类 + icon: fa-solid fa-folder-open + url: categories/ + - name: 标签 + icon: fa-solid fa-tags + url: tags/ + - name: 归档 + icon: fa-solid fa-archive + url: archives/ + - name: 友链 + icon: fa-solid fa-link + url: friends/ + - name: 关于 + icon: fa-solid fa-info-circle + url: about/ + search: Search... # Search bar placeholder +############################### Navigation Bar ############################### > end + + +############################### Cover ############################### > start +cover: + height_scheme: full # full, half + layout_scheme: dock # blank (留白), search (搜索), dock (坞), featured (精选), focus (焦点) + display: + home: true + archive: true + others: false # can be written in front-matter 'cover: true' + background: https://gcore.jsdelivr.net/gh/MHG-LAB/cron@gh-pages/bing/bing.jpg + # background: https://bing.ioliu.cn/v1/rand?w=1920&h=1200 + logo: # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/Logo-Cover@3x.png + title: 'Volantis' + subtitle: '' + search: A Wonderful Theme for Hexo # search bar placeholder + features: + - name: 文档 + icon: # + img: volantis-static/media/twemoji/assets/svg/1f5c3.svg # https://cdn.jsdelivr.net/gh/twitter/twemoji@13.0/assets/svg/1f5c3.svg + url: /v4/getting-started/ + - name: 帮助 + icon: # + img: volantis-static/media/twemoji/assets/svg/1f516.svg # https://cdn.jsdelivr.net/gh/twitter/twemoji@13.0/assets/svg/1f516.svg + url: faqs/ + - name: 示例 + icon: # + img: volantis-static/media/twemoji/assets/svg/1f396.svg # https://cdn.jsdelivr.net/gh/twitter/twemoji@13.0/assets/svg/1f396.svg + url: /examples/ + - name: 社区 + icon: # + img: volantis-static/media/twemoji/assets/svg/1f389.svg # https://cdn.jsdelivr.net/gh/twitter/twemoji@13.0/assets/svg/1f389.svg + url: /contributors/ + - name: 博客 + icon: # + img: volantis-static/media/twemoji/assets/svg/1f4f0.svg # https://cdn.jsdelivr.net/gh/twitter/twemoji@13.0/assets/svg/1f4f0.svg + url: /archives/ + - name: 源码 + icon: # + img: volantis-static/media/twemoji/assets/svg/1f9ec.svg # https://cdn.jsdelivr.net/gh/twitter/twemoji@13.0/assets/svg/1f9ec.svg + url: https://github.com/volantis-x/hexo-theme-volantis/ +############################### Cover ############################### > end + +pages: + # 友链页面配置 + friends: + layout_scheme: traditional # simple: 简单布局, traditional: 传统布局 + +############################### Article Layout ############################### > start +# 文章布局 +article: + # 文章列表页面的文章卡片布局方案 + preview: + scheme: landscape # landscape + # pin icon for post + pin_icon: volantis-static/media/twemoji/assets/svg/1f4cc.svg # https://cdn.jsdelivr.net/gh/twitter/twemoji@13.0/assets/svg/1f4cc.svg + # auto generate title if not exist + auto_title: true # false, true + # auto generate excerpt if not exist + auto_excerpt: true # false, true + # hide excerpt + hide_excerpt: false + # show split line or not + line_style: solid # hidden, solid, dashed, dotted + # show author + author: false # true, false + # show readmore button + readmore: auto # auto, always + # 文章详情页面的文章卡片本体布局方案 + body: + # 文章顶部信息 + # 从 meta_library 中取 + top_meta: [author, category, date, counter] #启用评论数量需在此添加 + # 文章底部信息 + # 从 meta_library 中取 + bottom_meta: [updated, tags, share] + # ---------------- + # 文章页脚组件 + footer_widget: + # ---------------- + # 参考资料、相关资料等 (for layout: post/docs) + references: + title: 参考资料 + icon: fa-solid fa-quote-left + # 在 front-matter 中: + # references: + # - title: 某篇文章 + # url: https:// + # 即可显示此组件。 + # ---------------- + # 文章推荐 (for layout: post/docs) + # 推荐算法需要依赖中文分词工具,nodejieba只支持中英文 npm i nodejieba -S + recommended_article: + enable: false + layout: ["post", "docs"] + title: 推荐阅读 + icon: fa-solid fa-bookmark + max_count: 6 + placeholder_img: https://gcore.jsdelivr.net/gh/MHG-LAB/cron@gh-pages/bing/bing.jpg + # 不展示文章推荐 + # front-matter 使用 skip_recommended_article: true 关闭 + # 不在以下文件夹文章中展示文章推荐 根目录是source/ + skip_dirs: + - wiki/ + # ---------------- + # 相关文章,需要安装插件 (for layout: post) + # npm i hexo-related-popular-posts + related_posts: + enable: false + title: 相关文章 + icon: fa-solid fa-bookmark + max_count: 5 + # 设为空则不使用文章头图 + placeholder_img: https://gcore.jsdelivr.net/gh/MHG-LAB/cron@gh-pages/bing/bing.jpg + # ---------------- + # 版权声明组件 (for layout: post) + copyright: + enable: false + permalink: '本文链接:' + content: + - '版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!' + - permalink + + # 自定义版权组件:精细到文章的版权声明 + custom: false # 开启后替代上方内容的版权显示 + customData: + default: type1 # 默认授权声明 + ############################# + # 你可以在文章的 front-matter 覆盖默认版权声明 + # 配置示例(均可选): + # copyright: + # type: type3 # 当前文章版权声明类型 + # author: 张三 # 本文作者 + # ref: # 原文出处 + # title: # 原文出处 - 标题 + # url: # 原文出处 - 链接 + ############################# + rules: + type1: + text: CC BY-NC-SA 4.0 + desc: 署名-非商业性使用-相同方式共享 4.0 国际。 + type2: + text: 禁止转载引用 + desc: 除非获得原作者的单独授权,任何第三方不得转载! + type3: + text: 原作许可协议 + desc: 本文转载自他站,转载或引用本文时,请遵守原作许可协议! + type4: + text: 来自互联网 + desc: 本文来自互联网,未知来源,侵权请联系删除。 + type5: + text: 允许规范转载 + desc: 转载请保留本文转载地址,著作权归作者所有! + type6: + text: 允许付费转载 + desc: 您可以联系作者通过付费方式获得授权。 + # 还能自行添加更多 + # ---------------- + # 打赏组件 (for layout: post) + donate: + enable: false + images: + - volantis-static/media/org.volantis/blog/qrcode/github@volantis.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/qrcode/github@volantis.png + - volantis-static/media/org.volantis/blog/qrcode/github@volantis.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/qrcode/github@volantis.png + # meta library + meta_library: + # 默认文章作者(可在 _data/author.yaml 中增加其他作者,并在 front-matter 中设置) + # https://volantis.js.org/advanced-settings/#多人协同 + author: + avatar: volantis-static/media/org.volantis/blog/favicon/apple-touch-icon.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/favicon/apple-touch-icon.png + name: + url: / + # 文章创建日期 + date: + icon: fa-solid fa-calendar-alt + title: '发布于:' + format: 'll' # 日期格式 http://momentjs.com/docs/ + # 文章更新日期 + updated: + icon: fa-solid fa-edit + title: '更新于:' + format: 'll' # 日期格式 http://momentjs.com/docs/ + # 文章分类 + category: + icon: fa-solid fa-folder-open + # 文章浏览计数 + # counter: + # icon: fa-solid fa-eye + # unit: '次浏览' + # waline 文章评论数量 + walinecount: + icon: fa-solid fa-comment-dots + desc: '条评论' # 条评论 + # artalk 文章评论数量 + artalkcount: + icon: fa-solid fa-comment-dots + desc: '条评论' # 条评论 + # 文章字数和阅读时长 + wordcount: + icon_wordcount: fa-solid fa-keyboard + icon_duration: fa-solid fa-hourglass-half + # 文章标签 + tags: + icon: fa-solid fa-hashtag + # 分享 + #share: + # - id: qq + # img: volantis-static/media/org.volantis/logo/128/qq.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/128/qq.png + # - id: qzone + # img: volantis-static/media/org.volantis/logo/128/qzone.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/128/qzone.png + # - id: weibo + # img: volantis-static/media/org.volantis/logo/128/weibo.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/128/weibo.png + # - id: # qrcode # 当id为qrcode时需要安装插件 npm i hexo-helper-qrcode + # img: # volantis-static/media/org.volantis/logo/128/wechat.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/128/wechat.png + # - id: # telegram + # img: # volantis-static/media/org.volantis/logo/128/telegram.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/128/telegram.png +############################### Article Layout ############################### > end + + +############################### Comments ############################### > start +comments: + title: 评论 + subtitle: + service: giscus + # 可选评论系统 # + + # artalk + # https://artalk.js.org/ + # https://github.com/ArtalkJS/Artalk + artalk: + server: https://yours-artalk-domain # 修改为自建的后端服务地址 + path: # 全局评论地址 + placeholder: # 评论占位 + visitor: true # 是否显示文章阅读数 + latex: false # 启用 Latex 支持 + # artalk 有三类图片:1.上传至服务端 2.上传至服务端后利用upgit上传至图床 3.前端上传至图床(本配置为此类) + # 配置此项时将覆盖服务端上传能力 + imageUploader: + # 以兰空图床为例,下列填写内容为: + # url: 'https://xxxxxx/api/v1/upload' + # token: 'Bearer xxxxxxxxxxxxxx' + # resp: 'data.links.url' + api: # 图床地址 + token: # 图床验证 + resp: # 图片地址返回值的字段 + # 更多置项可在 Artalk 后端进行配置,详见 https://artalk.js.org/guide/backend/fe-control.html + # 也可以在此处继续参考上方例子进行配置,不建议重写配置的字段除上方所述外还有: + # [el, useBackendConf, pageKey, pageTitle, site, darkMode, pvEl, imgUploader] + + # giscus + # https://giscus.app + # https://github.com/laymonage/giscus + giscus: + # 以下配置按照 yml 格式增删填写即可 + # repo: xxx/xxx + # repo-id: xxx + # category: xxx + # category-id: xxx + # mapping: "pathname" + # reactions-enabled: "1" + # emit-metadata: "0" + # lang: "zh-CN" + # 以上配置按照 yml 格式增删填写即可 + theme: + light: "light" # https://cdn.jsdelivr.net/gh/volantis-x/cdn-volantis@master/css/giscus/light.css + dark: "dark" # https://cdn.jsdelivr.net/gh/volantis-x/cdn-volantis@master/css/giscus/dark.css + + # beaudar + # https://beaudar.lipk.org/ + beaudar: + repo: xxx/xxx + issue-term: pathname + issue-number: + branch: main + position: top + order: desc + theme: + light: github-light + dark: github-dark + label: ✨💬✨ + + # utterances + # https://utteranc.es/ + utterances: + repo: xxx/xxx + issue-term: pathname + issue-number: + theme: + light: github-light + dark: github-dark + label: ✨💬✨ + + # Disqus + # https://disqus.com + disqus: + shortname: + # optional + autoload: false + path: # 全局评论地址 + + # DisqusJS + # https://github.com/SukkaW/DisqusJS + disqusjs: + path: # 全局评论地址 + # 配置项按照yml格式继续填写即可 除了 [siteName url identifier] 选项 + #shortname: + #api: + #apikey: + #admin: + #nesting: + + # Gitalk + # https://gitalk.github.io/ + gitalk: + # 配置项按照yml格式继续填写即可 除了 [id distractionFreeMode] 选项 + clientID: + clientSecret: + repo: + owner: + admin: # [] + path: # 全局评论地址 + + # https://vssue.js.org/zh/ + vssue: + owner: + repo: + clientId: + clientSecret: + + # https://www.livere.com + livere: + uid: + + # Isso + # https://posativ.org/isso/ + isso: + url: https://example.com/(path/) + src: https://example.com/(path/)js/embed.min.js + css: + gravatar: + + # https://www.barkdull.org/software/hashover + hashover: + src: https://example.com/(path/)comments.php + + # Twikoo + # https://twikoo.js.org/ + twikoo: + path: # 全局评论地址 + # 其他配置项按照yml格式继续填写即可 除了 [el path] 选项 + envId: xxxxxxxxxxxxxxx # 腾讯云环境填 envId;Vercel 环境填地址(https://xxx.vercel.app) + placeholder: #全局评论占位,也可以在管理面板中的配置管理处设置(此处优先级更高) + visitor: true # 是否显示文章阅读数 + + # Waline + # https://waline.js.org/ + waline: + path: # 全局评论地址 目前设置全局评论地址后visitor失效,这是waline的问题 + placeholder: # 评论占位提示 + serverURL: # Waline 的服务端地址(必填) 测试用地址: https://waline.vercel.app + imageUploader: + # 适配了兰空图床V1、V2版本 + # 以兰空图床V1为例,下列填写内容为: + # fileName: file + # tokenName: Authorization + # api: https://xxxxxx/api/v1/upload + # token: Bearer xxxxxxxxxxxxxx + # resp: data.links.url + # 以兰空图床V2为例,下列填写内容为: + # fileName: image + # tokenName: token + # api: https://xxxxxx/api/upload + # token: xxxxxxxxxxxxxx + # resp: data.url + fileName: # 根据版本二选一 + tokenName: # 根据版本二选一 + api: # 图床 api 地址 + token: # 图床验证 + resp: # 图片地址返回值的字段 + pageview: true # 是否显示文章阅读数 + comment: true # 是否显示文章评论数 + # 其他配置项按照yml格式继续填写即可 除了 [el path imageUploader] 选项 + # 组件属性地址:https://waline.js.org/reference/component.html + # meta: ['nick', 'mail', 'link'] + + # Discuss + # https://discuss.js.org + discuss: + serverURLs: # Discuss server address url + visitStat: true # 是否显示文章阅读数 + # https://discuss.js.org/Quick-Start.html#path + + +############################### Comments ############################### > end + +############################### Sidebar ############################### > start +sidebar: + position: right # left right + # 主页、分类、归2档等独立页面 + for_page: [blogger, category, tagcloud, donate] + # layout: docs/post 这类文章页面 + for_post: [toc] + # 侧边栏组件库 + widget_library: + # --------------------------------------- + # blogger info widget + blogger: + class: blogger + display: [desktop, mobile] # [desktop, mobile] + avatar: volantis-static/media/org.volantis/blog/Logo-NavBar@3x.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/Logo-NavBar@3x.png + shape: rectangle # circle, rectangle + url: /about/ + title: + subtitle: + jinrishici: true # Poetry Today. You can set a string, and it will be displayed when loading fails. + social: + - icon: fa-solid fa-rss + url: /atom.xml + - icon: fa-solid fa-envelope + url: mailto:me@xxx.com + - icon: fab fa-github + url: https://github.com/volantis-x/ + - icon: fa-solid fa-headphones-alt + url: / + # --------------------------------------- + # toc widget (valid only in articles) + toc: + class: toc + display: [desktop, mobile] # [desktop, mobile] + sticky: true + header: + icon: fa-solid fa-list + title: 本文目录 + list_number: false + min_depth: 2 + max_depth: 5 + # --------------------------------------- + # music + music: + class: music + display: [desktop, mobile] # [desktop, mobile] + # --------------------------------------- + # category widget + category: + class: category + display: [desktop] # [desktop, mobile] + header: + icon: fa-solid fa-folder-open + title: 文章分类 + url: /blog/categories/ + # --------------------------------------- + # tagcloud widget + tagcloud: + class: tagcloud + display: [desktop, mobile] # [desktop, mobile] + header: + icon: fa-solid fa-tags + title: 热门标签 + url: /blog/tags/ + min_font: 14 + max_font: 24 + color: true + start_color: '#999' + end_color: '#555' + # --------------------------------------- + # qrcode widget + qrcode: + class: qrcode + display: [desktop, mobile] # [desktop, mobile] + height: 64px # Automatic height if not set + images: + - volantis-static/media/org.volantis/blog/qrcode/github@volantis.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/qrcode/github@volantis.png + - volantis-static/media/org.volantis/blog/qrcode/github@volantis.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/qrcode/github@volantis.png + # --------------------------------------- + # webinfo widget + webinfo: + class: webinfo + display: [desktop] + header: + icon: fa-solid fa-award + title: 站点信息 + type: + article: + enable: true + text: '文章数目:' + unit: '篇' + runtime: + enable: false + data: '2020/01/01' # 填写建站日期 + text: '已运行时间:' + unit: '天' + wordcount: + enable: false + text: '本站总字数:' # 需要启用 wordcount + unit: '字' + visitcounter: + enable: true + siteuv: + text: '本站访客数:' + unit: '人' + sitepv: + text: '本站总访问量:' + unit: '次' + lastupd: + enable: true + friendlyShow: true # 更友好的时间显示 + text: '最后活动时间:' + unit: '日' + # --------------------------------------- + # lastupdate widget + lastupdate: + class: lastupdate + display: [desktop, mobile] + header: + icon: fa-solid fa-clock WISTERIA + title: 最近更新 + # --------------------------------------- + # Artalk widget + artalk: + class: artalk + stickys: true + display: [desktop, mobile] + # --------------------------------------- + # Memos widget + memos_carousel: + class: memos_carousel + display: [desktop, mobile] + header: + icon: fa-solid fa-volume-high + title: 说说 + url: /blog/memos/ # 说说页面的地址 + url: 'https://s.dusays.com/' # 替换城自己的域名,也可以用杜老师的平台托管 + limit: '10' # 展示数量限制 + creatorId: '1' # 替换成自己的用户的ID + tag: '' # 要展示的内容的标签 + image: 'fa-solid fa-image' # 图片替换成图标 + link: 'fa-solid fa-link' # 链接替换成图标 + placeholder: '说说加载中...' # 占位符 + +############################### Sidebar ############################### > end + + +############################### Tag Plugins ############################### > start +# 内置标签插件的配置 +tag_plugins: + # {% note text %} + note: # style for default note: + icon: '\f054' + color: '' + iconfont: 'Font Awesome 6 Free' + # {% checkbox %} + checkbox: + interactive: false # enable interactive for user + color: '' # color for default checkbox + # {% link title, url, img %} + link: + placeholder: volantis-static/media/org.volantis/logo/256/safari.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/256/safari.png +############################### Tag Plugins ############################### > end + + +############################### Site Footer ############################### > start +site_footer: + # layout of footer: [aplayer, social, license, info, copyright] + layout: [aplayer, social, license, info, copyright] + social: + - icon: #fa-solid fa-rss + url: + # or + - img: + url: + # or + - avatar: + url: + # site source + source: https://github.com/volantis-x/volantis-docs/ + # analytics using busuanzi + analytics: > + 本站总访问量为 + 访客数为 + # site copyright + copyright: '[Copyright © since 2017 XXX](/)' + # You can add your own property here. (Support markdown, for example: br: '
              ') + br: '
              ' +############################### Site Footer ############################### > end + +############################### Plugins ############################### > start +plugins: + ################ required plugins ################ + # jquery + globalJquery: false # 全局引入 jquery + # fontawesome + fontawesome: true + ################ optional plugins ################ + # issues api + sitesjs: + enable: true + friendsjs: + enable: true + contributorsjs: + enable: true + + ######## Plugins to improve loading speed: + # 预加载 + preload: + enable: true + service: flying_pages # instant_page, flying_pages + + # 图片懒加载 + # https://www.npmjs.com/package/vanilla-lazyload + # tips: + # 这里是主题自带的图片懒加载, 实现方案位于 /scripts/filters/z-lazyload ; srcset 属性的的优先级比 src 属性要高, 注意 srcset 存放了懒加载占位图, src 存放了原图 + # 在支持 srcset 的浏览器或者 RSS 阅读器(还会有人使用老旧的阅读器?)上会优先读取 srcset 加载的图片(懒加载占位图), 对于 RSS 中图片丢失变成懒加载占位图的问题, 建议 自行使用脚本移除 srcset 属性 或 关闭图片懒加载 或 在 RSS 中插入 vanilla-lazyload + lazyload: + enable: true + onlypost: false + loadingImg: # https://cdn.jsdelivr.net/gh/volantis-x/cdn-volantis@3/img/placeholder/c617bfd2497fcea598e621413e315c368f8d8e.svg # 不建议使用占位图, 建议loadingImg为空, 当前占位图会产生布局偏移, loadingImg 为空占位图是一个 1X1 像素的图片 + blurIn: true # 模糊加载效果 (loadingImg为空时有效) + + ######## Plugins to optimize the experience: + # 代码高亮 + code_highlight: highlightjs # highlightjs or prismjs + # highlight.js + highlightjs: + copy_code: true + # 如果开启以下配置, hexo.config.highlight.enable 需要设置为 false ; hexo.config.highlight.enable 设置为 true, 则以下配置无效 + # # 不再支持 v11.1.0 以下版本 + # js: https://unpkg.com/@highlightjs/cdn-assets@11.5.1/highlight.min.js # Please set hexo.config.highlight.enable = false !!! + # css: https://unpkg.com/@highlightjs/cdn-assets@11.5.1/styles/default.min.css + # # # more: https://www.jsdelivr.com/package/npm/@highlightjs/cdn-assets?path=styles + + # prismjs + # https://prismjs.com/ + # https://hexo.io/zh-cn/docs/syntax-highlight#PrismJS + prismjs: + copy_code: true + # Please set hexo.config.highlight.enable = false !!! set hexo.config.prismjs.enable = true !!! + js: + - https://unpkg.com/prismjs/components/prism-core.min.js + - https://unpkg.com/prismjs/plugins/autoloader/prism-autoloader.min.js + - https://unpkg.com/prismjs/plugins/line-numbers/prism-line-numbers.min.js + css: + - https://unpkg.com/prismjs/themes/prism-dark.css + - https://unpkg.com/prismjs/plugins/line-numbers/prism-line-numbers.css + + # https://scrollrevealjs.org/api/reveal.html + scrollreveal: + enable: #true + distance: 32px + duration: 800 # ms + interval: 20 # ms + scale: 1 # 0.1~1 + + ######## Plugins for Count: + # npm i hexo-wordcount + wordcount: + enable: #true + + busuanzi: + enable: #true + + ######## Plugins for ... + # Button Ripple Effect + nodewaves: + enable: #true + + # fontawesome V6: https://fontawesome.com/docs/web/style/animate + # fontawesome animation for fontawesome V5 + fontawesome_animation: + enable: #true + + # Typing Effects + comment_typing: + enable: #true + + # 视差滚动效果 Slide Background + parallax: + enable: #true + position: cover # cover: sticky on the cover. fixed: Fixed as background for the site. + shuffle: true # shuffle playlist + duration: 10000 # Duration (ms) + fade: 1500 # fade duration (ms) (Not more than 1500) + images: # For personal use only. At your own risk if used for commercial purposes !!! + - volantis-static/media/wallpaper/minimalist/2020/001.webp + - volantis-static/media/wallpaper/minimalist/2020/002.webp + - volantis-static/media/wallpaper/minimalist/2020/003.webp + - volantis-static/media/wallpaper/minimalist/2020/004.webp + - volantis-static/media/wallpaper/minimalist/2020/005.webp + - volantis-static/media/wallpaper/minimalist/2020/006.webp + - volantis-static/media/wallpaper/minimalist/2020/012.webp + - volantis-static/media/wallpaper/minimalist/2020/016.webp + - volantis-static/media/wallpaper/minimalist/2020/019.webp + - volantis-static/media/wallpaper/minimalist/2020/025.webp + - volantis-static/media/wallpaper/minimalist/2020/033.webp + - volantis-static/media/wallpaper/minimalist/2020/034.webp + - volantis-static/media/wallpaper/minimalist/2020/035.webp + - volantis-static/media/wallpaper/minimalist/2020/038.webp + - volantis-static/media/wallpaper/minimalist/2020/039.webp + - volantis-static/media/wallpaper/minimalist/2020/042.webp + - volantis-static/media/wallpaper/minimalist/2020/046.webp + - volantis-static/media/wallpaper/minimalist/2020/051.webp + - volantis-static/media/wallpaper/minimalist/2020/052.webp + - volantis-static/media/wallpaper/minimalist/2020/054.webp + - volantis-static/media/wallpaper/minimalist/2020/056.webp + + # APlayer is only available in mainland China. + # https://aplayer.js.org/#/zh-Hans/ + # APlayer config: https://github.com/metowolf/MetingJS + aplayer: + enable: #true + source: meting # meting:从 MetingJS API 获取音乐数据(API经常不稳定) / local:本地音乐数据 + # ============= meting begin ============= + # Required + server: netease # netease, tencent, kugou, xiami, baidu + type: playlist # song, playlist, album, search, artist + id: 3175833810 # song id / playlist id / album id / search keyword + # ============= meting end ============= + # ============= local begin ============== + # local 暂时没有适配右键 和 post.music 迷你模式 + audio: + - name: 'Fly' + artist: 'Marshmello' + url: '/music/fly.mp3' + lrc: '/music/fly.lrc' + cover: '/music/fly.jpg' + - name: 'Avem' + artist: 'Alan Walker' + url: '/music/Avem.mp3' + lrc: '/music/Avem.lrc' + cover: '/music/Avem.jpg' + # ============= local end ================ + # Optional + fixed: false # enable fixed mode + theme: '#1BCDFC' # main color + autoplay: false # audio autoplay + order: list # player play order, values: 'list', 'random' + loop: all # player loop play, values: 'all', 'one', 'none' + volume: 0.7 # default volume, notice that player will remember user setting, default volume will not work after user set volume themselves + list_max_height: 320px # list max height + list_folded: true + autoHide: true # hide automaticaly + + # pace + # An automatic web page progress bar. + # https://github.com/CodeByZach/pace + pace: + enable: true + color: blue # black, blue, green, orange, pink, purple, red, silver, white, yellow + theme: minimal # big-counter, bounce, barber-shop, center-atom, center-circle, center-radar, center-simple, corner-indicator, fill-left, flat-top, flash, loading-bar, mac-osx, material, minimal + + # 暗黑模式 darkmode + # 开关按钮:在 navbar.menu 中添加: + # - name: 暗黑模式 # 可自定义 + # icon: fa-solid fa-moon # 可自定义 + # toggle: darkmode + darkmode: + enable: #true + + # 旧版 Internet Explorer 淘汰行动 + # https://www.microsoft.com/zh-cn/WindowsForBusiness/End-of-IE-support + # 本主题不支持Internet Explorer的任何版本!!! + killOldVersionsOfIE: + enable: true + + # 禁用JavaScript提示 + # 本页面需要浏览器支持(启用)JavaScript + # 主题中的某些插件必须启用JavaScript才能正常工作,例如开启scrollreveal如果禁用JavaScript会导致卡片消失 + killNoScript: + enable: true + + # Artitalk https://artitalk.js.org + # 配置过程请参考:https://artitalk.js.org/doc.html + # 使用过旧版本的请修改Leancloud shuoshuo class部分列名:https://artitalk.js.org/release.html + # 除appID和appKEY外均为选填项 + artitalk: + # Set `plugins: ["artitalk"]` to enable in front-matter + # 配置项按照yml格式继续填写即可 + appId: ogP8qj3veMh0LFpFWMPOyF0X-MdYXbMMI # your appID + appKey: nHXLd3N3Jgh460t2iRQKWAtr # your appKEY + # serverURL: #leancloud绑定的api访问域名,使用国际版的话不需要填写 + # lang: # 语言设置,zh为汉语,en为英语,es为西班牙语。默认为汉语 + # pageSize: #每页说说的显示数量 + # shuoPla: #在编辑说说的输入框中的占位符 + # avatarPla: #自定义头像url的输入框的占位符 + # motion: #加载动画的开关,1为开,0为关,默认为开 + # bgImg: #说说输入框背景图片url + # color1: #说说背景颜色1&按钮颜色1 + # color2: #说说背景颜色2&按钮颜色2 + # color3: #说说字体颜色 + # cssUrl: #自定义css接口 + + # Memos https://usememos.com + memos: + # Set `plugins: ["memos"]` to enable in front-matter + url: 'https://s.dusays.com/' # 替换成自己的域名,也可以用杜老师的平台托管 + limit: '10' # 展示数量限制 + id: '1' # 替换成自己的用户的ID + + # BBtalk https://bb.js.org + bbtalk: + # Set `plugins: ["bbtalk"]` to enable in front-matter + appId: 0KzOX4vC7Jsk6vzUGNeEiUaI-gzGzoHsz # your appID + appKey: HwCiWuxfpvKiLm4teCUgTIba # your appKEY + serverURLs: https://bbapi.heson10.com # Request Api 域名 + + # 友链朋友圈 hexo-circle-of-friends + # https://github.com/Rock-Candy-Tea/hexo-circle-of-friends + # https://fcircle-doc.js.cool/ + fcircle: + # Set `plugins: ["fcircle"]` to enable in front-matter + private_api_url: https://fcircle-api.example.com/ # api 地址 + page_init_number: 20 # 初始加载几篇文章 + page_turning_number: 10 # 点击加载更多时,一次最多加载几篇文章,默认10 + error_img: https://cravatar.cn/avatar/57d8260dfb55501c37dde588e7c3852c # 头像加载失败时,默认头像地址 + sort_rule: created # 进入页面时第一次的排序规则,可选值:created/updated + expire_days: 1 # 本地文章缓存数据过期时间(天) + js: https://npm.elemecdn.com/fcircle-theme-yyyz@1.0.13/dist/fcircle.min.js # fcircle.min.js的url + + # 消息提示 + # izitoast + message: + enable: true + icon: # 默认图标,支持对图标添加颜色,可选值:see:/source/css/_style/_plugins/fontcolor.styl + default: fa-solid fa-info-circle light-blue + quection: fa-solid fa-question-circle light-blue + time: # 默认持续时间 + default: 5000 + quection: 20000 + position: 'topRight' # 弹出位置 可选值:topRight, bottomRight, bottomLeft, topLeft, topCenter, bottomCenter, center + transitionIn: 'bounceInLeft' # 弹窗打开动画 可选值:bounceInLeft, bounceInRight, bounceInUp, bounceInDown, fadeIn, fadeInDown, fadeInUp, fadeInLeft, fadeInRight, flipInX + transitionOut: 'fadeOutRight' # 弹窗关闭动画 可选值:fadeOut, fadeOutUp, fadeOutDown, fadeOutLeft, fadeOutRight, flipOutX + titleColor: 'var(--color-text)' # 标题颜色 + messageColor: 'var(--color-text)' # 消息颜色 + backgroundColor: 'var(--color-card)' # 默认背景色 + zindex: 2147483647 # 层级 + copyright: # 是否在复制时弹出版权提示,影响范围:ctrl+c、代码块复制按钮、右键复制选项 + enable: true + title: '知识共享许可协议' + message: '请遵守 CC BY-NC-SA 4.0 协议。' + icon: 'far fa-copyright light-blue' + aplayer: # 是否开启音乐通知;播放、暂停、失败 时的图标 + enable: true + play: fa-solid fa-play + pause: fa-solid fa-pause + rightmenu: + enable: true # 是否开启右键模块的消息通知 + notice: true # 唤醒原右键菜单的通知 + + # 聊天功能 + chat_service: # tidio or gitter + + # Tidio + # https://www.tidio.com/ + tidio: + id: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + + # Gitter + # https://gitter.im + gitter: + room: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + + # swiper + # https://www.swiper.com.cn/ + swiper: + enable: true + + # AI摘要 + # https://github.com/zhheo/Post-Abstract-AI + tianliGPT: + enable: false + key: 5Q5mpqRK5DkwT1X9Gi5e + wordLimit: 1000 # 摘要字数限制 (⚠️危险:更改此变量损失已消耗过的key,因为你提交的内容发生了变化。) + typewriter: true # 打字机效果 + +############################### Plugins ############################### > end + +############################### Rightmenu ############################### > start + +### 自定义右键 +rightmenus: + enable: false + # 右键菜单项及加载顺序 + # 内容示例:plugins.[组名], menus.[组名], hr(分割线,推荐去线留白), music(音乐控制器) + order: + - plugins.navigation + - hr + - plugins.inputBox + - plugins.seletctText + - plugins.elementCheck + - plugins.elementImage + - menus.link + - hr + - menus.darkMode + - plugins.articlePage + - music + ############################ + # - {id: '', name: '', icon: '', link: '', event: '', group: ''} + # id: 唯一值 + # name: 用于菜单名称显示 + # icon: 用于菜单图标显示 + # link: 跳转链接 + # event: 事件,当输入内容不为内置事件时,作 JavaScript 代码执行 + # group: 菜单项所处分组名称 + # 注: + # 1. link/event 二选一,同时出现时仅处理 link + # 2. 内置事件列表: copyText, copyLink, copyPaste, copyAll, copyCut, copyImg, printMode, readMode + # 3. 内置组列表:navigation, inputBox, seletctText, elementCheck, elementImage, articlePage + # 4. plugins 列允许自定义组内项目 + # 5. menus 列允许自定义组及其内容 + # 6. 除 navigation 外的内置组,在显示时会隐藏含 link 属性的菜单项 + ########################### + # 基础项设置 + options: + # 图标前缀 fa-solid, fa-regular, fa-light, fa-thin, fa-duotone, fa-brands + iconPrefix: fa-solid + # 例外,在 articlePage 组显示时(文章页)时依旧显示含 link 属性的菜单项 + articleShowLink: true + # 当设定全局音乐播放器时,是否一直显示音乐控制菜单。false:仅当音乐播放时启用 + musicAlwaysShow: true + # 右键内置组,预置实现 + plugins: + # 导航组件 + # 横向排列,共用一行,仅显示图标 (原则上支持的数量不限) + navigation: + - {id: 'left', name: '转到上一页', icon: 'fa-solid fa-arrow-left', event: 'history.back()', group: 'navigation'} + - {id: 'right', name: '转到下一页', icon: 'fa-solid fa-arrow-right', event: 'history.forward()', group: 'navigation'} + - {id: 'redo', name: '刷新当前页面', icon: 'fa-solid fa-redo', event: 'window.location.reload()', group: 'navigation'} + - {id: 'up', name: '回到顶部', icon: 'fa-solid fa-arrow-up', event: 'VolantisApp.scrolltoElement(volantis.dom.bodyAnchor)', group: 'navigation'} + #- {id: 'home', name: '回到首页', icon: 'fa-solid fa-home', link: '/', group: 'navigation'} + # 文本输入框相关组件 + # 生效于 input/textarea,粘贴、剪切、全选 + inputBox: + - {id: 'copyPaste', name: '粘贴文本', icon: 'fa-solid fa-paste', event: 'copyPaste', group: 'inputBox'} + - {id: 'copyAll', name: '全选文本', icon: 'fa-solid fa-object-ungroup', event: 'copyAll', group: 'inputBox'} + - {id: 'copyCut', name: '剪切文本', icon: 'fa-solid fa-cut', event: 'copyCut', group: 'inputBox'} + # 文本选中类组件 + # 生效于右键选中文本,__text__ 为选中的文本。 + seletctText: + - {id: 'copyText', name: '复制文本', icon: 'fa-solid fa-copy', event: 'copyText', group: 'seletctText'} + - {id: 'searchWord', name: '站内搜索', icon: 'fa-solid fa-search', event: 'OpenSearch(__text__)', group: 'seletctText'} + - {id: 'bingSearch', name: '必应搜索', icon: 'fa-solid fa-search', event: 'window.open(`https://cn.bing.com/search?q=${__text__}`)', group: 'seletctText'} + #- {id: 'googleSearch', name: '谷歌搜索', icon: 'fa-solid fa-search', event: 'window.open(`https://www.google.com/search?q=${__text__}`)', group: 'seletctText'} + # 链接判断组件 + # 生效于链接处的右键行为,__link__ 为链接地址 + elementCheck: + - {id: 'openTab', name: '新标签页打开', icon: 'fa-solid fa-external-link-square-alt', event: 'window.open(__link__)', group: 'elementCheck'} + - {id: 'copyLink', name: '复制链接地址', icon: 'fa-solid fa-link', event: 'copyLink', group: 'elementCheck'} + # 图片判断类组件 + # 生效于图片类的右键行为,__link__ 为链接地址 + elementImage: + - {id: 'copyImg', name: '复制图片', icon: 'fa-solid fa-image', event: 'copyImg', group: 'elementImage'} + - {id: 'googleImg', name: '谷歌识图', icon: 'fa-solid fa-images', event: 'window.open(`https://www.google.com.hk/searchbyimage?image_url=${__link__}`)', group: 'elementImage'} + # 文章页面组件 + # 生效于 post.article 页面 + articlePage: + - {id: 'printMode', name: '打印页面', icon: 'fa-solid fa-print', event: 'printMode', group: 'articlePage'} + - {id: 'readMode', name: '阅读模式', icon: 'fa-solid fa-book-open', event: 'readMode', group: 'articlePage'} + # 右键自定义菜单区域 + menus: + link: + - {id: 'help', name: '常见问题', icon: 'fa-solid fa-question', link: 'https://volantis.js.org/faqs/', group: 'link'} + - {id: 'examples', name: '示例博客', icon: 'fa-solid fa-rss', link: 'https://volantis.js.org/examples/', group: 'link'} + - {id: 'contributors', name: '加入社区', icon: 'fa-solid fa-fan', link: 'https://volantis.js.org/contributors/', group: 'link'} + - hr + - {id: 'source_docs', name: '本站源码', icon: 'fa-solid fa-code-branch', link: 'https://github.com/volantis-x/volantis-docs/', group: 'link'} + - {id: 'source_theme', name: '主题源码', icon: 'fa-solid fa-code-branch', link: 'https://github.com/volantis-x/hexo-theme-volantis/', group: 'link'} + darkMode: + - {id: 'darkMode', name: '暗黑模式', icon: 'fa-solid fa-moon', event: 'volantis.dark.toggle()', group: 'darkMode'} +### + + +############################### Search ############################### > start +# To use hexo search, you need to install the following plugins: +# npm i hexo-generator-json-content +search: + enable: true + service: hexo # hexo, algolia, meilisearch + algolia: + searchAsYouType: true # If false, triggers the search only on submit. + hitsPerPage: 5 # Set the number of hits per page. + placeholder: 'Search...' # The placeholder text of the input. + meilisearch: + placeholder: 'Search...' + searchKey: '' + indexName: '' + hostUrl: '' + +############################### Search ############################### > end + +############################### Color Scheme ############################### > start +# Accessibility: 背景色和前景色要有足够的对比度 https://web.dev/color-contrast/ +# https://ant.design/docs/spec/colors-cn +color_scheme: + # ------------ + # 通用颜色 + common: + # 主题色 + theme: '#3dd9b6' + # 链接色 + link: '#2092ec' + # 按钮色 + button: '#44D7B6' + # 鼠标放到交互元素上时的色 + hover: '#ff5722' + # 主题色块内部的文字颜色 + inner: '#fff' + # 选中区域文字的背景颜色 + selection: 'alpha(#2196f3, 0.2)' + # ------------ + # 亮色主题(默认) + light: + # 网站背景色 + site_bg: '#f4f4f4' + # 网站背景上的文字 + site_inner: '#fff' + # 网站页脚文字 + site_footer: '#666' + + # 卡片背景色 + card: '#fff' + # 卡片上的普通文字 + text: '#444' + + # 区块和代码块背景色 + block: '#f6f6f6' + # 代码块高亮时的背景色 + codeblock: '#FFF7EA' + # 行内代码颜色 + inlinecode: '#c74f00' + + # 文章部分 + h1: '#3a3a3a' + h2: '#3a3a3a' + h3: '#333' + h4: '#444' + h5: '#555' + h6: '#666' + p: '#444' + + # 列表文字 + list: '#666' + # 列表 hover 时的文字 + list_hl: 'mix($color-theme, #000, 80)' + # 辅助性文字 + meta: '#888' + + # 版权卡片背景色 + copyright_bkg: '#f5f5f5' + # ------------ + # 暗色主题 + # https://www.maijisheji.com/2094.html + dark: + # 网站最深底色 # Dark Grey 1 + site_bd: '#121212' + # 网站背景色 # Dark Grey 2 + site_bg: '#1f1f1f' + # 卡片背景色 # Dark Grey 3 + card: '#262626' + # 网站背景上的文字 + site_inner: '#eeeeeede' + # 网站页脚文字 + site_footer: '#aaaaaade' + # 卡片上的普通文字 + text: '#eeeeeede' + + # 区块和代码块背景色 # Dark Grey 4 + block: '#434343' + # 代码块高亮时的背景色 # Dark Grey 2 + codeblock: '#1f1f1f' + # 行内代码颜色 + inlinecode: '#D56D28' + + # 文章部分 高强度文本的不透明度应为87% 中等重点文字适用于60% + h1: '#FFFFFFde' # Dark Grey 8 + h2: '#FFFFFFde' + h3: '#FFFFFF99' # Dark Grey 7 + h4: '#FFFFFF99' + h5: '#FFFFFF99' + h6: '#FFFFFF99' + p: '#d9d9d9de' # Dark Grey 6 + + # 列表文字 # Dark Grey 6 + list: '#d9d9d9de' + # 列表 hover 时的文字 + list_hl: 'mix($color-theme, #fff, 80)' + # 辅助性文字 # Dark Grey 5 + meta: '#bfbfbfde' + # 版权卡片背景色 + copyright_bkg: '#21252b' + # 夜间图片亮度 + brightness: 70% +############################### Color Scheme ############################### > end + +############################### Custom css ############################### > start +custom_css: + cursor: + enable: #true + text: volantis-static/media/cursor/text.png # https://cdn.jsdelivr.net/gh/inkss/common@1/cursor/text.png + pointer: volantis-static/media/cursor/pointer.png # https://cdn.jsdelivr.net/gh/inkss/common@1/cursor/pointer.png + default: volantis-static/media/cursor/left_ptr.png # https://cdn.jsdelivr.net/gh/inkss/common@1/cursor/left_ptr.png + not-allowed: volantis-static/media/cursor/circle.png # https://cdn.jsdelivr.net/gh/inkss/common@1/cursor/circle.png + zoom-out: volantis-static/media/cursor/zoom-out.png # https://cdn.jsdelivr.net/gh/inkss/common@1/cursor/zoom-out.png + zoom-in: volantis-static/media/cursor/zoom-in.png # https://cdn.jsdelivr.net/gh/inkss/common@1/cursor/zoom-in.png + grab: volantis-static/media/cursor/openhand.png # https://cdn.jsdelivr.net/gh/inkss/common@1/cursor/openhand.png + font_smoothing: true # font-smoothing for webkit + max_width: 1080px # Sum of body width and sidebar width (This limit will be exceeded when the device width is greater than 2000px, reaching 75% of the total width) + scrollbar: + size: 4px + border: 2px + navbar: + height: 64px + width: auto # auto, max + effect: [shadow, floatable, blur] # [shadow, floatable, blur] + sidebar: + effect: [shadow, floatable, blur] # [shadow, floatable, blur] + body: + effect: [shadow, floatable, blur] # [shadow, floatable, blur] + highlight: + language: true # show language of codeblock + grayscale: false # Enable grayscale effect + text_align: # left, right, justify, center + h1: left + h2: left + h3: left + h4: left + p: justify + gap: + h2: 48px # Spacing above H2 (only px unit) + h3: 24px # Spacing above H3 (only px unit) + h4: 16px # Spacing above H4 (only px unit) + p: 1em # Paragraph spacing between paragraphs + line_height: 1.6 # normal, 1.5, 1.75, 2 ... + border_radius: + card: 8px + codeblock: 4px + searchbar: 8px + button: 4px + fontsize: + root: 16px + h1: 1.5rem # 不推荐用在文章中 + h2: 1.5rem + h3: 1.25rem + h4: 1.125rem + h5: 1rem + h6: 1rem + list: .9375rem + meta: .875rem + code: .8125rem + footnote: .78125rem + fontfamily: + logofont: + fontfamily: '"Varela Round", "PingFang SC", "Microsoft YaHei", Helvetica, Arial' + name: 'Varela Round' + url: volantis-static/media/fonts/VarelaRound/VarelaRound-Regular.ttf # https://cdn.jsdelivr.net/gh/volantis-x/cdn-fonts/VarelaRound/VarelaRound-Regular.ttf + weight: normal + style: normal + bodyfont: + fontfamily: 'UbuntuMono, "Varela Round", "PingFang SC", "Microsoft YaHei", Helvetica, Arial' + name: 'UbuntuMono' + url: volantis-static/media/fonts/UbuntuMono/UbuntuMono-Regular.ttf # https://cdn.jsdelivr.net/gh/volantis-x/cdn-fonts/UbuntuMono/UbuntuMono-Regular.ttf + weight: normal + style: normal + codefont: + fontfamily: 'Menlo, UbuntuMono, Monaco' + # name: 'Monaco' + # url: volantis-static/media/fonts/Monaco/Monaco.ttf # https://cdn.jsdelivr.net/gh/volantis-x/cdn-fonts/Monaco/Monaco.ttf + # weight: normal + # style: normal +############################### Custom css ############################### > end + +############################### SEO ############################### > start +seo: + # When there are no keywords in the article's front-matter, use tags as keywords. + use_tags_as_keywords: true + # When there is no description in the article's front-matter, use excerpt as the description. + use_excerpt_as_description: true + robots: + home_first_page: index,follow + home_other_pages: noindex,follow + archive: noindex,follow + category: noindex,follow + tag: noindex,follow + # robots can be written in front-matter +############################### SEO ############################### > end + +############################### Open Graph ############################### > start +# https://ogp.me/ +# https://hexo.io/zh-cn/docs/helpers#open-graph +open_graph: + image: volantis-static/media/org.volantis/blog/favicon/android-chrome-192x192.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/favicon/android-chrome-192x192.png + twitter_card: summary # summary_large_image , summary + #twitter_id: + #twitter_site: +############################### Open Graph ############################### > end + +############################### Structured Data ############################### > start +# SEO 入门文档: https://developers.google.com/search/docs +# https://schema.org.cn/ +# 结构化数据用于更改搜索结果的显示效果 +# 目前内置的结构化数据: blogposting, breadcrumblist, organization, person, website +# 目前内置的富媒体搜索结果: 路径(面包屑导航), 徽标(Logo), 站点链接搜索框(SearchAction) +# https://developers.google.com/search/docs/advanced/structured-data/intro-structured-data +# 富媒体搜索结果测试: https://search.google.com/test/rich-results +structured_data: + enable: true + # 以下是覆盖配置, 默认配置见 scripts/helpers/structured-data/lib/config.js + data: + person: + sns: + - https://github.com/volantis-x + logo: + path: volantis-static/media/org.volantis/blog/favicon/android-chrome-192x192.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/favicon/android-chrome-192x192.png + width: 192 + height: 192 +############################### Structured Data ############################### > end diff --git a/themes/volantis/languages/en.yml b/themes/volantis/languages/en.yml new file mode 100755 index 0000000..ee2a639 --- /dev/null +++ b/themes/volantis/languages/en.yml @@ -0,0 +1,59 @@ +navbar: + archive: Archive + category: Category + tag: Tag + +post: + pin: Top + readmore: Read More + readoriginal: Read Original + wordcount: '%s words' + duration: '%s min' + comments: Comments + comments_load: Load %s + comments_check: Checking if %s is accessible... + comments_placeholder: Unable to load %s, please make sure your network can access. + copy_button: Copy + copy_success: Copied + copy_failure: Copy failed + updated: updated at + prev_page: Previous + next_page: Next + 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." + date: Posted on + updated: Update + references: References + license: License + +footer: + license: '[hehe Blog](https://blog.yhehe.com)' + #use: Use + #theme: as theme + #total_views: total visits + #total_visitors: total visitors + #times: times + #site_source: Uses %s as theme. You can find [source](%s) in %s. + #site_views: The visits is about %s, and the visitors is about %s. + +symbol: + comma: ", " + period: ". " + colon: ": " + brackets_l: "(" + brackets_r: ")" + +kill: + title: "Sorry, your browser cannot access this site" + more: "Learn more >" + noscript: "This page requires browser support (enable) JavaScript" + ie: "Microsoft has terminated support for Internet Explorer (IE) 10 and earlier versions in 2016.
              There are great security risks to continue using it. Please use contemporary mainstream browsers to access." + +search: + title: Search + load_data: Loading the Database + hits_empty: "We didn't find any results for the search: ${query}." + hits_stats: '${hits} results found in ${time} ms' diff --git a/themes/volantis/languages/zh-CN.yml b/themes/volantis/languages/zh-CN.yml new file mode 100755 index 0000000..a07b09a --- /dev/null +++ b/themes/volantis/languages/zh-CN.yml @@ -0,0 +1,62 @@ +navbar: + archive: 归档 + category: 分类 + tag: 标签 + +post: + pin: 置顶 + readmore: 阅读全文 + readoriginal: 去源站阅读 + wordcount: '字数:%s 字' + duration: '时长:%s 分钟' + comments: 评论 + comments_load: 点击加载 %s 评论 + comments_check: 正在检查 %s 能否访问... + comments_placeholder: 无法加载 %s 评论系统,请确保您的网络能够正常访问。 + copy_button: 复制 + copy_success: 复制成功 + copy_failure: 复制失败 + updated: 更新于 + prev_page: 上一页 + next_page: 下一页 + copyright: + author: 本文作者 + link: 本文链接 + license_title: 版权声明 + license_content: "本博客所有文章除特别声明外,均采用 %s 许可协议。转载请注明出处!" + date: 发布于 + updated: 更新于 + references: 原文出处 + license: 许可协议 + +footer: + license: '[和和日志](https://blog.yhehe.com)🌈' + #use: 使用 + #theme: 作为主题 + total_views: 总访问量为 + page_views: 本页总访客量为v + total_visitors: 总访客量 + times: 次 + peoples: 人 + site_source: 本站使用 %s 作为主题,您可以在 %s 找到[本站源码](%s)。 + site_views: 总访问量约为 %s 次,访问人数约为 %s 人。 + +symbol: + comma: "," + period: "。" + colon: ":" + brackets_l: "(" + brackets_r: ")" + +kill: + title: "抱歉,您的浏览器无法访问本站m" + more: "了解详情 >" + noscript: "本页面需要浏览器支持(启用)JavaScript" + ie: "微软已经于2016年终止了对 Internet Explorer (IE) 10 及更早版本的支持,
              继续使用存在极大的安全隐患,请使用当代主流的浏览器进行访问。" + +search: + title: 搜索 + load_data: 数据库加载中 + hits_empty: '找不到您查询的内容:${query}' + hits_stats: '找到 ${hits} 条结果,用时 ${time} 毫秒' + diff --git a/themes/volantis/languages/zh-TW.yml b/themes/volantis/languages/zh-TW.yml new file mode 100755 index 0000000..bcdc206 --- /dev/null +++ b/themes/volantis/languages/zh-TW.yml @@ -0,0 +1,55 @@ +navbar: + archive: 歸檔 + category: 分類 + tag: 標籤 + +post: + pin: 置頂 + readmore: 閱讀全文 + readoriginal: 去源站閱讀 + wordcount: '字數:%s字' + duration: '時長:%s分鐘' + comments: 評論 + comments_load: 點擊加載 %s 評論 + comments_check: 正在檢查 %s 能否訪問... + comments_placeholder: 無法加載 %s 評論系統,請確保您的網絡能夠正常訪問。 + copy_button: 複製 + copy_success: 複製成功 + copy_failure: 複製失敗 + updated: 更新於 + prev_page: 上一頁 + next_page: 下一頁 + copyright: + author: 本文作者 + link: 文章連結 + license_title: 版權聲明 + license_content: "本網誌所有文章除特別聲明外,均採用 %s 許可協議。轉載請註明出處!" + +footer: + #license: '博客內容遵循 [姓名標示-非商業性-相同方式分享 4.0 國際 (CC BY-NC-SA 4.0) 協議](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh_TW)' + #use: 本站使用 + #theme: 作為主題 + total_views: 總訪問量為 + total_visitors: 總訪客量為 + times: 次 + site_source: 本站使用 %s 作為主題,您可以在 %s 找到[本站源碼](%s)。 + site_views: 總訪問量約為 %s 次,訪問人數約為 %s 人。 + +symbol: + comma: "," + period: "。" + colon: ":" + brackets_l: "(" + brackets_r: ")" + +kill: + title: "抱歉,您的瀏覽器無法訪問本站" + more: "了解詳情 >" + noscript: "本頁面需要瀏覽器支持(啟用)JavaScript" + ie: "微軟已經於2016年終止了對 Internet Explorer (IE) 10 及更早版本的支持,
              繼續使用存在極大的安全隱患,請使用當代主流的瀏覽器進行訪問。" + +search: + title: 搜尋 + load_data: 資料庫載入中 + hits_empty: '找不到您查詢的內容:${query}' + hits_stats: '找到 ${hits} 條結果,用時 ${time} 毫秒' diff --git a/themes/volantis/layout/404.ejs b/themes/volantis/layout/404.ejs new file mode 100755 index 0000000..c993348 --- /dev/null +++ b/themes/volantis/layout/404.ejs @@ -0,0 +1,4 @@ +<%- partial('_pre') %> +
              + <%- partial('_partial/article', {post: page, index: false}) %> +
              diff --git a/themes/volantis/layout/_meta/artalkcount.ejs b/themes/volantis/layout/_meta/artalkcount.ejs new file mode 100755 index 0000000..99eec55 --- /dev/null +++ b/themes/volantis/layout/_meta/artalkcount.ejs @@ -0,0 +1,30 @@ +<% if (theme.comments.service == 'artalk' && page.comments !== false) { %> +
              + <% + let commentPath; + let path = post.path || page.path; + if (theme.comments.service && theme.comments.service.length > 0) { + let service = theme.comments.service; + if (page.comments == undefined || page.comments != false) { + if (service in page && page[service].path) { + commentPath = page[service].path; + } + } + } + if(!!theme.comments.artalk.path) path = theme.comments.artalk.path + if(commentPath) path = commentPath; + path = path.replaceAll('/index.html', '/').replaceAll('.html', '') + %> + + +

              + + + + <% if(theme.article.body.meta_library.artalkcount.desc) { %> +  <%- theme.article.body.meta_library.artalkcount.desc %> + <% } %> +

              +
              +
              +<% } %> \ No newline at end of file diff --git a/themes/volantis/layout/_meta/author.ejs b/themes/volantis/layout/_meta/author.ejs new file mode 100755 index 0000000..b634b1b --- /dev/null +++ b/themes/volantis/layout/_meta/author.ejs @@ -0,0 +1,13 @@ +<% +let author = theme.article.body.meta_library.author; +let aid = post.author; +if (aid && site.data && site.data.author && (aid in site.data.author)) { + author = site.data.author[aid]; +} +%> + diff --git a/themes/volantis/layout/_meta/category.ejs b/themes/volantis/layout/_meta/category.ejs new file mode 100755 index 0000000..e44d29c --- /dev/null +++ b/themes/volantis/layout/_meta/category.ejs @@ -0,0 +1,20 @@ +<% if (post.categories && post.categories.length){ %> + <% try { %> + <%# 在 _posts/ 外使用 categories 会报错 %> + <% const show_categories = list_categories(post.categories, { + show_count: false, + separator: '', + style: 'none' + }) %> +
              + + <%- show_categories %> + <% for(cat of post.categories.toArray()){ %> + + <% } %> +
              + <% }catch (error) {} %> +<% } %> + diff --git a/themes/volantis/layout/_meta/counter.ejs b/themes/volantis/layout/_meta/counter.ejs new file mode 100755 index 0000000..62a7d6b --- /dev/null +++ b/themes/volantis/layout/_meta/counter.ejs @@ -0,0 +1,56 @@ +<% + let path = post.path || page.path; + let commentPath; + if (theme.comments.service && theme.comments.service.length > 0) { + let service = theme.comments.service; + if (page.comments == undefined || page.comments != false) { + if (service in page && page[service].path) { + commentPath = page[service].path; + } + } + } + + if(commentPath) path = commentPath; + path = path.replaceAll('/index.html', '/').replaceAll('.html', '') + + let checkComment = false; + if (theme.plugins.busuanzi.enable + || (theme.comments.service=='waline' && theme.comments.waline.pageview) + || (theme.comments.service=='twikoo' && theme.comments.twikoo.visitor) + || (theme.comments.service=='discuss' && theme.comments.discuss.visitStat) + || (theme.comments.service=='artalk' && theme.comments.artalk.visitor)) { + checkComment = !checkComment; + } +%> + +<% if (!!page.comments && checkComment) { %> + +<% } %> diff --git a/themes/volantis/layout/_meta/date.ejs b/themes/volantis/layout/_meta/date.ejs new file mode 100755 index 0000000..e415e72 --- /dev/null +++ b/themes/volantis/layout/_meta/date.ejs @@ -0,0 +1,6 @@ + diff --git a/themes/volantis/layout/_meta/music.ejs b/themes/volantis/layout/_meta/music.ejs new file mode 100755 index 0000000..79ca691 --- /dev/null +++ b/themes/volantis/layout/_meta/music.ejs @@ -0,0 +1,3 @@ +<% if(post.music && post.music.enable != false){ %> + <%- partial('../_plugins/aplayer/layout', {post: post, where: 'meta'}) %> +<% } %> diff --git a/themes/volantis/layout/_meta/share.ejs b/themes/volantis/layout/_meta/share.ejs new file mode 100755 index 0000000..4b10c99 --- /dev/null +++ b/themes/volantis/layout/_meta/share.ejs @@ -0,0 +1,3 @@ +<% if (theme.article.body.meta_library.share) { %> + <%- partial('../_plugins/share/layout') %> +<% } %> diff --git a/themes/volantis/layout/_meta/tags.ejs b/themes/volantis/layout/_meta/tags.ejs new file mode 100755 index 0000000..6d8c56d --- /dev/null +++ b/themes/volantis/layout/_meta/tags.ejs @@ -0,0 +1,15 @@ +<% if (post.tags && post.tags.length) { %> + <% try { %> + <%# 在 _posts/ 外使用 tags 会报错 %> + <% + var items = []; + var hidden_items = []; + post.tags.each(function(item){ + items.push(''); + hidden_items.push(item.name); + }); + %> + <%- items.join(' ') %> + + <% }catch (error) {} %> +<% } %> diff --git a/themes/volantis/layout/_meta/thumbnail.ejs b/themes/volantis/layout/_meta/thumbnail.ejs new file mode 100755 index 0000000..347710e --- /dev/null +++ b/themes/volantis/layout/_meta/thumbnail.ejs @@ -0,0 +1,5 @@ +<% if(post.thumbnail && post.thumbnail.length){ %> + + + +<% } %> diff --git a/themes/volantis/layout/_meta/updated.ejs b/themes/volantis/layout/_meta/updated.ejs new file mode 100755 index 0000000..284210f --- /dev/null +++ b/themes/volantis/layout/_meta/updated.ejs @@ -0,0 +1,6 @@ + diff --git a/themes/volantis/layout/_meta/walinecount.ejs b/themes/volantis/layout/_meta/walinecount.ejs new file mode 100755 index 0000000..1d3b4fa --- /dev/null +++ b/themes/volantis/layout/_meta/walinecount.ejs @@ -0,0 +1,31 @@ +<% if (theme.comments.service == 'waline' && theme.comments.waline.comment && page.comments !== false){ %> +
              + <% + let commentPath; + let path = post.path || page.path; + if (theme.comments.service && theme.comments.service.length > 0) { + let service = theme.comments.service; + if (page.comments == undefined || page.comments != false) { + if (service in page && page[service].path) { + commentPath = page[service].path; + } + } + } + if(!!theme.comments.waline.path) path = theme.comments.waline.path + if(commentPath) path = commentPath; + path = path.replaceAll('/index.html', '/').replaceAll('.html', '') + %> + + + +

              + + + + <% if(theme.article.body.meta_library.walinecount.desc) { %> +  <%- theme.article.body.meta_library.walinecount.desc %> + <% } %> +

              +
              +
              +<% } %> diff --git a/themes/volantis/layout/_meta/wordcount.ejs b/themes/volantis/layout/_meta/wordcount.ejs new file mode 100755 index 0000000..2d66d67 --- /dev/null +++ b/themes/volantis/layout/_meta/wordcount.ejs @@ -0,0 +1,14 @@ +<% if (theme.plugins.wordcount.enable) { %> + + +<% } %> diff --git a/themes/volantis/layout/_partial/_cover/blank.ejs b/themes/volantis/layout/_partial/_cover/blank.ejs new file mode 100755 index 0000000..e69de29 diff --git a/themes/volantis/layout/_partial/_cover/dock.ejs b/themes/volantis/layout/_partial/_cover/dock.ejs new file mode 100755 index 0000000..fd2fa4b --- /dev/null +++ b/themes/volantis/layout/_partial/_cover/dock.ejs @@ -0,0 +1,33 @@ +
              +
              + <% if (theme.cover.logo) { %> + + <% } %> + <% if (theme.cover.title) { %> +

              <%- theme.cover.title ? theme.cover.title : config.title %>

              + <% } %> + <% if (theme.cover.subtitle) { %> +

              <%- theme.cover.subtitle%>

              + <% } %> +
              + +
              diff --git a/themes/volantis/layout/_partial/_cover/featured.ejs b/themes/volantis/layout/_partial/_cover/featured.ejs new file mode 100755 index 0000000..fd2fa4b --- /dev/null +++ b/themes/volantis/layout/_partial/_cover/featured.ejs @@ -0,0 +1,33 @@ +
              +
              + <% if (theme.cover.logo) { %> + + <% } %> + <% if (theme.cover.title) { %> +

              <%- theme.cover.title ? theme.cover.title : config.title %>

              + <% } %> + <% if (theme.cover.subtitle) { %> +

              <%- theme.cover.subtitle%>

              + <% } %> +
              + +
              diff --git a/themes/volantis/layout/_partial/_cover/focus.ejs b/themes/volantis/layout/_partial/_cover/focus.ejs new file mode 100755 index 0000000..fd2fa4b --- /dev/null +++ b/themes/volantis/layout/_partial/_cover/focus.ejs @@ -0,0 +1,33 @@ +
              +
              + <% if (theme.cover.logo) { %> + + <% } %> + <% if (theme.cover.title) { %> +

              <%- theme.cover.title ? theme.cover.title : config.title %>

              + <% } %> + <% if (theme.cover.subtitle) { %> +

              <%- theme.cover.subtitle%>

              + <% } %> +
              + +
              diff --git a/themes/volantis/layout/_partial/_cover/layout.ejs b/themes/volantis/layout/_partial/_cover/layout.ejs new file mode 100755 index 0000000..a0e56c7 --- /dev/null +++ b/themes/volantis/layout/_partial/_cover/layout.ejs @@ -0,0 +1,8 @@ +<% if (theme.plugins.parallax.enable) { %> +
              +<% } else if (theme.plugins.lazyload && theme.plugins.lazyload.enable) { %> +
              +<% } else { %> +
              +<% } %> +<%- partial(theme.cover.layout_scheme) %> \ No newline at end of file diff --git a/themes/volantis/layout/_partial/_cover/search.ejs b/themes/volantis/layout/_partial/_cover/search.ejs new file mode 100755 index 0000000..e1f1897 --- /dev/null +++ b/themes/volantis/layout/_partial/_cover/search.ejs @@ -0,0 +1,41 @@ +
              +
              + <% if (theme.cover.logo) { %> + + <% } %> + <% if (theme.cover.title) { %> +

              <%- theme.cover.title ? theme.cover.title : config.title %>

              + <% } %> + <% if (theme.cover.subtitle) { %> +

              <%- theme.cover.subtitle%>

              + <% } %> +
              +
              + <% if (theme.search.enable === true) { %> + + <% } %> + +
              +
              diff --git a/themes/volantis/layout/_partial/archive.ejs b/themes/volantis/layout/_partial/archive.ejs new file mode 100755 index 0000000..5fb7052 --- /dev/null +++ b/themes/volantis/layout/_partial/archive.ejs @@ -0,0 +1,67 @@ +<% if (site.posts && site.posts.length > 0) { %> +
              + <% if (!page.prev) { %> + <% if (is_home()) { %> + <% site.pages.each(function(post){ %> + <% if (post.pin) { %> + <% if (page.group == undefined || post.group == page.group) { %> +
              + <%- partial('post', {post: post}) %> +
              + <% } %> + <% } %> + <% }) %> + <% site.posts.sort('date', -1).each(function(post){ %> + <% if (post.pin) { %> + <% if (page.group == undefined || post.group == page.group) { %> +
              + <%- partial('post', {post: post}) %> +
              + <% } %> + <% } %> + <% }) %> + <% } else if (page.posts && page.posts.length > 0) { %> + <% page.posts.each(function(post){ %> + <% if (post.pin) { %> +
              + <%- partial('post', {post: post}) %> +
              + <% } %> + <% }) %> + <% } %> + <% } %> + <% if (page.posts && page.posts.length > 0) { %> + <% page.posts.each(function(post){ %> + <% if (!post.pin) { %> +
              + <%- partial('post', {post: post}) %> +
              + <% } %> + <% }) %> + <% } %> +
              + <% if (page && page.posts) { %> + <% if (page.total > 1) { %> +
              +
              + <% if (page.prev != 0) { %> + + <% } %> +

              + <%= page.current%> / <%= page.total%> +

              + <% if (page.next != 0) { %> + + <% } %> +
              + <% } %> + <% } %> +<% } %> diff --git a/themes/volantis/layout/_partial/article.ejs b/themes/volantis/layout/_partial/article.ejs new file mode 100755 index 0000000..2992565 --- /dev/null +++ b/themes/volantis/layout/_partial/article.ejs @@ -0,0 +1,195 @@ +
              + + + + <%- partial('meta', {post: post, position: 'top'}) %> +
              +
              + <%- post.content %> +
              + <% if (page.link) { %> + + <% } %> + <% if (['post','docs'].includes(page.layout)) { %> + <% let footer_widget = theme.article.body.footer_widget; %> + + <% } %> + <% if (['page', 'post', 'docs'].includes(post.layout)) { %> + <%- partial('meta', {post: post, position: 'bottom'}) %> + <% } %> + <% if ((post.group != undefined) && (post.order != undefined)) { %> + <% + let prev = new Object(); + let next = new Object(); + site.pages.each(function(p){ + if ((p.title || p.seo_title) && p.path && (p.group == post.group)) { + if (p.order < post.order && (p.order > prev.order || prev.order == undefined)) { + prev = {title: p.title || p.seo_title, exp: truncate(strip_html(p.content), {length: 100}), path: p.path, order: p.order}; + } + if (p.order > post.order && (p.order < next.order || next.order == undefined)) { + next = {title: p.title || p.seo_title, exp: truncate(strip_html(p.content), {length: 100}), path: p.path, order: p.order}; + } + } + }) + %> + <% if (['docs'].includes(post.layout) && (prev || next)) { %> +
              + <% if (prev.path) { %> + + <% } %> + <% if (next.path) { %> + + <% } %> +
              + <% } %> + <% } %> + + <% if (post.prev || post.next) { %> + + <% } %> + + <% let footer_widget = theme.article.body.footer_widget; %> + <% if (footer_widget.recommended_article && footer_widget.recommended_article.enable == true && footer_widget.recommended_article.layout.includes(page.layout) && !page.skip_recommended_article) { %> + <%- 文章推荐生成器(post) %> + <% } %> + + <%- volantis_inject('postEnd') %> + +
              + +<% if (page.comments == undefined || page.comments != false) { %> + <%- partial('../_plugins/comments/index') %> +<% } %> + diff --git a/themes/volantis/layout/_partial/categories.ejs b/themes/volantis/layout/_partial/categories.ejs new file mode 100755 index 0000000..796bc18 --- /dev/null +++ b/themes/volantis/layout/_partial/categories.ejs @@ -0,0 +1,11 @@ +<% if (post.categories && post.categories.length && post.categories.forEach){ %> + <% + var cats = []; + post.categories.forEach(function(cat){ + cats.push('' + cat.name + ''); + }); + %> +
              +  <%- cats.join(' / ') %> +
              +<% } %> diff --git a/themes/volantis/layout/_partial/cover.ejs b/themes/volantis/layout/_partial/cover.ejs new file mode 100755 index 0000000..0169312 --- /dev/null +++ b/themes/volantis/layout/_partial/cover.ejs @@ -0,0 +1,14 @@ +
              + <% if (page.cover == true) { %> + <% if (is_home() && page.prev == 0 && theme.cover.height_scheme == 'full') { %> +
              + <%- partial("./_cover/layout") %> + +
              + <% } else { %> +
              + <%- partial("./_cover/layout") %> +
              + <% } %> + <% } %> +
              diff --git a/themes/volantis/layout/_partial/footer.ejs b/themes/volantis/layout/_partial/footer.ejs new file mode 100755 index 0000000..c3c2a6e --- /dev/null +++ b/themes/volantis/layout/_partial/footer.ejs @@ -0,0 +1,57 @@ +<% if (theme.site_footer) { %> + <% + var layout = theme.site_footer.layout; + if (config.theme_config && config.theme_config.footer && config.theme_config.footer.layout) { + layout = config.theme_config.footer.layout; + } + let theme_version = theme.info.theme_version + // // 未发布的 alpha 版本 + // if (theme_version.indexOf("alpha")!=-1) { + // theme_version = "dev" + // } + // // 从 5.7.2 以后的版本以 v开头(release-please的奇怪设定) + // else if (theme_version.indexOf("beta")==-1||theme_version.indexOf("rc")==-1) { + // theme_version = "v" + theme_version + // } + %> +
              +

              + <% layout.forEach(function(item){ %> + <% if (item == 'social') { %> +
              + + <% } else if (item == 'aplayer') { %> +
              + <%- partial('../_plugins/aplayer/layout', {post: null, where: 'footer'}) %> +
              + <% } else if (item == 'license') { %> +
              <%- markdown(__('footer.license')) %>
              + + <% } else { %> + <% if (item in theme.site_footer) { %> +
              <%- markdown(theme.site_footer[item]) %>
              + <% } %> + <% } %> + <% }) %> + + <%- volantis_inject('footer') %> + + +
              +<% } %> diff --git a/themes/volantis/layout/_partial/head.ejs b/themes/volantis/layout/_partial/head.ejs new file mode 100755 index 0000000..757fb8d --- /dev/null +++ b/themes/volantis/layout/_partial/head.ejs @@ -0,0 +1,79 @@ + + <%- meta_generator() %> + + + + <%- generate_seo(theme, page) %> + <%- autoCanonical(config, page) %> + + <%_ if (theme.dns_prefetch && theme.dns_prefetch.length){ _%> + + <%_ getList(theme.dns_prefetch).forEach(function(item){ _%> + + + <%_ }) _%> + <%_ } _%> + + + + <%_ if (theme.csp.enable) { _%> + + <%_ } _%> + + + + + + + <%_ if (config.import && config.import.head_begin){ _%> + <%_ getList(config.import.head_begin).forEach(function(item){ _%> + <%- item %> + <%_ }) _%> + <%_ } _%> + + + <%- volantis_inject('headBegin') %> + + <%_ if (config.favicon) { _%> + + <%_ } _%> + + <%- generate_preload_fontfamily(theme) %> + + <%_ if (config.feed && config.feed.path){ _%> + <%_ getList(config.feed.path).forEach(function(item){ _%> + <%- feed_tag(item, {title: config.title}) %> + <%_ }) _%> + <%_ } _%> + + <%- generate_title(config, theme, page) %> + <%- generate_keywords(config, theme, page) %> + <%- generate_description(config, theme, page) %> + <%- open_graph(theme.open_graph) %> + + + + <%_ if (theme.plugins.darkmode.enable) { _%> + + <%_ } _%> + <%- partial('../_plugins/end-of-support/script') %> + <%- partial('scripts/global') %> + + <%_ if (config.import && config.import.head_end){ _%> + <%_ getList(config.import.head_end).forEach(function(item){ _%> + <%- item %> + <%_ }) _%> + <%_ } _%> + + + <%- volantis_inject('headEnd') %> + + diff --git a/themes/volantis/layout/_partial/header.ejs b/themes/volantis/layout/_partial/header.ejs new file mode 100755 index 0000000..9971dbd --- /dev/null +++ b/themes/volantis/layout/_partial/header.ejs @@ -0,0 +1,122 @@ + diff --git a/themes/volantis/layout/_partial/meta.ejs b/themes/volantis/layout/_partial/meta.ejs new file mode 100755 index 0000000..e374bbc --- /dev/null +++ b/themes/volantis/layout/_partial/meta.ejs @@ -0,0 +1,66 @@ +<% +var topMetas = theme.article.body.top_meta || []; +if (post.top_meta == false) { + topMetas = []; +} +var bottomMetas = theme.article.body.bottom_meta || []; +if (post.bottom_meta == false) { + bottomMetas = []; +} +%> + +<% if (position == 'top') { %> + <% if (post.headimg) { %> +
              + + + +
              + <% } else { %> + + <% } %> + +<% } else if (position == 'bottom') { %> + +<% } %> diff --git a/themes/volantis/layout/_partial/post.ejs b/themes/volantis/layout/_partial/post.ejs new file mode 100755 index 0000000..b418e58 --- /dev/null +++ b/themes/volantis/layout/_partial/post.ejs @@ -0,0 +1,117 @@ +
              + + + + <% + let showPin = false; + if (post.pin && (post.title || theme.article.preview.auto_title) && theme.article.preview.pin_icon) { + showPin = true; + } + let showTitle = false; + if (theme.article.preview.auto_title || (post.title && (post.link || post.path))) { + showTitle = true; + } + let showCat = false; + if (post.categories && post.categories.length > 0) { + showCat = true; + } + let showReadmore = false; + if (theme.article.preview.readmore == 'always' || ((post.readmore != false) && (theme.article.preview.auto_excerpt || post.excerpt || post.description || post.link))) { + showReadmore = true; + } + %> + <% if (showPin == true) { %> +
              + <%- post.title %> +
              + <% } %> + <% if (post.headimg) { %> +
              + + <%- post.title %> + +
              + <% } else { %> + + <% } %> + <% if (showTitle) { %> + <% + let pinTitle = false; + if (showPin && !post.headimg) { + pinTitle = true; + } + %> +

              itemprop="name headline"> + +

              + <% } else { %> + + <% } %> +
              + <% if (post.excerpt) { %> + <%- post.excerpt %> + <% } else if (post.description) { %> +

              <%- post.description %>

              + <% } else if (post.content) { %> + <% if (theme.article.preview.auto_excerpt) { %> + <%- truncate(strip_html(post.content), {length: 200}) %> + <% } else if(!theme.article.preview.hide_excerpt) { %> + <%- post.content %> + <% } %> + <% } %> +
              + <% if (showCat || showReadmore || theme.article.preview.author) { %> +
              +
              + <% if (theme.article.preview.author) { %> + <% + let author = theme.article.body.meta_library.author; + let aid = post.author; + if (aid && site.data && site.data.author && (aid in site.data.author)) { + author = site.data.author[aid]; + } + %> + + + <% } %> + + <% if (post.categories && post.categories.length > 0) { %> + + <%- list_categories(post.categories, { + show_count: false, + separator: '', + style: 'none' + }) %> + <% for(cat of post.categories.toArray()){ %> + + <% } %> + <% } %> +
              + <% if (showReadmore) { %> + + <% } %> +
              + <% } %> + +
              diff --git a/themes/volantis/layout/_partial/scripts/_ctrl.ejs b/themes/volantis/layout/_partial/scripts/_ctrl.ejs new file mode 100755 index 0000000..4bb4be7 --- /dev/null +++ b/themes/volantis/layout/_partial/scripts/_ctrl.ejs @@ -0,0 +1,39 @@ +<%_ + // 为保证初次进入页面流畅,要求浏览器禁用Javascript时(仅HTML渲染)封面控制正常 + // layout/_partial/cover.ejs + // layout/_partial/header.ejs + theme.cover_ctrl={} + theme.cover_ctrl.enableCover = false; // 封面是否开启 + theme.cover_ctrl.frontMatterCover = 'none'; // 封面控制 + theme.cover_ctrl.coverWrapperDisplay = 'none'; + theme.cover_ctrl.scrollDownDisplay = 'none'; + theme.cover_ctrl.headerShow = 'show'; + if(theme.cover && theme.cover.height_scheme) { + theme.cover_ctrl.enableCover = true; + } + if (theme.cover_ctrl.enableCover && page && page.cover) { + theme.cover_ctrl.frontMatterCover = page.cover; + if (is_home() && page.prev == 0 && theme.cover.height_scheme == 'full') { + theme.cover_ctrl.frontMatterCover = 'full'; + } else { + theme.cover_ctrl.frontMatterCover = 'half'; + } + } + /*cover*/ + if (theme.cover_ctrl.frontMatterCover == "full") { + theme.cover_ctrl.coverWrapperDisplay= ""; + theme.cover_ctrl.scrollDownDisplay = ""; + } else if (theme.cover_ctrl.frontMatterCover == "half"){ + theme.cover_ctrl.coverWrapperDisplay= ""; + theme.cover_ctrl.scrollDownDisplay = "none"; + } else if (theme.cover_ctrl.frontMatterCover == "none"){ + theme.cover_ctrl.coverWrapperDisplay= "none"; + theme.cover_ctrl.scrollDownDisplay = "none"; + } + /*header*/ + if (theme.cover_ctrl.frontMatterCover == "none") { + theme.cover_ctrl.headerShow="show"; + } else { + theme.cover_ctrl.headerShow=""; + } +_%> diff --git a/themes/volantis/layout/_partial/scripts/config.ejs b/themes/volantis/layout/_partial/scripts/config.ejs new file mode 100755 index 0000000..56b4ec9 --- /dev/null +++ b/themes/volantis/layout/_partial/scripts/config.ejs @@ -0,0 +1,101 @@ +<% +var commentPath = ''; // 自定义的评论路径 +var commentPlaceholder = ''; // 自定义的评论描述 +var commentConfig = {}; // 自定义的评论配置 +var ispage = false; // 一二级导航栏切换控制 +var postTitle = ''; // 当前文章标题,用于二级导航栏赋值 +if (theme.comments.service && theme.comments.service.length > 0) { + let service = theme.comments.service; + if (page.comments == undefined || page.comments != false) { + if (service in page) { + if (page[service].path) { + commentPath = page[service].path; + } + if (page[service].placeholder) { + commentPlaceholder = page[service].placeholder; + } + if (page[service].config) { + commentConfig = page[service].config; + } + } + } +} +if (page && page.layout == 'post' && page.title) { + ispage = true; + postTitle = page.title; +} +%> + \ No newline at end of file diff --git a/themes/volantis/layout/_partial/scripts/global.ejs b/themes/volantis/layout/_partial/scripts/global.ejs new file mode 100755 index 0000000..ebfd74f --- /dev/null +++ b/themes/volantis/layout/_partial/scripts/global.ejs @@ -0,0 +1,367 @@ + +<%- partial('./config') %> \ No newline at end of file diff --git a/themes/volantis/layout/_partial/scripts/index.ejs b/themes/volantis/layout/_partial/scripts/index.ejs new file mode 100755 index 0000000..7fa83f8 --- /dev/null +++ b/themes/volantis/layout/_partial/scripts/index.ejs @@ -0,0 +1,144 @@ + + + + + +<% if (theme.plugins.globalJquery) { %> + <%- js(theme.cdn.jquery) %> +<% } %> + + +<%- js(theme.cdn.volantis_app) %> + +<% if (theme.rightmenus.enable) { %> + <%- partial('../../_plugins/rightmenus/layout') %> +<% } %> + + +<% if (theme.plugins.darkmode.enable) { %> + <%- partial('../../_plugins/darkmode/script') %> +<% } %> + +<% if (theme.plugins.sitesjs.enable || theme.plugins.friendsjs.enable || theme.plugins.contributorsjs.enable) { %> +<%- partial('../../_plugins/github-api/script') %> +<% } %> + +<% if (theme.plugins.lazyload && theme.plugins.lazyload.enable) { %> + <%- partial('../../_plugins/lazyload/script') %> +<% } %> + +<% if (theme.plugins.preload.enable && theme.plugins.preload.service) { %> + <%- partial('../../_plugins/preload/script') %> +<% } %> + +<% if (theme.plugins.scrollreveal.enable) { %> + <%- partial('../../_plugins/scrollreveal/script') %> +<% } %> + +<% if (theme.plugins.aplayer && theme.plugins.aplayer.enable) { %> + <%- partial('../../_plugins/aplayer/script') %> +<% } %> + +<% + if (theme.comments.service && theme.comments.service.length > 0) { + try { %> + <%- partial('../../_plugins/comments/' + theme.comments.service + '/script') %> + <% } catch (e) { + // error friendly + console.log(` +=============================================================================== + 没有找到评论插件:${theme.comments.service} + 请检查是否存在该插件,或者检查插件名称是否正确:${theme.comments.service} + see: https://volantis.js.org/v5/theme-settings/#选择评论系统 +================================================================================ + There is no comments plugin: ${theme.comments.service} + Please check if the plugin exists, or check the plugin name is correct: ${theme.comments.service} + see: https://volantis.js.org/v5/theme-settings/#选择评论系统 +=================================================================================`) + } + } +%> + + + +<% if (theme.plugins.busuanzi.enable) { %> + +<% } %> + + +<% if (theme.search && theme.search.enable) { %> + <%- partial('../../_plugins/search/script') %> +<% } %> + +<% if (theme.plugins.nodewaves.enable) { %> + <%- partial('../../_plugins/nodewaves/script') %> +<% } %> + +<% if (theme.plugins.comment_typing.enable) { %> + <%- js(theme.cdn.comment_typing) %> +<% } %> + +<% if (theme.plugins.code_highlight) { %> + <%- partial('../../_plugins/highlight/script') %> +<% } %> + +<% if (config.google_analytics_key || config.baidu_analytics_key || config.tencent_aegis_id || config.v6_51_la || config.perf_51_la) { %> + <%- partial('../../_plugins/analytics/script') %> +<% } %> + +<% if (theme.plugins.chat_service) { %> + <%- partial('../../_plugins/chat/index') %> +<% } %> + +<% if (theme.plugins.parallax.enable) { %> + <%- partial('../../_plugins/parallax/script') %> +<% } %> + +<% if (theme.plugins.swiper.enable) { %> + <%- partial('../../_plugins/swiper/script') %> +<% } %> + +<% if (theme.plugins.pace.enable) { %> + <%- partial('../../_plugins/pace/script') %> +<% } %> + +<% if (page.plugins) { %> +<%- partial('../../_plugins/_page_plugins/index') %> +<% } %> + +<%- partial('../../_plugins/toc/script') %> + +<% if (theme.content_visibility) { %> + <%- partial('../../_plugins/content-visibility/script') %> +<% } %> + +<%- partial('../../_plugins/slow-network/script') %> + +<% if (theme.structured_data && theme.structured_data.enable) { %> + <%- structured_data() %> +<% } %> + +<% if (theme.plugins.tianliGPT.enable) { %> + <%- partial('../../_plugins/tianligpt/script') %> +<% } %> diff --git a/themes/volantis/layout/_partial/side.ejs b/themes/volantis/layout/_partial/side.ejs new file mode 100755 index 0000000..155322d --- /dev/null +++ b/themes/volantis/layout/_partial/side.ejs @@ -0,0 +1,6 @@ + diff --git a/themes/volantis/layout/_plugins/_page_plugins/artitalk/index.ejs b/themes/volantis/layout/_plugins/_page_plugins/artitalk/index.ejs new file mode 100755 index 0000000..3cbfe89 --- /dev/null +++ b/themes/volantis/layout/_plugins/_page_plugins/artitalk/index.ejs @@ -0,0 +1,15 @@ + + + diff --git a/themes/volantis/layout/_plugins/_page_plugins/bbtalk/index.ejs b/themes/volantis/layout/_plugins/_page_plugins/bbtalk/index.ejs new file mode 100755 index 0000000..4cf152b --- /dev/null +++ b/themes/volantis/layout/_plugins/_page_plugins/bbtalk/index.ejs @@ -0,0 +1,10 @@ + + diff --git a/themes/volantis/layout/_plugins/_page_plugins/fcircle/index.ejs b/themes/volantis/layout/_plugins/_page_plugins/fcircle/index.ejs new file mode 100755 index 0000000..c2d2260 --- /dev/null +++ b/themes/volantis/layout/_plugins/_page_plugins/fcircle/index.ejs @@ -0,0 +1,14 @@ + + + diff --git a/themes/volantis/layout/_plugins/_page_plugins/gitter/index.ejs b/themes/volantis/layout/_plugins/_page_plugins/gitter/index.ejs new file mode 100755 index 0000000..ec7148f --- /dev/null +++ b/themes/volantis/layout/_plugins/_page_plugins/gitter/index.ejs @@ -0,0 +1 @@ +<%- partial( "../../chat/gitter/script") %> diff --git a/themes/volantis/layout/_plugins/_page_plugins/indent/index.ejs b/themes/volantis/layout/_plugins/_page_plugins/indent/index.ejs new file mode 100755 index 0000000..1ca829d --- /dev/null +++ b/themes/volantis/layout/_plugins/_page_plugins/indent/index.ejs @@ -0,0 +1,16 @@ + diff --git a/themes/volantis/layout/_plugins/_page_plugins/index.ejs b/themes/volantis/layout/_plugins/_page_plugins/index.ejs new file mode 100755 index 0000000..80afc42 --- /dev/null +++ b/themes/volantis/layout/_plugins/_page_plugins/index.ejs @@ -0,0 +1,27 @@ +<%_ +getList(page.plugins).forEach(function(item){ + try { + if (typeof item == "string") { _%> + <%- partial( item + "/index") %> +<%_ }else if(typeof item == "object"){ _%> + <%- partial( Object.keys(item)[0] + "/index", { pagePlugin:item }) %> +<%_ } + } catch (error) { + // error friendly + console.log(` +=============================================================================== + 没有找到页面插件:${item} + 请检查是否存在该插件,或者检查插件名称是否正确:${item} + 出问题的页面:${page.path} + see: https://volantis.js.org/v6/page-settings/#页面插件-page-plugins +================================================================================ + There is no page plugin: ${item} + Please check if the plugin exists, or check the plugin name is correct: ${item} + The page that has problem: ${page.path} + see: https://volantis.js.org/v6/page-settings/#页面插件-page-plugins +=================================================================================`); + } + +}) + +_%> diff --git a/themes/volantis/layout/_plugins/_page_plugins/katex/index.ejs b/themes/volantis/layout/_plugins/_page_plugins/katex/index.ejs new file mode 100755 index 0000000..2593f4b --- /dev/null +++ b/themes/volantis/layout/_plugins/_page_plugins/katex/index.ejs @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/themes/volantis/layout/_plugins/_page_plugins/mathjax/index.ejs b/themes/volantis/layout/_plugins/_page_plugins/mathjax/index.ejs new file mode 100755 index 0000000..5b24760 --- /dev/null +++ b/themes/volantis/layout/_plugins/_page_plugins/mathjax/index.ejs @@ -0,0 +1,51 @@ + diff --git a/themes/volantis/layout/_plugins/_page_plugins/memos/index.ejs b/themes/volantis/layout/_plugins/_page_plugins/memos/index.ejs new file mode 100755 index 0000000..4a72353 --- /dev/null +++ b/themes/volantis/layout/_plugins/_page_plugins/memos/index.ejs @@ -0,0 +1,15 @@ + + + + + + diff --git a/themes/volantis/layout/_plugins/_page_plugins/snackbar/index.ejs b/themes/volantis/layout/_plugins/_page_plugins/snackbar/index.ejs new file mode 100755 index 0000000..0efebf4 --- /dev/null +++ b/themes/volantis/layout/_plugins/_page_plugins/snackbar/index.ejs @@ -0,0 +1,55 @@ +<% if (site.data.notification && (pagePlugin.snackbar in site.data.notification)) { %> +<% let snackbar = site.data.notification[pagePlugin.snackbar] %> +<% if (snackbar.position == 'bottom') { %> +
              + +<% } else if (snackbar.position == 'right') { %> + <% if (snackbar.buttons && snackbar.buttons.length > 0) { %> + + <% } %> +<% } %> + + +<% } %> diff --git a/themes/volantis/layout/_plugins/analytics/script.ejs b/themes/volantis/layout/_plugins/analytics/script.ejs new file mode 100755 index 0000000..9374500 --- /dev/null +++ b/themes/volantis/layout/_plugins/analytics/script.ejs @@ -0,0 +1,70 @@ +<% if (config.google_analytics_key) { %> + + + +<% } %> + +<% if (config.baidu_analytics_key) { %> + + +<% } %> + +<% if (config.tencent_aegis_id) { %> + +<% } %> + +<% if (config.v6_51_la) { %> + + +<% } %> + +<% if (config.perf_51_la) { %> + + +<% } %> \ No newline at end of file diff --git a/themes/volantis/layout/_plugins/aplayer/layout.ejs b/themes/volantis/layout/_plugins/aplayer/layout.ejs new file mode 100755 index 0000000..a1789f6 --- /dev/null +++ b/themes/volantis/layout/_plugins/aplayer/layout.ejs @@ -0,0 +1,39 @@ +<% +let aplayer = theme.plugins.aplayer; +%> +<% if (theme.plugins.aplayer.enable == true) { %> + <% if (aplayer.source == "meting") { %> + <% if (post && post.music) { %> + + + <% } else { %> + + + <% } %> + <% } else { %> + <% if (post && post.music) { %> +
              + <% } else { %> +
              + <% } %> + <% } %> +<% } %> + diff --git a/themes/volantis/layout/_plugins/aplayer/meting-plus.js b/themes/volantis/layout/_plugins/aplayer/meting-plus.js new file mode 100755 index 0000000..f8d942e --- /dev/null +++ b/themes/volantis/layout/_plugins/aplayer/meting-plus.js @@ -0,0 +1,151 @@ +class MetingJSElement extends HTMLElement { + + connectedCallback() { + if (window.APlayer && window.fetch) { + this._init() + this._parse() + } + } + + disconnectedCallback() { + if (!this.lock) { + this.aplayer.destroy() + } + } + + _camelize(str) { + return str + .replace(/^[_.\- ]+/, '') + .toLowerCase() + .replace(/[_.\- ]+(\w|$)/g, (m, p1) => p1.toUpperCase()) + } + + _init() { + let config = {} + for (let i = 0; i < this.attributes.length; i += 1) { + config[this._camelize(this.attributes[i].name)] = this.attributes[i].value + } + let keys = [ + 'server', 'type', 'id', 'api', 'auth', + 'auto', 'lock', + 'name', 'title', 'artist', 'author', 'url', 'cover', 'pic', 'lyric', 'lrc', + 'audio', + ] + this.meta = {} + for (let key of keys) { + this.meta[key] = config[key] + delete config[key] + } + this.config = config + + this.api = this.meta.api || window.meting_api || 'https://api.i-meto.com/meting/api?server=:server&type=:type&id=:id&r=:r' + if (this.meta.auto) this._parse_link() + } + + _parse_link() { + let rules = [ + ['music.163.com.*song.*id=(\\d+)', 'netease', 'song'], + ['music.163.com.*album.*id=(\\d+)', 'netease', 'album'], + ['music.163.com.*artist.*id=(\\d+)', 'netease', 'artist'], + ['music.163.com.*playlist.*id=(\\d+)', 'netease', 'playlist'], + ['music.163.com.*discover/toplist.*id=(\\d+)', 'netease', 'playlist'], + ['y.qq.com.*song/(\\w+).html', 'tencent', 'song'], + ['y.qq.com.*album/(\\w+).html', 'tencent', 'album'], + ['y.qq.com.*singer/(\\w+).html', 'tencent', 'artist'], + ['y.qq.com.*playsquare/(\\w+).html', 'tencent', 'playlist'], + ['y.qq.com.*playlist/(\\w+).html', 'tencent', 'playlist'], + ['xiami.com.*song/(\\w+)', 'xiami', 'song'], + ['xiami.com.*album/(\\w+)', 'xiami', 'album'], + ['xiami.com.*artist/(\\w+)', 'xiami', 'artist'], + ['xiami.com.*collect/(\\w+)', 'xiami', 'playlist'], + ] + + for (let rule of rules) { + let patt = new RegExp(rule[0]) + let res = patt.exec(this.meta.auto) + if (res !== null) { + this.meta.server = rule[1] + this.meta.type = rule[2] + this.meta.id = res[1] + return + } + } + } + + _parse() { + if (this.meta.audio) { + let audioList + if(this.meta.audio.trim().startsWith("%5B")){ // 以中括号开头,认为是数组 + audioList = JSON.parse(decodeURI(this.meta.audio)) + }else{ + audioList = eval(this.meta.audio) + } + this._loadPlayer(audioList) + return + } + if (this.meta.url) { + let result = { + name: this.meta.name || this.meta.title || 'Audio name', + artist: this.meta.artist || this.meta.author || 'Audio artist', + url: this.meta.url, + cover: this.meta.cover || this.meta.pic, + lrc: this.meta.lrc || this.meta.lyric || '', + type: this.meta.type || 'auto', + } + if (!result.lrc) { + this.meta.lrcType = 0 + } + if (this.innerText) { + result.lrc = this.innerText + this.meta.lrcType = 2 + } + this._loadPlayer([result]) + return + } + + let url = this.api + .replace(':server', this.meta.server) + .replace(':type', this.meta.type) + .replace(':id', this.meta.id) + .replace(':auth', this.meta.auth) + .replace(':r', Math.random()) + + fetch(url) + .then(res => res.json()) + .then(result => this._loadPlayer(result)) + } + + _loadPlayer(data) { + + let defaultOption = { + audio: data, + mutex: true, + lrcType: this.meta.lrcType || 3, + storageName: 'metingjs' + } + + if (!data.length) return + + let options = { + ...defaultOption, + ...this.config, + } + for (let optkey in options) { + if (options[optkey] === 'true' || options[optkey] === 'false') { + options[optkey] = (options[optkey] === 'true') + } + } + + let div = document.createElement('div') + options.container = div + this.appendChild(div) + + this.aplayer = new APlayer(options) + } + +} + +if (window.customElements && !window.customElements.get('meting-js')) { + window.MetingJSElement = MetingJSElement + window.customElements.define('meting-js', MetingJSElement) +} \ No newline at end of file diff --git a/themes/volantis/layout/_plugins/aplayer/script.ejs b/themes/volantis/layout/_plugins/aplayer/script.ejs new file mode 100755 index 0000000..a578d4c --- /dev/null +++ b/themes/volantis/layout/_plugins/aplayer/script.ejs @@ -0,0 +1,101 @@ + diff --git a/themes/volantis/layout/_plugins/chat/gitter/script.ejs b/themes/volantis/layout/_plugins/chat/gitter/script.ejs new file mode 100755 index 0000000..b101a64 --- /dev/null +++ b/themes/volantis/layout/_plugins/chat/gitter/script.ejs @@ -0,0 +1,17 @@ + + + \ No newline at end of file diff --git a/themes/volantis/layout/_plugins/chat/index.ejs b/themes/volantis/layout/_plugins/chat/index.ejs new file mode 100755 index 0000000..26acbc5 --- /dev/null +++ b/themes/volantis/layout/_plugins/chat/index.ejs @@ -0,0 +1 @@ +<%- partial( theme.plugins.chat_service + "/script") %> diff --git a/themes/volantis/layout/_plugins/chat/tidio/script.ejs b/themes/volantis/layout/_plugins/chat/tidio/script.ejs new file mode 100755 index 0000000..182fb1f --- /dev/null +++ b/themes/volantis/layout/_plugins/chat/tidio/script.ejs @@ -0,0 +1 @@ + diff --git a/themes/volantis/layout/_plugins/comments/artalk/script.ejs b/themes/volantis/layout/_plugins/comments/artalk/script.ejs new file mode 100755 index 0000000..a24e7b2 --- /dev/null +++ b/themes/volantis/layout/_plugins/comments/artalk/script.ejs @@ -0,0 +1,73 @@ + diff --git a/themes/volantis/layout/_plugins/comments/beaudar/script.ejs b/themes/volantis/layout/_plugins/comments/beaudar/script.ejs new file mode 100755 index 0000000..8893c76 --- /dev/null +++ b/themes/volantis/layout/_plugins/comments/beaudar/script.ejs @@ -0,0 +1,52 @@ + diff --git a/themes/volantis/layout/_plugins/comments/discuss/script.ejs b/themes/volantis/layout/_plugins/comments/discuss/script.ejs new file mode 100755 index 0000000..1207d26 --- /dev/null +++ b/themes/volantis/layout/_plugins/comments/discuss/script.ejs @@ -0,0 +1,23 @@ + diff --git a/themes/volantis/layout/_plugins/comments/disqus/script.ejs b/themes/volantis/layout/_plugins/comments/disqus/script.ejs new file mode 100755 index 0000000..fa1a35c --- /dev/null +++ b/themes/volantis/layout/_plugins/comments/disqus/script.ejs @@ -0,0 +1,83 @@ + diff --git a/themes/volantis/layout/_plugins/comments/disqusjs/script.ejs b/themes/volantis/layout/_plugins/comments/disqusjs/script.ejs new file mode 100755 index 0000000..d3f4219 --- /dev/null +++ b/themes/volantis/layout/_plugins/comments/disqusjs/script.ejs @@ -0,0 +1,34 @@ + diff --git a/themes/volantis/layout/_plugins/comments/giscus/script.ejs b/themes/volantis/layout/_plugins/comments/giscus/script.ejs new file mode 100755 index 0000000..ba66471 --- /dev/null +++ b/themes/volantis/layout/_plugins/comments/giscus/script.ejs @@ -0,0 +1,46 @@ + diff --git a/themes/volantis/layout/_plugins/comments/gitalk/script.ejs b/themes/volantis/layout/_plugins/comments/gitalk/script.ejs new file mode 100755 index 0000000..530d798 --- /dev/null +++ b/themes/volantis/layout/_plugins/comments/gitalk/script.ejs @@ -0,0 +1,23 @@ + diff --git a/themes/volantis/layout/_plugins/comments/hashover/script.ejs b/themes/volantis/layout/_plugins/comments/hashover/script.ejs new file mode 100755 index 0000000..39a7296 --- /dev/null +++ b/themes/volantis/layout/_plugins/comments/hashover/script.ejs @@ -0,0 +1,5 @@ + + diff --git a/themes/volantis/layout/_plugins/comments/index.ejs b/themes/volantis/layout/_plugins/comments/index.ejs new file mode 100755 index 0000000..4aaa0bd --- /dev/null +++ b/themes/volantis/layout/_plugins/comments/index.ejs @@ -0,0 +1,24 @@ +<% + var checkComment = true; + if (page.comments && page.comments == false) { + checkComment = false; + } +%> +<% if (checkComment&&(theme.comments.service && theme.comments.service.length > 0)) { %> + +
              + +

              <%- theme.comments && theme.comments.title %>

              + <% if (theme.comments && theme.comments.subtitle) { %> +

              <%- theme.comments.subtitle %>

              + <% } %> + +
              + +
              + +<% } else { %> + <% page.comments = false; %> +<% } %> diff --git a/themes/volantis/layout/_plugins/comments/isso/script.ejs b/themes/volantis/layout/_plugins/comments/isso/script.ejs new file mode 100755 index 0000000..b2c9b67 --- /dev/null +++ b/themes/volantis/layout/_plugins/comments/isso/script.ejs @@ -0,0 +1,26 @@ + diff --git a/themes/volantis/layout/_plugins/comments/livere/script.ejs b/themes/volantis/layout/_plugins/comments/livere/script.ejs new file mode 100755 index 0000000..56b7813 --- /dev/null +++ b/themes/volantis/layout/_plugins/comments/livere/script.ejs @@ -0,0 +1,15 @@ + + diff --git a/themes/volantis/layout/_plugins/comments/twikoo/script.ejs b/themes/volantis/layout/_plugins/comments/twikoo/script.ejs new file mode 100755 index 0000000..324b0aa --- /dev/null +++ b/themes/volantis/layout/_plugins/comments/twikoo/script.ejs @@ -0,0 +1,33 @@ + diff --git a/themes/volantis/layout/_plugins/comments/utterances/script.ejs b/themes/volantis/layout/_plugins/comments/utterances/script.ejs new file mode 100755 index 0000000..8c2e7ba --- /dev/null +++ b/themes/volantis/layout/_plugins/comments/utterances/script.ejs @@ -0,0 +1,42 @@ + diff --git a/themes/volantis/layout/_plugins/comments/vssue/script.ejs b/themes/volantis/layout/_plugins/comments/vssue/script.ejs new file mode 100755 index 0000000..e38ac9b --- /dev/null +++ b/themes/volantis/layout/_plugins/comments/vssue/script.ejs @@ -0,0 +1,37 @@ + + + + + diff --git a/themes/volantis/layout/_plugins/comments/waline/script.ejs b/themes/volantis/layout/_plugins/comments/waline/script.ejs new file mode 100755 index 0000000..610880d --- /dev/null +++ b/themes/volantis/layout/_plugins/comments/waline/script.ejs @@ -0,0 +1,64 @@ + diff --git a/themes/volantis/layout/_plugins/comments/z-custom/script.ejs b/themes/volantis/layout/_plugins/comments/z-custom/script.ejs new file mode 100755 index 0000000..7e1c424 --- /dev/null +++ b/themes/volantis/layout/_plugins/comments/z-custom/script.ejs @@ -0,0 +1 @@ + diff --git a/themes/volantis/layout/_plugins/content-visibility/script.ejs b/themes/volantis/layout/_plugins/content-visibility/script.ejs new file mode 100755 index 0000000..a972777 --- /dev/null +++ b/themes/volantis/layout/_plugins/content-visibility/script.ejs @@ -0,0 +1,87 @@ + diff --git a/themes/volantis/layout/_plugins/darkmode/script.ejs b/themes/volantis/layout/_plugins/darkmode/script.ejs new file mode 100755 index 0000000..26a717f --- /dev/null +++ b/themes/volantis/layout/_plugins/darkmode/script.ejs @@ -0,0 +1,113 @@ + diff --git a/themes/volantis/layout/_plugins/end-of-support/script.ejs b/themes/volantis/layout/_plugins/end-of-support/script.ejs new file mode 100755 index 0000000..d4b7ede --- /dev/null +++ b/themes/volantis/layout/_plugins/end-of-support/script.ejs @@ -0,0 +1,62 @@ +<% if (theme.plugins.killOldVersionsOfIE.enable) { %> + +<% } %> +<% if (theme.plugins.killNoScript.enable) { %> + +<% } %> diff --git a/themes/volantis/layout/_plugins/github-api/script.ejs b/themes/volantis/layout/_plugins/github-api/script.ejs new file mode 100755 index 0000000..b341b7e --- /dev/null +++ b/themes/volantis/layout/_plugins/github-api/script.ejs @@ -0,0 +1,23 @@ + diff --git a/themes/volantis/layout/_plugins/highlight/highlightjs/script.ejs b/themes/volantis/layout/_plugins/highlight/highlightjs/script.ejs new file mode 100755 index 0000000..ce97ed8 --- /dev/null +++ b/themes/volantis/layout/_plugins/highlight/highlightjs/script.ejs @@ -0,0 +1,20 @@ + \ No newline at end of file diff --git a/themes/volantis/layout/_plugins/highlight/prismjs/script.ejs b/themes/volantis/layout/_plugins/highlight/prismjs/script.ejs new file mode 100755 index 0000000..29c9120 --- /dev/null +++ b/themes/volantis/layout/_plugins/highlight/prismjs/script.ejs @@ -0,0 +1,24 @@ +<% getList(theme.plugins.prismjs.js).forEach(function(item) { %> + <%- js(item) %> +<% }) %> +<% getList(theme.plugins.prismjs.css).forEach(function(item) { %> + <%- css(item) %> +<% }) %> + \ No newline at end of file diff --git a/themes/volantis/layout/_plugins/highlight/script.ejs b/themes/volantis/layout/_plugins/highlight/script.ejs new file mode 100755 index 0000000..fec16aa --- /dev/null +++ b/themes/volantis/layout/_plugins/highlight/script.ejs @@ -0,0 +1 @@ +<%- partial(theme.plugins.code_highlight + '/script') %> diff --git a/themes/volantis/layout/_plugins/lazyload/script.ejs b/themes/volantis/layout/_plugins/lazyload/script.ejs new file mode 100755 index 0000000..0e1b996 --- /dev/null +++ b/themes/volantis/layout/_plugins/lazyload/script.ejs @@ -0,0 +1,22 @@ + + diff --git a/themes/volantis/layout/_plugins/nodewaves/script.ejs b/themes/volantis/layout/_plugins/nodewaves/script.ejs new file mode 100755 index 0000000..6f81e8c --- /dev/null +++ b/themes/volantis/layout/_plugins/nodewaves/script.ejs @@ -0,0 +1,12 @@ +<%- js({src: theme.cdn.nodewaves_js}) %> + \ No newline at end of file diff --git a/themes/volantis/layout/_plugins/pace/script.ejs b/themes/volantis/layout/_plugins/pace/script.ejs new file mode 100755 index 0000000..382063b --- /dev/null +++ b/themes/volantis/layout/_plugins/pace/script.ejs @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/themes/volantis/layout/_plugins/parallax/script.ejs b/themes/volantis/layout/_plugins/parallax/script.ejs new file mode 100755 index 0000000..a80152d --- /dev/null +++ b/themes/volantis/layout/_plugins/parallax/script.ejs @@ -0,0 +1,70 @@ +<%_ +theme.plugins.parallax.images = theme.plugins.parallax.images || page.images; +if (theme.plugins.parallax.shuffle) { + // shuffle 只一次 防止 hash 变化 + if (typeof theme.plugins.parallax.shuffle_end==='undefined') { + shuffle(theme.plugins.parallax.images); + theme.plugins.parallax.shuffle_end=1; + } +} +function shuffle(arr){ + var n = arr.length; + while(n--) { + var index = Math.floor(Math.random() * n); + var temp = arr[index]; + arr[index] = arr[n]; + arr[n] = temp; + } +} +_%> + diff --git a/themes/volantis/layout/_plugins/preload/script.ejs b/themes/volantis/layout/_plugins/preload/script.ejs new file mode 100755 index 0000000..0ea5602 --- /dev/null +++ b/themes/volantis/layout/_plugins/preload/script.ejs @@ -0,0 +1,14 @@ +<% let preload = theme.plugins.preload; %> +<% if (preload.service == 'instant_page') { %> + +<% } else if (preload.service == 'flying_pages') { %> + + +<% } %> diff --git a/themes/volantis/layout/_plugins/rightmenus/layout.ejs b/themes/volantis/layout/_plugins/rightmenus/layout.ejs new file mode 100755 index 0000000..fd89ca1 --- /dev/null +++ b/themes/volantis/layout/_plugins/rightmenus/layout.ejs @@ -0,0 +1,137 @@ +<% + const rightMenu = { + defaultEvent: ['copyText', 'copyLink', 'copyPaste', 'copyAll', 'copyCut', 'copyImg', 'printMode', 'readMode'], + defaultGroup: ['navigation', 'inputBox', 'seletctText', 'elementCheck', 'elementImage', 'articlePage'], + dataGet: (data, keyStr) => { + const keys = keyStr.split('.'); + let currentData = data; + for (const key of keys) { + currentData = currentData?.[key]; + } + return currentData; + }, + initMenu: () => { + theme.rightmenus.order.forEach(item => { + let data = rightMenu.dataGet(theme.rightmenus, item); + if(item.includes('navigation')) { + rightMenu.loadNavigation(data) + } else if (item === 'music') { + rightMenu.loadMusic() + } else { + if(Array.isArray(data)) { + data.forEach(item => { + rightMenu.loadMenu(item) + }) + } else { + rightMenu.loadMenu(data) + } + } + }) + }, + initFunction: () => { + theme.rightmenus.order.forEach(item => { + let data = rightMenu.dataGet(theme.rightmenus, item); + if(Array.isArray(data)) { + data.forEach(item => { + rightMenu.rederFunction(item) + }) + } else { + rightMenu.rederFunction(data) + } + }) + } + } +%> + +<% rightMenu.loadMenu = item => { %> +<% if(item === undefined) { %> + +<% } else if(item['id'] === undefined) { %> + +<% } else if(item['link'] === undefined) { %> +
            • +<% } else { %> + +<% } %> +<% } %> + + +<% rightMenu.loadNavigation = objs => { %> + +<% } %> + + +<% rightMenu.rederFunction = item => { %> +<% if (!!item && !!item['event'] && item['group'] !== 'navigation') { %> +<% if (rightMenu.defaultEvent.some(value => { return value === item['event'] })) { %> + //RightMenusFunction['<%- item.id %>'] = (fun) => {fun()} +<% } else if (item['group'] === 'seletctText') { %> + RightMenusFunction['<%- item.id %>'] = (__text__) => {<%- item.event %>} +<% } else if (item['group'] === 'elementCheck' || item['group'] === 'elementImage') { %> + RightMenusFunction['<%- item.id %>'] = (__link__) => {<%- item.event %>} +<% } else { %> + RightMenusFunction['<%- item.id %>'] = () => {<%- item.event %>} +<% } %> +<% } %> +<% } %> + + +<% rightMenu.loadMusic = () => { %> + +<% } %> + + +
              +
                + <% rightMenu.initMenu() %> +
              +
              + + diff --git a/themes/volantis/layout/_plugins/scrollreveal/script.ejs b/themes/volantis/layout/_plugins/scrollreveal/script.ejs new file mode 100755 index 0000000..ae58a7b --- /dev/null +++ b/themes/volantis/layout/_plugins/scrollreveal/script.ejs @@ -0,0 +1,20 @@ + diff --git a/themes/volantis/layout/_plugins/search/script.ejs b/themes/volantis/layout/_plugins/search/script.ejs new file mode 100755 index 0000000..f199a5b --- /dev/null +++ b/themes/volantis/layout/_plugins/search/script.ejs @@ -0,0 +1,53 @@ + \ No newline at end of file diff --git a/themes/volantis/layout/_plugins/share/layout.ejs b/themes/volantis/layout/_plugins/share/layout.ejs new file mode 100755 index 0000000..3980ede --- /dev/null +++ b/themes/volantis/layout/_plugins/share/layout.ejs @@ -0,0 +1,33 @@ + diff --git a/themes/volantis/layout/_plugins/slow-network/script.ejs b/themes/volantis/layout/_plugins/slow-network/script.ejs new file mode 100755 index 0000000..7917697 --- /dev/null +++ b/themes/volantis/layout/_plugins/slow-network/script.ejs @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/themes/volantis/layout/_plugins/swiper/script.ejs b/themes/volantis/layout/_plugins/swiper/script.ejs new file mode 100755 index 0000000..9cbc2a7 --- /dev/null +++ b/themes/volantis/layout/_plugins/swiper/script.ejs @@ -0,0 +1,29 @@ + \ No newline at end of file diff --git a/themes/volantis/layout/_plugins/tianligpt/script.ejs b/themes/volantis/layout/_plugins/tianligpt/script.ejs new file mode 100755 index 0000000..2f12566 --- /dev/null +++ b/themes/volantis/layout/_plugins/tianligpt/script.ejs @@ -0,0 +1,201 @@ +<% if (is_post()) { %> + + +<% } %> diff --git a/themes/volantis/layout/_plugins/toc/script.ejs b/themes/volantis/layout/_plugins/toc/script.ejs new file mode 100755 index 0000000..1853bf7 --- /dev/null +++ b/themes/volantis/layout/_plugins/toc/script.ejs @@ -0,0 +1,113 @@ + + diff --git a/themes/volantis/layout/_pre.ejs b/themes/volantis/layout/_pre.ejs new file mode 100755 index 0000000..991535e --- /dev/null +++ b/themes/volantis/layout/_pre.ejs @@ -0,0 +1,45 @@ +<%_ +if (page.cover == undefined && theme.cover) { + if (is_home() && page.prev == 0) { + page.cover = theme.cover.display.home; + } else if (is_archive()) { + page.cover = theme.cover.display.archive; + } else { + page.cover = theme.cover.display.others; + } +} +if (is_home() || is_category() || is_archive() || is_tag() || page.layout == 'list') { + if (page.sidebar == undefined) { + if (theme.sidebar.for_page.length == 0) { + page.sidebar = []; + } else { + page.sidebar = theme.sidebar.for_page; + } + } +} else { + if (page.sidebar == undefined) { + if (theme.sidebar.for_post.length == 0) { + page.sidebar = []; + } else { + page.sidebar = theme.sidebar.for_post; + } + } +} +if (page.sidebar == false) { + page.sidebar = []; +} + +if (config.theme_config && config.theme_config.style) { + let style = config.theme_config.style; + if (style.navbar && style.navbar.effect) { + theme.custom_css.navbar.effect = style.navbar.effect; + } + if (style.sidebar && style.sidebar.effect) { + theme.custom_css.sidebar.effect = style.sidebar.effect; + } + if (style.body && style.body.effect) { + theme.custom_css.body.effect = style.body.effect; + } +} + +_%> diff --git a/themes/volantis/layout/_widget/_pre.ejs b/themes/volantis/layout/_widget/_pre.ejs new file mode 100755 index 0000000..110ee60 --- /dev/null +++ b/themes/volantis/layout/_widget/_pre.ejs @@ -0,0 +1,16 @@ +<% +var pf = []; +if (item.display) { + getList(item.display).forEach(function(p){ + pf.push(p); + }); +} else { + pf = ['desktop', 'mobile']; +} +if (where == 'sidebar') { + page.widget_style += theme.custom_css.sidebar.effect.join(' '); +} else if (where == 'body') { + page.widget_style += theme.custom_css.body.effect.join(' '); +} +page.widget_platform = pf.join(' '); +%> \ No newline at end of file diff --git a/themes/volantis/layout/_widget/blogger.ejs b/themes/volantis/layout/_widget/blogger.ejs new file mode 100755 index 0000000..7057062 --- /dev/null +++ b/themes/volantis/layout/_widget/blogger.ejs @@ -0,0 +1,48 @@ +<%- partial('_pre') %> +
              +
              + <% if (item.avatar) { %> + <% if (item.url) { %> + + + + <% } else { %> +
              + +
              + <% } %> + <% } %> + <% if (item.title || item.subtitle || item.jinrishici) { %> +
              + <% if (item.title){ %> +

              <%- item.title %>

              + <% } %> + <% if (item.subtitle){ %> + <%- markdown(item.subtitle) %> + <% } %> + <% if (item.jinrishici){ %> +

              <%- item.jinrishici != true ? item.jinrishici : config.title %>

              + + <% } %> +
              + <% } %> + <% if (item.social && item.social.length > 0) { %> + + <% } %> +
              +
              diff --git a/themes/volantis/layout/_widget/category.ejs b/themes/volantis/layout/_widget/category.ejs new file mode 100755 index 0000000..1500588 --- /dev/null +++ b/themes/volantis/layout/_widget/category.ejs @@ -0,0 +1,16 @@ +<% if (site.categories.length){ %> + <%- partial('_pre') %> +
              + <%- partial('header', {item: item}) %> +
              + +
              +
              +<% } %> diff --git a/themes/volantis/layout/_widget/copyright.ejs b/themes/volantis/layout/_widget/copyright.ejs new file mode 100755 index 0000000..d3728a2 --- /dev/null +++ b/themes/volantis/layout/_widget/copyright.ejs @@ -0,0 +1,24 @@ +<%- partial('_pre') %> +
              +
              + <% if (item.blockquote == true) { %> +
              + <% getList(item.content).forEach(function(row){ %> + <% if (row == 'permalink') { %> +

              <%- item.permalink %>><%- page.permalink %>

              + <% } else { %> + <%- markdown(row) %> + <% } %> + <% }) %> +
              + <% } else { %> + <% getList(item.content).forEach(function(row){ %> + <% if (row == 'permalink') { %> +

              <%- item.permalink %>><%- page.permalink %>

              + <% } else { %> + <%- markdown(row) %> + <% } %> + <% }) %> + <% } %> +
              +
              diff --git a/themes/volantis/layout/_widget/grid.ejs b/themes/volantis/layout/_widget/grid.ejs new file mode 100755 index 0000000..e53de37 --- /dev/null +++ b/themes/volantis/layout/_widget/grid.ejs @@ -0,0 +1,27 @@ +<%- partial('_pre') %> +
              + <%- partial('header', {item: item}) %> + +
              diff --git a/themes/volantis/layout/_widget/group.ejs b/themes/volantis/layout/_widget/group.ejs new file mode 100755 index 0000000..3bd266a --- /dev/null +++ b/themes/volantis/layout/_widget/group.ejs @@ -0,0 +1,27 @@ +<% +if (page.layout == 'page' || page.layout == 'docs' || page.layout == 'post') { + var rows = new Array(); + site.posts.each(function(p){ + if (p.path && (p.group == item.id)) { + if ((p.short_title != false || (p.short_title == undefined && p.title))) { + rows.push({name: p.short_title || p.title, url: p.path, order: (p.order || 0)}) + } + } + }) + site.pages.each(function(p){ + if (p.path && (p.group == item.id)) { + if ((p.short_title != false || (p.short_title == undefined && p.title))) { + rows.push({name: p.short_title || p.title, url: p.path, order: (p.order || 0)}) + } + } + }) + rows.sort(function(a,b){ + return a.order - b.order; + }); + item.rows = rows; +} +%> + +<% if (item.rows && item.rows.length > 0) { %> + <%- partial('list', {item: item, where: where}) %> +<% } %> diff --git a/themes/volantis/layout/_widget/header.ejs b/themes/volantis/layout/_widget/header.ejs new file mode 100755 index 0000000..a39942a --- /dev/null +++ b/themes/volantis/layout/_widget/header.ejs @@ -0,0 +1,9 @@ +<% if (item.header) { %> +
              + <% if (item.header.url) { %> + <%- item.header.title %> + <% } else { %> + <%- item.header.title %> + <% } %> +
              +<% } %> diff --git a/themes/volantis/layout/_widget/lastupdate.ejs b/themes/volantis/layout/_widget/lastupdate.ejs new file mode 100755 index 0000000..f4a7776 --- /dev/null +++ b/themes/volantis/layout/_widget/lastupdate.ejs @@ -0,0 +1,27 @@ +<% +function genList() { + let content = ''; + site.posts.filter(p => { + return p.title && p.title.length > 0; + }).sort("updated", -1).limit(5).each(item => { + content += `
            • `; + content += '
              '; + content += ``; + item.categories.limit(1).forEach((cat, i) => { + content += `${cat.name}`; + }); + content += '
              '; + content += `${item.title}`; + content += '
            • '; + content += ''; + }) + return `
                ${content}
              `; +} +%> +<%- partial('_pre') %> +
              + <%- partial('header', {item: item}) %> +
              + <%- genList() %> +
              +
              diff --git a/themes/volantis/layout/_widget/list.ejs b/themes/volantis/layout/_widget/list.ejs new file mode 100755 index 0000000..86f7826 --- /dev/null +++ b/themes/volantis/layout/_widget/list.ejs @@ -0,0 +1,33 @@ +<%- partial('_pre') %> +
              + <%- partial('header', {item: item}) %> + +
              diff --git a/themes/volantis/layout/_widget/load.ejs b/themes/volantis/layout/_widget/load.ejs new file mode 100755 index 0000000..a691cc8 --- /dev/null +++ b/themes/volantis/layout/_widget/load.ejs @@ -0,0 +1,21 @@ +<% + let widget_library_temp = []; +%> +<% getList(widgets).forEach(function(widget){ %> + <% if (theme.sidebar.widget_library && (widget in theme.sidebar.widget_library)){ %> + <% let w = theme.sidebar.widget_library[widget]; w.id = widget; %> + <% if(w.sticky) { %> + <% widget_library_temp.push(w) %> + <% } else { %> + <%- partial(w.class, {item: w, where: where}) %> + <% } %> + <% } %> +<% }) %> + +
              +<% if(widget_library_temp.length !== 0) { %> + <% widget_library_temp.forEach( w => { %> + <%- partial(w.class, {item: w, where: where}) %> + <% }) %> +<% } %> +
              diff --git a/themes/volantis/layout/_widget/memos_carousel.ejs b/themes/volantis/layout/_widget/memos_carousel.ejs new file mode 100755 index 0000000..1c79ce5 --- /dev/null +++ b/themes/volantis/layout/_widget/memos_carousel.ejs @@ -0,0 +1,22 @@ +<%- partial('_pre') %> +
              + <%- partial('header', {item: item}) %> +
              +
              +
                <%- item.placeholder %>
              +
              +
              + + +
              diff --git a/themes/volantis/layout/_widget/music.ejs b/themes/volantis/layout/_widget/music.ejs new file mode 100755 index 0000000..c9c53e2 --- /dev/null +++ b/themes/volantis/layout/_widget/music.ejs @@ -0,0 +1,9 @@ +<%- partial('_pre') %> +<% if (theme.plugins.aplayer.enable == true) { %> +
              + <%- partial('header', {item: item}) %> +
              + <%- partial('../_plugins/aplayer/layout', {post: null, where: 'widget'}) %> +
              +
              +<% } %> diff --git a/themes/volantis/layout/_widget/page.ejs b/themes/volantis/layout/_widget/page.ejs new file mode 100755 index 0000000..36ba0d7 --- /dev/null +++ b/themes/volantis/layout/_widget/page.ejs @@ -0,0 +1,32 @@ +<%- partial('_pre') %> +
              + <%- partial('header', {item: item}) %> +
              + <% site.pages.forEach(function(post){ %> + <% if (post.pid == item.pid) { %> +
              +
              +
              + <% if (item.content in post) { %> + <%- post[item.content] %> + <% } %> +
              +
              +
              + <% } %> + <% }) %> + <% site.posts.forEach(function(post){ %> + <% if (post.pid == item.pid) { %> +
              +
              +
              + <% if (item.content in post) { %> + <%- post[item.content] %> + <% } %> +
              +
              +
              + <% } %> + <% }) %> +
              +
              diff --git a/themes/volantis/layout/_widget/qrcode.ejs b/themes/volantis/layout/_widget/qrcode.ejs new file mode 100755 index 0000000..9f90eea --- /dev/null +++ b/themes/volantis/layout/_widget/qrcode.ejs @@ -0,0 +1,12 @@ +<%- partial('_pre') %> +
              + <%- partial('header', {item: item}) %> +
              + <% getList(item.images).forEach(function(url){ %> + + height='<%- item.height %>' + <% } %>/> + <% }) %> +
              +
              diff --git a/themes/volantis/layout/_widget/references.ejs b/themes/volantis/layout/_widget/references.ejs new file mode 100755 index 0000000..01d160c --- /dev/null +++ b/themes/volantis/layout/_widget/references.ejs @@ -0,0 +1,18 @@ +<% +if (item.rows == undefined) { + item.rows = new Array(); + var itms = new Array(); + let id = item.id || 'references'; + if (id in page) { + getList(page[id]).forEach(function(ref) { + if (ref.name || ref.url) { + item.rows.push(ref); + } + }) + } +} +%> + +<% if (item.rows && item.rows.length > 0) { %> + <%- partial('list', {item: item, where: where}) %> +<% } %> diff --git a/themes/volantis/layout/_widget/related_posts.ejs b/themes/volantis/layout/_widget/related_posts.ejs new file mode 100755 index 0000000..09948d8 --- /dev/null +++ b/themes/volantis/layout/_widget/related_posts.ejs @@ -0,0 +1,9 @@ +<% if(page.layout == 'post' && page.content && page.path != undefined){ %> + <%- partial('_pre') %> +
              + <%- partial('header', {item: item}) %> +
              + <%- popular_posts( { maxCount: item.max_count , ulClass: 'popular-posts' , PPMixingRate: 0.2 } , page ) %> +
              +
              +<% } %> diff --git a/themes/volantis/layout/_widget/tagcloud.ejs b/themes/volantis/layout/_widget/tagcloud.ejs new file mode 100755 index 0000000..4f5eb0a --- /dev/null +++ b/themes/volantis/layout/_widget/tagcloud.ejs @@ -0,0 +1,15 @@ +<% if (site.tags.length){ %> + <%- partial('_pre') %> +
              + <%- partial('header', {item: item}) %> +
              + <%- tagcloud(site.tags, { + min_font: item.min_font, + max_font: item.max_font, + color: item.color, + start_color: item.start_color, + end_color: item.end_color, + }) %> +
              +
              +<% } %> diff --git a/themes/volantis/layout/_widget/text.ejs b/themes/volantis/layout/_widget/text.ejs new file mode 100755 index 0000000..4b72f35 --- /dev/null +++ b/themes/volantis/layout/_widget/text.ejs @@ -0,0 +1,9 @@ +<%- partial('_pre') %> +
              + <%- partial('header', {item: item}) %> +
              + <% getList(item.content).forEach(function(row){ %> + <%- markdown(row) %> + <% }) %> +
              +
              diff --git a/themes/volantis/layout/_widget/toc.ejs b/themes/volantis/layout/_widget/toc.ejs new file mode 100755 index 0000000..ab7af47 --- /dev/null +++ b/themes/volantis/layout/_widget/toc.ejs @@ -0,0 +1,9 @@ +<%- partial('_pre') %> +<% var realcontent = (page.encrypt == true) ? page.origin : page.content; %> + +
              style="display:none" <% } %>> + <%- partial('header', {item: item}) %> +
              + <%- toc(realcontent, {list_number: item.list_number, min_depth: item.min_depth, max_depth: item.max_depth}) %> +
              +
              diff --git a/themes/volantis/layout/_widget/webinfo.ejs b/themes/volantis/layout/_widget/webinfo.ejs new file mode 100755 index 0000000..4ec84ed --- /dev/null +++ b/themes/volantis/layout/_widget/webinfo.ejs @@ -0,0 +1,57 @@ +<%- partial('_pre') %> +
              + <%- partial('header', {item: item}) %> +
              +
              + <% if (item.type.article.enable) { %> +
              +
              <%= item.type.article.text %>
              +
              <%= site.posts.length %> <%= item.type.article.unit %>
              +
              + <% } %> + + <% if (item.type.runtime.enable) { %> +
              +
              <%= item.type.runtime.text %>
              +
              +
              + <% } %> + + + <% if (item.type.wordcount.enable && theme.plugins.wordcount.enable) { %> +
              +
              <%= item.type.wordcount.text %>
              +
              <%= totalcount(site) %> <%= item.type.wordcount.unit %>
              +
              + <% } %> + + <% if (item.type.visitcounter.enable && theme.plugins.busuanzi.enable) { %> +
              +
              <%= item.type.visitcounter.siteuv.text %>
              +
              + + + + <%= item.type.visitcounter.siteuv.unit %> +
              +
              +
              +
              <%= item.type.visitcounter.sitepv.text %>
              +
              + + + + <%= item.type.visitcounter.sitepv.unit %> +
              +
              + <% } %> + + <% if (item.type.lastupd.enable) { %> +
              +
              <%= item.type.lastupd.text %>
              +
              <%- date(Date.now()) %> <%= item.type.lastupd.unit %>
              +
              + <% } %> +
              +
              +
              diff --git a/themes/volantis/layout/archive.ejs b/themes/volantis/layout/archive.ejs new file mode 100755 index 0000000..cc3e86d --- /dev/null +++ b/themes/volantis/layout/archive.ejs @@ -0,0 +1,39 @@ +<%- partial('_pre') %> +
              '> + <% if (page.year || page.month) { %> + <%- partial('_partial/archive') %> + <% } else { %> +
              + <% var year = -1, postid = -1; %> + <% site.posts.sort('date', -1).each(function(post) { %> + <% post.year = date(post.date, 'YYYY'); %> + <% if (post.archive == undefined || post.archive == true) { %> + <% if (post.year && post.year !== year) { %> + <% year = post.year; %> +

              <%= year %>

              + <% } %> + + <% } %> + <% }); %> +
              + <% } %> +
              +<%- partial('_partial/side') %> diff --git a/themes/volantis/layout/category.ejs b/themes/volantis/layout/category.ejs new file mode 100755 index 0000000..b3b2a01 --- /dev/null +++ b/themes/volantis/layout/category.ejs @@ -0,0 +1,35 @@ +<%- partial('_pre') %> +<% +page.comments = false; +if (!page.robots) { + page.robots = 'noindex,follow'; +} +%> +
              '> + <% if (site.posts && site.posts.length > 0) { %> + <% if ((page.layout == 'category')||(page.layout == 'categories') ) { %> +
              + +
              + <% } else { %> + <%- partial('_partial/archive') %> + <% } %> + <% } %> +
              +<%- partial('_partial/side') %> diff --git a/themes/volantis/layout/docs.ejs b/themes/volantis/layout/docs.ejs new file mode 100755 index 0000000..ea134fa --- /dev/null +++ b/themes/volantis/layout/docs.ejs @@ -0,0 +1,6 @@ +<%- partial('_pre') %> +
              '> + <%- partial('_partial/article', {post: page, index: false}) %> +
              +<%- partial('_partial/side') %> + diff --git a/themes/volantis/layout/friends.ejs b/themes/volantis/layout/friends.ejs new file mode 100755 index 0000000..bedb006 --- /dev/null +++ b/themes/volantis/layout/friends.ejs @@ -0,0 +1,69 @@ +<%- partial('_pre') %> +
              '> +
              + <%- partial('_partial/meta',{post: page, position: 'top'}) %> + <%- page.excerpt %> + <% if (site.data.friends){ %> + <% getList(site.data.friends).forEach((group, i) => { %> +
              +
              +

              + <%- group.group %> +

              + <% if (group.description) { %> + <%- markdown(group.description) %> + <%} %> + <% if (theme.pages.friends.layout_scheme == 'traditional') { %> + + <% } else { %> +
              + <% getList(group.items).forEach(function(item){ %> + <% if (item.url && item.title) { %> + + + <%- item.title %> + + <% } %> + <% }) %> +
              + <% } %> +
              + <% }) %> + <% } %> +

              + <%- page.more %> + <%- partial('_partial/meta',{post: page, position: 'bottom'}) %> +
              + <% if (page.comments == undefined || page.comments != false) { %> + <%- partial('_plugins/comments/index',{post: page}) %> + <% } %> +
              +<%- partial('_partial/side') %> diff --git a/themes/volantis/layout/index.ejs b/themes/volantis/layout/index.ejs new file mode 100755 index 0000000..c10fca0 --- /dev/null +++ b/themes/volantis/layout/index.ejs @@ -0,0 +1,6 @@ +<%- partial('_pre') %> +
              '> + <%- partial('_partial/archive') %> +
              +<%- partial('_partial/side') %> + diff --git a/themes/volantis/layout/layout.ejs b/themes/volantis/layout/layout.ejs new file mode 100755 index 0000000..fd14e45 --- /dev/null +++ b/themes/volantis/layout/layout.ejs @@ -0,0 +1,44 @@ + + + <%- partial('_partial/scripts/_ctrl') _%> + <%- partial('_partial/head') _%> + + + <%_ if (config.import && config.import.body_begin){ _%> + <%_ getList(config.import.body_begin).forEach(function(item){ _%> + <%- item %> + <%_ }) _%> + <%_ } _%> + + + <%- volantis_inject('bodyBegin') %> + + <%- partial('_partial/header', null, {cache: false, path: path}) %> +
              + <%- partial('_partial/cover') %> +
              +
              + <%- body %> +
              + <%- partial('_partial/footer', null, {cache: !config.relative_link}) %> + +
              +
              +
              + <%- partial('_partial/scripts/index') %> +
              + + <%_ if (config.import && config.import.body_end){ _%> + <%_ getList(config.import.body_end).forEach(function(item){ _%> + <%- item %> + <%_ }) _%> + <%_ } _%> + + + <%- volantis_inject('bodyEnd') %> + + + + diff --git a/themes/volantis/layout/list.ejs b/themes/volantis/layout/list.ejs new file mode 100755 index 0000000..ab0b07d --- /dev/null +++ b/themes/volantis/layout/list.ejs @@ -0,0 +1,23 @@ +<%- partial('_pre') %> +<% page.comments = false; %> +
              '> + <% if (site.pages && site.pages.length > 0) { %> +
              + <% site.pages.sort("-date").each(function(post){ %> + <% if (post.group && post.group == page.group && post.layout != 'list') { %> +
              + <%- partial('_partial/post', {post: post, index: false}) %> +
              + <% } %> + <% }) %> + <% site.posts.sort("-date").each(function(post){ %> + <% if (post.group && post.group == page.group && post.layout != 'list') { %> +
              + <%- partial('_partial/post', {post: post, index: false}) %> +
              + <% } %> + <% }) %> +
              + <% } %> +
              +<%- partial('_partial/side') %> diff --git a/themes/volantis/layout/page.ejs b/themes/volantis/layout/page.ejs new file mode 100755 index 0000000..ea134fa --- /dev/null +++ b/themes/volantis/layout/page.ejs @@ -0,0 +1,6 @@ +<%- partial('_pre') %> +
              '> + <%- partial('_partial/article', {post: page, index: false}) %> +
              +<%- partial('_partial/side') %> + diff --git a/themes/volantis/layout/post.ejs b/themes/volantis/layout/post.ejs new file mode 100755 index 0000000..ea134fa --- /dev/null +++ b/themes/volantis/layout/post.ejs @@ -0,0 +1,6 @@ +<%- partial('_pre') %> +
              '> + <%- partial('_partial/article', {post: page, index: false}) %> +
              +<%- partial('_partial/side') %> + diff --git a/themes/volantis/layout/tag.ejs b/themes/volantis/layout/tag.ejs new file mode 100755 index 0000000..fb94a69 --- /dev/null +++ b/themes/volantis/layout/tag.ejs @@ -0,0 +1,27 @@ +<%- partial('_pre') %> +<% +page.comments = false; +if (!page.robots) { + page.robots = 'noindex,follow'; +} +%> +
              '> + <% if (site.posts && site.posts.length > 0) { %> + <% if ((page.layout == 'tag')||(page.layout == 'tags')) { %> +
              +
              +

              <%- page.title %>

              +
              + <% let tc = theme.sidebar.widget_library.tagcloud; %> + <%- list_tags({}) %> +
              +
              + <%- page.content %> +
              +
              + <% } else { %> + <%- partial('_partial/archive') %> + <% } %> + <% } %> +
              +<%- partial('_partial/side') %> diff --git a/themes/volantis/package.json b/themes/volantis/package.json new file mode 100755 index 0000000..3b90dc8 --- /dev/null +++ b/themes/volantis/package.json @@ -0,0 +1,30 @@ +{ + "name": "hexo-theme-volantis", + "version": "6.0.0-alpha.1", + "description": "Elegant and powerful theme for Hexo.", + "main": "package.json", + "scripts": { + "test": "echo test" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/volantis-x/hexo-theme-volantis.git" + }, + "keywords": [ + "hexo", + "theme", + "volantis" + ], + "author": "Volantis X (https://github.com/volantis-x/)", + "license": "MIT", + "bugs": { + "url": "https://github.com/volantis-x/hexo-theme-volantis/issues" + }, + "homepage": "https://volantis.js.org", + "dependencies": { + "hexo": "^7.0.0", + "hexo-renderer-stylus": "^3.0.0", + "hexo-renderer-ejs": "^2.0.0", + "hexo-generator-json-content": "^4.2.3" + } +} diff --git a/themes/volantis/scripts/events/index.js b/themes/volantis/scripts/events/index.js new file mode 100755 index 0000000..16067b0 --- /dev/null +++ b/themes/volantis/scripts/events/index.js @@ -0,0 +1,23 @@ +/* global hexo */ + +'use strict'; + +hexo.on('generateBefore', () => { + // Merge config. + require('./lib/config')(hexo); + require('./lib/stellar-tag-utils')(hexo); + require('./lib/render-stylus')(hexo); + if (hexo.theme.config.debug === "env") { + require('./lib/check-environment')(hexo); + } +}); + +hexo.on('ready', () => { + const { version } = require('../../package.json'); + hexo.log.info(` +============================================================ + Volantis ${version} + Docs: https://volantis.js.org/ + Repo: https://github.com/volantis-x/hexo-theme-volantis/ +============================================================`); +}); diff --git a/themes/volantis/scripts/events/lib/cdn.js b/themes/volantis/scripts/events/lib/cdn.js new file mode 100755 index 0000000..7098028 --- /dev/null +++ b/themes/volantis/scripts/events/lib/cdn.js @@ -0,0 +1,206 @@ +/* Getting the version of the theme. */ +const { version } = require('../../../package.json'); +const theme_version = version; +const path = require('path') +const site_root = hexo.config.root; +// _cdn.yml +/* It's reading the `_cdn.yml` file in the theme directory. */ +const cdn_info = hexo.render.renderSync({ path: path.join(hexo.theme_dir, '/_cdn.yml'), engine: 'yaml' }) + +/** + * If the item is an object and not an array, then it's an object. + * @param item - The item to test. + */ +function isObject(item) { + return item && typeof item === 'object' && !Array.isArray(item); +} + +/** + * It takes two objects and merges the second object into the first object + * @param target - The object that will be modified. + * @param source - The object to merge into the target. + * @returns The merged object. + */ +function merge(target, source) { + for (const key in source) { + if (isObject(target[key]) && isObject(source[key])) { + merge(target[key], source[key]); + } else { + target[key] = source[key]; + } + } + return target; +} + +// volantis_cdn_system_prefix +// 在本配置文件中 匹配以 "volantis-local/npm/static/cdnjs" 开头的链接路径替换为该格式的前缀开头 prefix +/** + * It will replace the prefix of the source with the prefix you set in the configuration file + * @param source - the source object to be processed + * @param hexo - The hexo object. + */ +function volantis_cdn_system_prefix(source, hexo) { + const prefix_list = ["local", "npm", "static", "cdnjs"]; + for (const key in source) { + if (isObject(source[key])) { + volantis_cdn_system_prefix(source[key], hexo); + } else if (source[key] && typeof source[key] == "string") { + for (const prefix of prefix_list) { + if (source[key].match(new RegExp(`^volantis-${prefix}\/`, "g"))) { + const my_prefix = hexo.theme.config.cdn_system.system_config[prefix].prefix.replace(/\$\{site_root\}/g, site_root) + source[key] = my_prefix + source[key].replace(new RegExp(`^volantis-${prefix}`, "g"), "") + break; + } + } + } else if (source[key] && Array.isArray(source[key]) && source[key].length > 0) { + source[key].forEach((item, index) => { + if (item && typeof item == "string") { + for (const prefix of prefix_list) { + if (item.match(new RegExp(`^volantis-${prefix}\/`, "g"))) { + const my_prefix = hexo.theme.config.cdn_system.system_config[prefix].prefix.replace(/\$\{site_root\}/g, site_root) + source[key][index] = my_prefix + item.replace(new RegExp(`^volantis-${prefix}`, "g"), "") + break; + } + } + } else if (isObject(item)) { + volantis_cdn_system_prefix(item, hexo); + } + }) + } + } +} + +/** + * It takes a file name and returns the same file name with the extension replaced with `.min` if the + * file name doesn't already end with `.min` + * @param file - The file name to be minified. + * @returns The file name with the extension replaced with .min.ext + */ +const minFile = (file) => { + return file.replace(/(? '.min' + ext) +} + +// 匹配 CDN 资源 +/** + * `match_cdn_source` is a function that takes a key as an argument and returns the CDN source of the + * corresponding key. + * + * The function first checks if the key is valid and if the corresponding CDN source exists. If so, it + * will then check the priority of the CDN source. If the priority is `custom`, it will check if the + * custom CDN source exists. If the priority is not `custom`, it will check if the corresponding CDN + * source is enabled. If so, it will then return the CDN source. + * + * The `format` variable is the format of the CDN source. The `value` variable is the value of the CDN + * source. The `value` variable is a JavaScript object that contains the following properties: + * + * - `version`: the version of the CDN source + * - `name`: the name of the CDN source + * - + * @param key - The name of the library in the _cdn.yml file. + * @returns The return value is a string. + */ +function match_cdn_source(key) { + if (key && cdn_info[key]) { + // _cdn.yml item + const info = cdn_info[key]; + const system_config = hexo.theme.config.cdn_system.system_config; + for (const iterator of hexo.theme.config.cdn_system.priority) { + // priority item + if (iterator === "custom") { + if (system_config.custom) { + const r = system_config.custom[key]; + if (r) { + return r; + } + } + } else { + if (info[iterator] === true) { + const prefix = system_config[iterator].prefix?.replace(/\$\{site_root\}/g, site_root); + const format = system_config[iterator].format; + let name = info.name; + let file = info.file; + if (iterator === "cdnjs") { + if (info.cdnjs_name) { + name = info.cdnjs_name; + } + if (info.cdnjs_file) { + file = info.cdnjs_file; + } else { + file = file.replace(/^[lib|dist]*\/|browser\//g, ''); + } + } + if (info.local === true) { + file = file.replace(/^source\//g, '') + } + let min_file = minFile(file) + if (iterator === "cdnjs") { + if (info.cdnjs_no_min_file) { + min_file = file; + } + } + let version = info.version; + if (info.local === true) { + version = theme_version + } + const timestamp = hexo.theme.config.getStartTime; + const value = { + version, + name, + file, + min_file, + prefix, + timestamp, + } + let res = format; + let p = 0; + while (/\$\{(.+?)\}/g.test(res)) { + res = res?.replace(/\$\{(.+?)\}/g, (match, $1) => value[$1] ? value[$1] : eval($1)) || null + // 防止死循环。。。 + p++; + if (p > 20) { + break; + } + } + return res + } + } + } + } + return null; +} + +// 收集 CDN 资源 +/** + * `hexo.theme.config.cdn` is an object that contains the CDN source for each library. + * + * The `cdn_info` object is defined in the `_cdn.yml` file. It contains the name of the library, the + * version, and the CDN source etc. + * + * The `match_cdn_source` function returns the CDN source for + * the library. + * + * The `collect_cdn_source` function is called in the `_cdn.yml` file. It loops through the + * `cdn_info` object and adds the CDN source for each library to the `hexo.theme.config.cdn` object. + * + * The `hexo.theme.config.debug` variable is defined in the `_config.yml` file. It is set to `true` + */ +function collect_cdn_source() { + hexo.theme.config.cdn = {} + Object.keys(cdn_info).forEach(e => { + hexo.theme.config.cdn[e] = match_cdn_source(e) + }) + if (hexo.theme.config.debug == "cdn") + console.log(hexo.theme.config.cdn); +} + +hexo.on('generateBefore', () => { + /* It's replacing the prefix of the source with the prefix you set in the configuration file. */ + volantis_cdn_system_prefix(hexo.theme.config, hexo); + // 可以在 source/_data/cdn.yml 覆盖 theme/_cdn.yml + const data = hexo.locals.get('data'); + if (data.cdn) { + merge(cdn_info, data.cdn); + } + /* Collecting the CDN source for each library. */ + collect_cdn_source(); +}); diff --git a/themes/volantis/scripts/events/lib/check-configuration.js b/themes/volantis/scripts/events/lib/check-configuration.js new file mode 100755 index 0000000..be0e37b --- /dev/null +++ b/themes/volantis/scripts/events/lib/check-configuration.js @@ -0,0 +1,47 @@ +module.exports =(hexo) => { + try { + let config = hexo.config; + let themeConfig = hexo.theme.config; + if (!config.title) { + config.title = `Volantis` + hexo.log.warn(`title 未配置! +请在站点配置 _config.yml 中配置 title +see: https://hexo.io/zh-cn/docs/configuration +title is not configured!`) + } + if (!config.description) { + config.description = `Volantis 是一个功能丰富、高度模块化的 Hexo 博客主题。得益于其强大的模块化特性,您可以轻松搭建一个极简风格的博客,也可以仿照官网搭建一个多人协作的、包含文档模块的大体量综合型博客。` + hexo.log.warn(`description 未配置! +请在站点配置 _config.yml 中配置 description +description主要用于SEO,告诉搜索引擎一个关于您站点的简单描述,通常建议在其中包含您网站的关键词。 +see: https://hexo.io/zh-cn/docs/configuration +description is not configured!`); + } + if (themeConfig?.search?.service===`google`||themeConfig?.search?.service===`azure`||themeConfig?.search?.service===`baidu`) { + return `原 google, azure, baidu 站内搜索 系祖传代码, 且文档丢失, 不便后续维护 在 5.0 版本被移除 +The google, azure, baidu site search is ancestral code, and the document is lost, which is inconvenient for subsequent maintenance. It was removed in version 5.0 +see: https://volantis.js.org/v5/theme-settings/#站内搜索` + } + if (`backstretch` in themeConfig?.plugins) { + return `jquery.backstretch 在 5.0 版本被移除, 被 parallax 替代 +jquery.backstretch was removed in version 5.0, replaced by parallax +see: https://volantis.js.org/v5/theme-settings/#幻灯片背景-视差滚动效果` + } + if ("valinecount" in themeConfig?.article?.body?.top_meta||"valinecount" in themeConfig?.article?.body?.bottom_meta||"valinecount" in themeConfig?.article?.body?.meta_library) { + return `ValineCount 在 5.0 版本被移除 +ValineCount has been removed in version 5.0 +see: https://volantis.js.org/v5/theme-settings/#文章布局配置` + } + if (themeConfig?.comments?.service=="valine"||themeConfig?.comments?.service=="minivaline") { + return `Valine 在 5.0 版本被移除 +Valine has been removed in version 5.0 +see: https://volantis.js.org/v5/theme-settings/#选择评论系统` + } + if (config?.highlight?.hljs) { + return `主题不兼容 hljs ,请在 config.highlight.hljs 处修改为 false 关闭。` + } + } catch (error) {} + hexo.log.info(`Check environment configuration success!`); + return true; +}; + diff --git a/themes/volantis/scripts/events/lib/check-environment.js b/themes/volantis/scripts/events/lib/check-environment.js new file mode 100755 index 0000000..ddb24f9 --- /dev/null +++ b/themes/volantis/scripts/events/lib/check-environment.js @@ -0,0 +1,80 @@ +// 环境配置检查可以避免一些奇葩的报错 + +const exec = require('child_process').exec; +module.exports =(hexo) => { + if (!hexo.checkEnvironment) { + hexo.checkEnvironment=1; + hexo.log.info(`Checking environment configuration...`); + + // Checking environment + exec('node -v', (err, stdout, stderr) => { + if (err) { + CheckError(hexo,`node.js: ${err}`); + } + let nodeVersion = stdout.match(/v(\d*)/)[1]; + if (nodeVersion<16) { + hexo.log.info(`node.js 版本:${stdout}`); + CheckError(hexo,`node.js 版本过低,请升级至 v16.x 及以上版本!`); + }else{ + exec('hexo -v', (err, stdout, stderr) => { + if (err) { + CheckError(hexo,`hexo-cli: ${err}`); + } + let hexoVersion1 = stdout.match(/hexo:\s*(\d*)/)[1]; + let hexoVersion2 = stdout.match(/hexo:\s*\d*\.(\d*)/)[1]; + if (hexoVersion1<5 || (hexoVersion1==5 && hexoVersion2<4)) { + hexo.log.info(`hexo 版本:${stdout}`); + CheckError(hexo,`hexo 版本过低,请升级至 5.4 以上版本!`); + }else{ + let hexoClVersion1 = stdout.match(/hexo-cli:\s*(\d*)/)[1]; + let hexoClVersion2 = stdout.match(/hexo-cli:\s*\d*\.(\d*)/)[1]; + if (hexoClVersion1<4 || (hexoClVersion1==4 && hexoClVersion2<1)) { + hexo.log.info(`hexo-cli 版本:${stdout}`); + CheckError(hexo,`hexo-cli 版本过低,请升级至 4.1 以上版本!`); + }else{ + // Checking configuration + let checkConfiguration = require('./check-configuration')(hexo); + if (checkConfiguration!==true) { + CheckConfError(hexo,checkConfiguration); + } + } + } + }); + } + }); + } +}; + +function CheckError(hexo,msg) { + hexo.log.error(` +============================================================ +环境配置检查失败!| Environment configuration check failed! +============================================================ +${msg} +============================================================ +推荐的配置: +Hexo: 5.4 ~ 6.x +hexo-cli: 4.3 ~ latest +node.js: 16.x LTS ~ latest LTS +npm: 8.x ~ latest LTS +============================================================ +# 当前 Debug 调试模式 +debug: env +关闭调试模式主题配置文件设置 debug: false +============================================================`); + throw new Error('环境配置检查失败!| Environment configuration check failed!'); +} + +function CheckConfError(hexo,msg) { + hexo.log.error(` +============================================================ +配置文件检查失败!| Configuration check failed! +============================================================ +${msg} +============================================================ +# 当前 Debug 调试模式 +debug: env +关闭调试模式主题配置文件设置 debug: false +============================================================`); + throw new Error('配置文件检查失败!| Configuration check failed!'); +} diff --git a/themes/volantis/scripts/events/lib/config.js b/themes/volantis/scripts/events/lib/config.js new file mode 100755 index 0000000..4964c75 --- /dev/null +++ b/themes/volantis/scripts/events/lib/config.js @@ -0,0 +1,67 @@ +'use strict'; + +const { version } = require('../../../package.json'); + +function isObject(item) { + return item && typeof item === 'object' && !Array.isArray(item); +} + +function merge(target, source) { + for (const key in source) { + if (isObject(target[key]) && isObject(source[key])) { + merge(target[key], source[key]); + } else { + target[key] = source[key]; + } + } + return target; +} + +module.exports = hexo => { + if (!hexo.locals.get) return; + + var data = hexo.locals.get('data'); + if (!data) return; + + /** + * Merge configs from _data/volantis.yml into hexo.theme.config. + * If `override`, configs in volantis.yml will rewrite configs in hexo.theme.config. + * If volantis.yml not exists, merge all `theme_config.*` into hexo.theme.config. + */ + + if (data.volantis) { + if (data.volantis.override) { + hexo.theme.config = data.volantis; + } else { + merge(hexo.config, data.volantis); + merge(hexo.theme.config, data.volantis); + } + } else { + merge(hexo.theme.config, hexo.config.theme_config); + } + + if (hexo.theme.config.cache && hexo.theme.config.cache.enable && hexo.config.relative_link) { + hexo.log.warn('Since caching is turned on, the `relative_link` option in Hexo `_config.yml` is set to `false` to avoid potential hazards.'); + hexo.config.relative_link = false; + } + hexo.config.meta_generator = false; + hexo.theme.config.getStartTime = Date.now(); + // Custom languages support. Introduced in NexT v6.3.0. + if (data.languages) { + var { language } = hexo.config; + var { i18n } = hexo.theme; + + var mergeLang = lang => { + i18n.set(lang, merge(i18n.get([lang]), data.languages[lang])); + }; + + if (Array.isArray(language)) { + for (const lang of language) { + mergeLang(lang); + } + } else { + mergeLang(language); + } + } + hexo.theme.config.info.theme_version = version; +}; diff --git a/themes/volantis/scripts/events/lib/render-stylus.js b/themes/volantis/scripts/events/lib/render-stylus.js new file mode 100755 index 0000000..22236e1 --- /dev/null +++ b/themes/volantis/scripts/events/lib/render-stylus.js @@ -0,0 +1,78 @@ +// hexo.renderStylus 渲染 Stylus 的工具函数 +// hexo.createUuid 创建 uuid + +const stylus = require("stylus"); +const Promise = require("bluebird"); + +module.exports = hexo => { + hexo.renderStylus = async (str) => { + /**************************************************************************** */ + // from https://github.com/hexojs/hexo-renderer-stylus/blob/8f63a5e1ad886466ce59532978dfa34b4b3c6dc7/lib/renderer.js#L5 + function getProperty(obj, name) { + name = name.replace(/\[(\w+)\]/g, ".$1").replace(/^\./, ""); + const split = name.split("."); + let key = split.shift(); + if (!Object.prototype.hasOwnProperty.call(obj, key)) return ""; + let result = obj[key]; + const len = split.length; + if (!len) return result || ""; + if (typeof result !== "object") return ""; + for (let i = 0; i < len; i++) { + key = split[i]; + if (!Object.prototype.hasOwnProperty.call(result, key)) return ""; + result = result[split[i]]; + if (typeof result !== "object") return result; + } + return result; + } + function defineConfig(style) { + style.define("hexo-config", (data) => { + return getProperty(hexo.theme.config, data.val); + }); + } + /**************************************************************************** */ + return new Promise((resolve) => { + return stylus(str) + .use(defineConfig) + .include(hexo.theme.context.theme_dir + "source/css/") + .render(function (err, css) { + if (err) throw err; + resolve(css); + return css; + }); + }) + } + hexo.createUuid = () => { + let s = []; + const hexDigits = '0123456789abcdef'; + for (let i = 0; i < 36; i++) { + s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); + } + s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); + s[8] = s[13] = s[18] = s[23] = '-'; + return s.join(''); + }; + hexo.merge = merge; + hexo.getType = getType; +}; +function isObject(item) { + return item && typeof item === 'object' && !Array.isArray(item); +} + +function merge(target, source) { + for (const key in source) { + if (isObject(target[key]) && isObject(source[key])) { + merge(target[key], source[key]); + } else { + target[key] = source[key]; + } + } + return target; +} +function getType(file){ + var filename=file; + var index1=filename.lastIndexOf("."); + var index2=filename.length; + var type=filename.substring(index1+1,index2); + return type; +} \ No newline at end of file diff --git a/themes/volantis/scripts/events/lib/stellar-tag-utils.js b/themes/volantis/scripts/events/lib/stellar-tag-utils.js new file mode 100755 index 0000000..67ee112 --- /dev/null +++ b/themes/volantis/scripts/events/lib/stellar-tag-utils.js @@ -0,0 +1,76 @@ +/** + * utils.js v1 | https://github.com/xaoxuu/hexo-theme-stellar/ + */ + +// stellar 标签插件 命令解析器 + + +'use strict'; + +module.exports = hexo => { + hexo.args = { + map: (args, keys, others) => { + if (Array.isArray(args) == false) { + return args; + } + var map = {others: Array()}; + args.forEach((arg, i) => { + let kv = arg.trim(); + if (kv.includes('://') && kv.split(':').length == 2) { + // 纯 url + map.others.push(kv); + } else { + kv = kv.split(':'); + if (kv.length > 1) { + if (keys.includes(kv[0]) == true) { + map[kv.shift()] = kv.join(':'); + } else { + map.others.push(kv.join(':')); + } + } else if (kv.length == 1) { + map.others.push(kv[0]); + } + } + }); + // 解析不带 key 的参数 + if (others && others.length > 0 && map.others.length > 0) { + if (Array.isArray(others) == false) { + others = [others]; + } + others.forEach((arg, i) => { + map[arg] = map.others.shift(); + }); + // 最后一段合并到最后一个参数中 + if (map.others.length > 0) { + map[others[others.length-1]] += ' ' + map.others.join(' '); + map.others = []; + } + } + return map; + }, + joinTags: (args, keys) => { + if (Array.isArray(keys) == false) { + keys = [keys]; + } + var ret = []; + keys.forEach((key, i) => { + if (args[key] && args[key].length > 0) { + ret.push(key + '="' + args[key] + '"'); + } + }); + return ret; + }, + joinURLParams: (args, keys) => { + if (Array.isArray(keys) == false) { + keys = [keys]; + } + var ret = []; + keys.forEach((key, i) => { + if (args[key] && args[key].length > 0) { + ret.push(key + '=' + args[key]); + } + }); + return ret.join('&'); + } + }; +}; diff --git a/themes/volantis/scripts/filters/content-visibility.js b/themes/volantis/scripts/filters/content-visibility.js new file mode 100755 index 0000000..a438823 --- /dev/null +++ b/themes/volantis/scripts/filters/content-visibility.js @@ -0,0 +1,27 @@ +// https://web.dev/content-visibility/ +// https://www.caniuse.com/?search=content-visibility +// 在文章内容渲染时将每两个

              之间的内容分为一块 用
              包裹起来。然后为 .post-story 声明 content-visibility: auto +hexo.extend.filter.register('after_post_render', function (data) { + if (this.theme.config.content_visibility) { + let dataList = data.content.split('\n') + let mydata = `` + let flag = 1 + dataList.forEach(e => { + let yy = e.replace(/.*?<\/h2>/, function (str) { + if (flag) { + flag = 0 + return `
              ` + str + } else { + return `
              ` + str + } + }) + mydata += yy + mydata += "\n" + }); + if (!flag) { + mydata += `
              ` + } + data.content = mydata + } + return data; +}); \ No newline at end of file diff --git a/themes/volantis/scripts/filters/img.js b/themes/volantis/scripts/filters/img.js new file mode 100755 index 0000000..856dd1e --- /dev/null +++ b/themes/volantis/scripts/filters/img.js @@ -0,0 +1,8 @@ +/* global hexo */ + +'use strict'; + +hexo.extend.filter.register('after_post_render', function(data) { + data.content = data.content.replace(/

              (.*?)<\/p>/g, '

              $2<\/div>$2<\/span><\/div>'); + return data; +}); diff --git a/themes/volantis/scripts/filters/replace.js b/themes/volantis/scripts/filters/replace.js new file mode 100755 index 0000000..637714e --- /dev/null +++ b/themes/volantis/scripts/filters/replace.js @@ -0,0 +1,15 @@ +/* global hexo */ + +'use strict'; + +hexo.extend.filter.register('after_render:html', function(data) { + if (hexo.theme.config.replace) { + hexo.theme.config.replace.forEach(e => { + let s = e.split(" => ") + let a = s[0] + let b = s[1] + data = data.replace(new RegExp(a,"g"), b); + }); + } + return data; +},999999999999); diff --git a/themes/volantis/scripts/filters/z-lazyload.js b/themes/volantis/scripts/filters/z-lazyload.js new file mode 100755 index 0000000..164e529 --- /dev/null +++ b/themes/volantis/scripts/filters/z-lazyload.js @@ -0,0 +1,70 @@ +'use strict'; + +const fs = require('hexo-fs'); + +function lazyProcess(htmlContent, target) { + const cfg = this.theme.config.plugins.lazyload; + if (cfg == undefined || cfg.enable != true) { + return htmlContent; + } + if (cfg.onlypost == true) { + if (target != 'post') { + return htmlContent; + } + } + const loadingImg = cfg.loadingImg; + return htmlContent.replace(//gi, function(str, p1, p2) { + // might be duplicate + if (/data-srcset/gi.test(str)) { + return str; + } + if (/src="data:image(.*?)/gi.test(str)) { + return str; + } + if (/no-lazy/gi.test(str)) { + return str; + } + let cls = ''; + if (str.indexOf('class=') > -1) { + cls = str.substring(str.indexOf('class=')); + if (cls.length > 7) { + const c = cls.substring(6, 7); + cls = cls.split(c); + if (cls.length > 1) { + cls = cls[0] + '"' + cls[1] + '"'; + } + } + } + let result = str; + let newCls = ''; + if (cls.length > 0 && result.includes('class=')) { + newCls = cls.replace(/(class=|[\"]*)/g, '') + ' '; + } + const oldCls = newCls.trim(); + if (loadingImg) { + newCls += 'lazyload placeholder'; + } else { + newCls += 'lazyload'; + } + if (cls.length > 0) { + result = result.replace('"' + oldCls + '"', '"' + newCls + '"'); + } + if (loadingImg) { + return result.replace(p2, p2 + '" class="lazyload placeholder" ' + 'data-srcset="' + p2 + '" srcset="' + loadingImg); + } + return result.replace(p2, p2 + '" class="lazyload" ' + 'data-srcset="' + p2 + '" srcset="' + 'data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=='); + + }); +} + +let processPost = function(data) { + data.content = lazyProcess.call(this, data.content, 'post'); + return data; +}; + +let processSite = function(htmlContent) { + return lazyProcess.call(this, htmlContent, 'site'); +}; + +hexo.extend.filter.register('after_post_render', processPost); +hexo.extend.filter.register('after_render:html', processSite); diff --git a/themes/volantis/scripts/helpers/custom-files.js b/themes/volantis/scripts/helpers/custom-files.js new file mode 100755 index 0000000..a91c56d --- /dev/null +++ b/themes/volantis/scripts/helpers/custom-files.js @@ -0,0 +1,165 @@ +// Custom Files 自定义文件 --- Modified From NexT --- + +const fs = require('hexo-fs'); +const path = require('path'); +const defaultExtname = '.ejs'; +let points = { + styles: [ + "first", + "style", + "dark", + "darkVar", + ], + views: [ + "headBegin", + "headEnd", + "header", + "side", + "topMeta", + "bottomMeta", + "footer", + "postEnd", + "bodyBegin", + "bodyEnd", + ] +} +// hexo s 和 hexo server 时监听自定义文件变动 +function watchFile(path) { + let arg = process.argv[2]; + if (arg == "s" || arg == "server") { + fs.watch(path) + } +} +function isObject(item) { + return item && typeof item === 'object' && !Array.isArray(item); +} + +function merge(target, source) { + for (const key in source) { + if (isObject(target[key]) && isObject(source[key])) { + merge(target[key], source[key]); + } else { + target[key] = source[key]; + } + } + return target; +} +hexo.merge = merge; +hexo.extend.filter.register('theme_inject', injects => { + + let filePath = {} + points.styles.forEach(key => { + filePath[key] = "source/_volantis/" + key + ".styl" + }); + points.views.forEach(key => { + filePath[key] = "source/_volantis/" + key + defaultExtname + }); + filePath = hexo.merge(filePath, hexo.theme.config.custom_files) + // console.log(filePath); + // console.log(hexo.theme.config.custom_files); + + + points.styles.forEach(key => { + if (filePath[key]) { + injects[key].push(filePath[key]); + } + }); + points.views.forEach(key => { + if (filePath[key]) { + injects[key].file('custom', filePath[key]); + } + }); +}, 99); +hexo.extend.helper.register('volantis_inject', function (point) { + if (this.theme.injects[point]) { + return this.theme.injects[point] + .map(item => this.partial(item.layout, item.locals, item.options)) + .join(''); + } + return [] +}); +hexo.on('generateBefore', function () { + hexo.theme.config.custom = {}; + // Defining stylus types + class StylusInject { + constructor(base_dir) { + this.base_dir = base_dir; + this.files = []; + } + push(file) { + // Get absolute path base on hexo dir + let temp_path = path.resolve(this.base_dir, file) + watchFile(temp_path) + if (fs.existsSync(temp_path)) { + this.files.push(temp_path); + } + } + } + // Defining view types + class ViewInject { + constructor(base_dir) { + this.base_dir = base_dir; + this.raws = []; + } + raw(name, raw, ...args) { + // Set default extname + if (path.extname(name) === '') { + name += defaultExtname; + } + this.raws.push({ name, raw, args }); + } + file(name, file, ...args) { + // Set default extname from file's extname + if (path.extname(name) === '') { + name += path.extname(file); + } + // Get absolute path base on hexo dir + let temp_path = path.resolve(this.base_dir, file) + let temp_raw = "" + watchFile(temp_path) + if (fs.existsSync(temp_path)) { + temp_raw = fs.readFileSync(temp_path) + } + this.raw(name, temp_raw, ...args); + } + } + // Init injects + function initInject(base_dir) { + const injects = {}; + points.styles.forEach(item => { + injects[item] = new StylusInject(base_dir); + }); + points.views.forEach(item => { + injects[item] = new ViewInject(base_dir); + }); + return injects; + } + hexo.theme.config.injects = {}; + const injects = initInject(hexo.base_dir); + hexo.execFilterSync('theme_inject', injects); + points.styles.forEach(type => { + hexo.theme.config.injects[type] = injects[type].files; + }); + // Inject views + points.views.forEach(type => { + const configs = Object.create(null); + hexo.theme.config.injects[type] = []; + // Add or override view. + injects[type].raws.forEach((injectObj, index) => { + const name = `inject/${type}/${injectObj.name}`; + hexo.theme.setView(name, injectObj.raw); + configs[name] = { + layout: name, + locals: injectObj.args[0], + options: injectObj.args[1], + order: injectObj.args[2] || index + }; + }); + // Views sort. + hexo.theme.config.injects[type] = Object.values(configs).sort((x, y) => x.order - y.order) + // console.log(injects); + }); +}); + + + diff --git a/themes/volantis/scripts/helpers/first-style.js b/themes/volantis/scripts/helpers/first-style.js new file mode 100755 index 0000000..6df917b --- /dev/null +++ b/themes/volantis/scripts/helpers/first-style.js @@ -0,0 +1,19 @@ +// 将首屏样式 first.styl 硬编码到HTML页面 +"use strict"; +const fs = require("hexo-fs"); + +function generateFirstCSS() { + let s = fs.readFileSync( + hexo.theme.context.theme_dir + "source/css/first.styl" + ); + hexo.renderStylus(s).then((css)=>{ + hexo.locals.set('FirstCSS', function(){ + return css + }); + }) +} +function getFirstCSS() { + return hexo.locals.get('FirstCSS'); +} +hexo.extend.filter.register("before_generate", generateFirstCSS); +hexo.extend.helper.register("FirstCSS", getFirstCSS); diff --git a/themes/volantis/scripts/helpers/getList.js b/themes/volantis/scripts/helpers/getList.js new file mode 100755 index 0000000..91d5395 --- /dev/null +++ b/themes/volantis/scripts/helpers/getList.js @@ -0,0 +1,11 @@ +// yml string to list +// yml 太烂了 + +hexo.extend.helper.register('getList', function (list) { + if (!list) return [] + if (typeof list == "string") { + return [list] + } else { + return [...list] + } +}); \ No newline at end of file diff --git a/themes/volantis/scripts/helpers/head/autoCanonical.js b/themes/volantis/scripts/helpers/head/autoCanonical.js new file mode 100755 index 0000000..86995e5 --- /dev/null +++ b/themes/volantis/scripts/helpers/head/autoCanonical.js @@ -0,0 +1,15 @@ +/** +* hexo-auto-canonical +* https://github.com/hyunseob/hexo-auto-canonical.git +* Copyright (c) 2015, HyunSeob +* Licensed under the MIT license. +*/ + +'use strict'; + +hexo.extend.helper.register('autoCanonical', function (config, page) { + var base_url = config.url; + if (config.url.charAt(config.url.length - 1) !== '/') base_url += '/'; + + return ''; +}); \ No newline at end of file diff --git a/themes/volantis/scripts/helpers/head/generate_preload_fontfamily.js b/themes/volantis/scripts/helpers/head/generate_preload_fontfamily.js new file mode 100755 index 0000000..cd8ec91 --- /dev/null +++ b/themes/volantis/scripts/helpers/head/generate_preload_fontfamily.js @@ -0,0 +1,22 @@ +function getType(file) { + var filename = file; + var index1 = filename.lastIndexOf("."); + var index2 = filename.length; + var type = filename.substring(index1 + 1, index2); + return type; +} +function getLink_preload(Url) { + return `\n` +} + +hexo.extend.helper.register("generate_preload_fontfamily", function (theme) { + const hexo = this; + let preload = ""; + if (theme.custom_css.fontfamily.logofont && theme.custom_css.fontfamily.logofont.url) { + preload += getLink_preload(theme.custom_css.fontfamily.logofont.url) + } + if (theme.custom_css.fontfamily.bodyfont && theme.custom_css.fontfamily.bodyfont.url) { + preload += getLink_preload(theme.custom_css.fontfamily.bodyfont.url) + } + return preload +}); diff --git a/themes/volantis/scripts/helpers/head/generate_seo.js b/themes/volantis/scripts/helpers/head/generate_seo.js new file mode 100755 index 0000000..53ce54f --- /dev/null +++ b/themes/volantis/scripts/helpers/head/generate_seo.js @@ -0,0 +1,24 @@ +hexo.extend.helper.register('generate_seo', function (theme, page) { + const hexo = this; + let robots_content=""; + if (page.robots) { + robots_content = page.robots + } else if (theme.seo && theme.seo.robots) { + if (hexo.is_home()) { + if (page.prev == 0) { + robots_content=theme.seo.robots.home_first_page + }else{ + robots_content=theme.seo.robots.home_other_pages + } + } else if (hexo.is_archive()) { + robots_content=theme.seo.robots.archive + } else if (hexo.is_category()) { + robots_content=theme.seo.robots.category + } else if (hexo.is_tag()) { + robots_content=theme.seo.robots.tag + } + } + if(robots_content){ + return `` + } +}); \ No newline at end of file diff --git a/themes/volantis/scripts/helpers/head/generate_title__keywords__description.js b/themes/volantis/scripts/helpers/head/generate_title__keywords__description.js new file mode 100755 index 0000000..2dca8b8 --- /dev/null +++ b/themes/volantis/scripts/helpers/head/generate_title__keywords__description.js @@ -0,0 +1,101 @@ +function init(hexo, config, theme, page) { + var title = page.seo_title || page.title; + var keywords = page.keywords || ""; + var description = page.description || ""; + if (hexo.is_archive()) { + title = hexo.__("navbar.archive"); + if (hexo.is_month()) { + title += hexo.__("symbol.colon") + page.year + "/" + page.month; + } else if (hexo.is_year()) { + title += hexo.__("symbol.colon") + page.year; + } + } else if (hexo.is_category()) { + title = hexo.__("navbar.category") + hexo.__("symbol.colon") + page.category; + } else if (hexo.is_tag()) { + title = hexo.__("navbar.tag") + hexo.__("symbol.colon") + page.tag; + } else if (hexo.is_home() && page.prev == 0) { + keywords = config.keywords || ""; + description = config.description || ""; + } else { + if ( + page.layout == "docs" && + page.group && + page.group in theme.sidebar.widget_library + ) { + let widget = theme.sidebar.widget_library[page.group]; + if (widget.class == "group" && widget.seo_title) { + title = widget.seo_title + ": " + title; + } + } + } + if (theme.seo && theme.seo.use_tags_as_keywords) { + if (!keywords && page.tags && page.tags.length > 0) { + let tags = page.tags + .map(function (t) { + return t.name; + }) + .join(","); + if (tags.length > 0) { + keywords += tags; + } + } + } + if (theme.seo && theme.seo.use_excerpt_as_description) { + if (page.description == undefined) { + if (page.excerpt) { + description = hexo.truncate(hexo.strip_html(page.excerpt), { length: 160 }); + } + } + } + return { + title: title, + keywords: keywords, + description: description, + }; +} + +hexo.extend.helper.register("generate_title", function (config, theme, page) { + const hexo = this; + let data = init(hexo, config, theme, page); + let title = data.title + let s = "" + if (title) { + s += `${title} - ` + } + s += `${config.title}` + return s +}); + +hexo.extend.helper.register("generate_keywords", function (config, theme, page) { + const hexo = this; + let data = init(hexo, config, theme, page); + let keywords = data.keywords + if (!(hexo.is_home() && page.prev == 0)) { + if (keywords) { + keywords += `,` + } + keywords += `${config.keywords}` + } + return `` +}); + +hexo.extend.helper.register("generate_description", function (config, theme, page) { + const hexo = this; + let data = init(hexo, config, theme, page); + let description = data.description + if (!description) { + if (config.description) { + description = config.description + }else{ + description = config.title + } + } + description += ` - ${config.author} - ${config.title}` + return `` +}); +// open_graph() 函数会生成一个 description 标签??? https://github.com/hexojs/hexo/blob/92b979f4a3fa8714aebd3d11c3295d466b870905/lib/plugins/helper/open_graph.js#L98 +// 移除 open_graph() 函数会生成的 description +hexo.extend.filter.register('after_render:html', function(data) { + data = data.replace(//g, ""); + return data; +},99); \ No newline at end of file diff --git a/themes/volantis/scripts/helpers/related-posts.js b/themes/volantis/scripts/helpers/related-posts.js new file mode 100755 index 0000000..915af94 --- /dev/null +++ b/themes/volantis/scripts/helpers/related-posts.js @@ -0,0 +1,54 @@ +/** + * https://github.com/tea3/hexo-related-popular-posts/wiki/More-Settings#customize-html + */ + +'use strict'; +var util = require('hexo-util'); + +// Examples of helper +hexo.extend.helper.register('htmlGenerator', function(args) { + if (!args || !args.json || args.json.length == 0) return ''; + const cfg = hexo.theme.config.article.body.footer_widget.related_posts; + var returnHTML = ''; + var div = ` + '; + return div; +}); diff --git a/themes/volantis/scripts/helpers/structured-data/index.js b/themes/volantis/scripts/helpers/structured-data/index.js new file mode 100755 index 0000000..7490ef8 --- /dev/null +++ b/themes/volantis/scripts/helpers/structured-data/index.js @@ -0,0 +1,2 @@ +/*globals hexo */ +hexo.extend.helper.register("structured_data", require('./lib/')); diff --git a/themes/volantis/scripts/helpers/structured-data/lib/blogposting.js b/themes/volantis/scripts/helpers/structured-data/lib/blogposting.js new file mode 100755 index 0000000..a36dbf0 --- /dev/null +++ b/themes/volantis/scripts/helpers/structured-data/lib/blogposting.js @@ -0,0 +1,77 @@ +module.exports = (hexo, option) => { + const { config, page: post } = hexo; + + const blogposting = { + "@context": "https://schema.org.cn", + "@type": "BlogPosting", + headline: post.title || post.seo_title, + description: post.description || hexo.strip_html(post.excerpt) || config.description, + inLanguage: config.language, + mainEntityOfPage: { + "@type": "WebPage", + "@id": post.permalink, + }, + author: { + "@type": "Person", + name: option.person.name, + image: { + "@type": "ImageObject", + url: option.logo.path, + }, + url: option.person.url, + }, + publisher: { + "@type": "Organization", + name: option.organization.name, + logo: { + "@type": "ImageObject", + url: option.logo.path, + width: option.logo.width, + height: option.logo.height, + }, + }, + url: post.permalink, + }; + + blogposting.wordCount = hexo.strip_html(post.excerpt).length; + + if (post.date) { + blogposting.datePublished = post.date.toISOString(); + } + if (post.updated) { + blogposting.dateModified = post.updated.toISOString(); + } + if (post.categories && post.categories.length) { + if (post.categories.data) { + blogposting.articleSection = post.categories.data[0].name; + } else { + blogposting.articleSection = post.categories[0]; + } + } + + if (post.tags && post.tags.length) { + if (post.tags.data) { + blogposting.keywords = post.tags.map((tag) => tag.name).join(","); + } else { + blogposting.keywords = post.tags.map((tag) => tag).join(","); + } + } + let image = post.headimg || ""; + if (image) { + blogposting.image = { + "@type": "ImageObject", + url: image, + width: 1024, + height: 768, + }; + }else{ + blogposting.image = { + "@type": "ImageObject", + url: option.logo.path, + width: option.logo.width, + height: option.logo.height, + }; + } + + return blogposting; +}; diff --git a/themes/volantis/scripts/helpers/structured-data/lib/breadcrumblist.js b/themes/volantis/scripts/helpers/structured-data/lib/breadcrumblist.js new file mode 100755 index 0000000..f6efa5b --- /dev/null +++ b/themes/volantis/scripts/helpers/structured-data/lib/breadcrumblist.js @@ -0,0 +1,152 @@ +module.exports = (hexo, option) => { + const { config, page } = hexo; + + const breadcrumb = { + "@context": "https://schema.org.cn", + "@type": "BreadcrumbList", + itemListElement: [ + { + "@type": "ListItem", + position: 1, + item: { + "@id": config.url + config.root, + name: config.title, + }, + }, + ], + }; + + if (hexo.is_category()) { + let { category_dir, category_map: map } = config; + if (!Array.isArray(map)) map = []; + if (category_dir === "/") category_dir = ""; + if (category_dir.slice(-1) !== "/") category_dir += "/"; + const category_path = + category_dir + (map[page.category] || page.category) + "/"; + + breadcrumb.itemListElement.push({ + "@type": "ListItem", + position: 2, + item: { + "@id": config.url + config.root + category_path, + name: page.category, + }, + }); + } + + if (hexo.is_tag()) { + let { tag_dir, tag_map: map } = config; + if (!Array.isArray(map)) map = []; + if (tag_dir === "/") tag_dir = ""; + if (tag_dir.slice(-1) !== "/") tag_dir += "/"; + const tag_path = tag_dir + (map[page.tag] || page.tag) + "/"; + + breadcrumb.itemListElement.push({ + "@type": "ListItem", + position: 2, + item: { + "@id": config.url + config.root + tag_path, + name: page.tag, + }, + }); + } + + if (hexo.is_archive()) { + let { archive_dir } = config; + if (archive_dir.slice(-1) !== "/") archive_dir += "/"; + + breadcrumb.itemListElement.push({ + "@type": "ListItem", + position: 2, + item: { + "@id": config.url + config.root + archive_dir, + name: "Archive", + }, + }); + let timezone = config.timezone || "Asia/Shanghai"; + if (hexo.is_year()) { + const dtf = new Intl.DateTimeFormat(config.language, { + year: "numeric", + timeZone: timezone, + }); + breadcrumb.itemListElement.push({ + "@type": "ListItem", + position: 3, + item: { + "@id": config.url + config.root + archive_dir + page.year + "/", + name: dtf.format(new Date(page.year, 0, 1)), + }, + }); + } + + if (hexo.is_month()) { + const dtf = new Intl.DateTimeFormat(config.language, { + month: "numeric", + timeZone: timezone, + }); + breadcrumb.itemListElement.push({ + "@type": "ListItem", + position: 4, + item: { + "@id": + config.url + + config.root + + archive_dir + + page.year + + "/" + + page.month + + "/", + name: dtf.format(new Date(page.year, page.month - 1, 1)), + }, + }); + } + } + + if (hexo.is_post()) { + page.categories.data.forEach((category) => + breadcrumb.itemListElement.push({ + "@type": "ListItem", + position: 2, + item: { + "@id": config.url + config.root + category.path, + name: category.name, + }, + }) + ); + + breadcrumb.itemListElement.push({ + "@type": "ListItem", + position: 3, + item: { + "@id": config.url + config.root + page.path, + name: page.title || page.seo_title, + }, + }); + } + + if (hexo.is_page()&&page.categories) { + let temp = "/" + for (let index = 0; index < page.categories.length; index++) { + const cat = page.categories[index]; + temp = temp + cat + "/" + breadcrumb.itemListElement.push({ + "@type": "ListItem", + position: 2, + item: { + "@id": config.url + config.root + config.category_dir + temp, + name: cat, + }, + }) + } + breadcrumb.itemListElement.push({ + "@type": "ListItem", + position: 3, + item: { + "@id": config.url + config.root + page.path, + name: page.title || page.seo_title, + }, + }); + } + + return breadcrumb; +}; diff --git a/themes/volantis/scripts/helpers/structured-data/lib/config.js b/themes/volantis/scripts/helpers/structured-data/lib/config.js new file mode 100755 index 0000000..81bddf1 --- /dev/null +++ b/themes/volantis/scripts/helpers/structured-data/lib/config.js @@ -0,0 +1,31 @@ +module.exports = function (hexo) { + const {config} = hexo; + return { + person: { + name: config.author, + url: config.url + config.root, + sns: [], + description: config.description, + }, + logo: { + path: /404/, + width: 192, + height: 192, + }, + organization: { + name: config.title, + url: config.url + config.root, + }, + website: { + name: config.title, + url: config.url + config.root, + keywords: config.keywords, + description: config.description, + search: { + name: "Site Search", + url: config.url + "?s={search_term_string}", + query: "required name=search_term_string", + }, + }, + }; +}; diff --git a/themes/volantis/scripts/helpers/structured-data/lib/index.js b/themes/volantis/scripts/helpers/structured-data/lib/index.js new file mode 100755 index 0000000..a792cd6 --- /dev/null +++ b/themes/volantis/scripts/helpers/structured-data/lib/index.js @@ -0,0 +1,30 @@ +const config = require("./config"); + +const WebSite = require("./website"); +const Organization = require("./organization"); +const Person = require("./person"); +const BlogPosting = require("./blogposting"); +const BreadcrumbList = require("./breadcrumblist"); + +function isObject(item) { + return item && typeof item === 'object' && !Array.isArray(item); +} + +function merge(target, source) { + for (const key in source) { + if (isObject(target[key]) && isObject(source[key])) { + merge(target[key], source[key]); + } else { + target[key] = source[key]; + } + } + return target; +} + +module.exports = function () { + const hexo = this; + const option = merge(config(hexo), hexo.theme.structured_data.data); + const builder = [Organization, Person, BreadcrumbList, WebSite, BlogPosting]; + const jsonld = JSON.stringify(builder.map((f) => f(hexo, option))); + return ``; +}; diff --git a/themes/volantis/scripts/helpers/structured-data/lib/organization.js b/themes/volantis/scripts/helpers/structured-data/lib/organization.js new file mode 100755 index 0000000..703a6bb --- /dev/null +++ b/themes/volantis/scripts/helpers/structured-data/lib/organization.js @@ -0,0 +1,15 @@ + +module.exports = (hexo, option) => { + return { + "@context": "https://schema.org.cn", + "@type": "Organization", + "name": option.organization.name, + "url": option.organization.url, + "logo": { + "@type": "ImageObject", + "url": option.logo.path, + "width": option.logo.width, + "height": option.logo.height + } + }; +}; diff --git a/themes/volantis/scripts/helpers/structured-data/lib/person.js b/themes/volantis/scripts/helpers/structured-data/lib/person.js new file mode 100755 index 0000000..9577ee0 --- /dev/null +++ b/themes/volantis/scripts/helpers/structured-data/lib/person.js @@ -0,0 +1,16 @@ +module.exports = (hexo, option) => { + const { config } = hexo; + + return { + "@context": "https://schema.org.cn", + "@type": "Person", + name: option.person.name, + image: { + "@type": "ImageObject", + url: option.logo.path, + }, + url: option.person.url, + sameAs: option.person.sns, + description: option.person.description, + }; +}; diff --git a/themes/volantis/scripts/helpers/structured-data/lib/website.js b/themes/volantis/scripts/helpers/structured-data/lib/website.js new file mode 100755 index 0000000..bdde8b0 --- /dev/null +++ b/themes/volantis/scripts/helpers/structured-data/lib/website.js @@ -0,0 +1,42 @@ +module.exports = (hexo,option) => { + const { config } = hexo; + + return { + "@context": "https://schema.org.cn", + "@type": "WebSite", + name: option.website.name, + url: option.website.url, + keywords: option.website.keywords, + description: option.website.description, + author: { + "@type": "Person", + name: option.person.name, + image: { + "@type": "ImageObject", + url: option.logo.path, + }, + url: option.person.url, + description: option.person.description, + }, + publisher: { + "@type": "Organization", + name: option.organization.name, + url: option.organization.url, + logo: { + "@type": "ImageObject", + url: option.logo.path, + width: option.logo.width, + height: option.logo.height, + }, + }, + potentialAction: { + "@type": "SearchAction", + name: option.website.search.name, + target: { + "@type": "EntryPoint", + urlTemplate: option.website.search.url, + }, + "query-input": option.website.search.query, + }, + }; +}; diff --git a/themes/volantis/scripts/helpers/文章推荐.js b/themes/volantis/scripts/helpers/文章推荐.js new file mode 100755 index 0000000..93e9bdd --- /dev/null +++ b/themes/volantis/scripts/helpers/文章推荐.js @@ -0,0 +1,184 @@ +const 文章库 = []; +const 语料库 = []; +let 标记 = null; + +hexo.extend.filter.register('template_locals', function (本地变量) { + const cfg = hexo.theme.config.article.body.footer_widget.recommended_article; + if (!cfg.enable) { + return 本地变量; + } + if (!标记) { + 标记 = 1 + 获取数据(本地变量.site.posts, cfg) + 获取数据(本地变量.site.pages, cfg) + 文章推荐(cfg) + } + return 本地变量; +}); + +function 获取数据(s, cfg) { + s.each(function (p) { + if (["post", "docs"].includes(p.layout)) { + 文章库.push({ + path: p.path, + title: p.title || p.seo_title || p.short_title, + headimg: p.headimg || cfg.placeholder_img, + }) + 语料库.push(分词(p.raw)) + } + }) +} + +function 数据清洗(数据) { + const 标点符号列表 = [ + ",", ".", "?", "!", ":", ";", "、", "……", "~", "&", "@", "#", ",", "。", "?", "!", ":", ";", "·", "…", "~", "&", "@", "#", "“", "”", "‘", "’", "〝", "〞", "\"", "'", """, "'", "´", "'", "(", ")", "【", + "】", "《", "》", "<", ">", "﹝", "﹞", "<", ">", "(", ")", "[", "]", "«", "»", "‹", "›", "〔", "〕", "〈", "〉", "{", "}", "[", "]", "「", "」", "{", "}", "〖", "〗", "『", "』", "︵", "︷", "︹", "︿", "︽", "﹁", + "﹃", "︻", "︗", "/", "|", "\\", "︶", "︸", "︺", "﹀", "︾", "﹂", "﹄", "﹄", "︼", "︘", "/", "|", "\", + "_", "¯", "_", " ̄", "﹏", "﹋", "﹍", "﹉", "﹎", "﹊", "`", "ˋ", "¦", "︴", "¡", "¿", "^", "ˇ", "­", "¨", "ˊ", " ", " ", + "%", "*", "-", "+", "=", "¥", "$", "(", ")" + ] + 数据 = 数据.replace(/\s/g, " ") + 数据 = 数据.replace(/\!\[(.*?)\]\(.*?\)/g, (_a, b) => { return b }) + 数据 = 数据.replace(/(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/g, " ") + for (const 标点符号 of 标点符号列表) { + 数据 = 数据.replace(new RegExp("\\" + 标点符号, "g"), " ") + } + 数据 = 数据.replace(/\d+/g, " ") + 数据 = 数据.replace(/\s/g, " ") + return 数据 +} + +function 分词(数据) { + const 结巴 = require("nodejieba"); + return 结巴.cut(数据清洗(数据), true).filter(词 => 词 !== " " && !/^[0-9]*$/.test(词)) +} + +function 余弦相似度(向量1, 向量2) { + let 分子 = 0; + let 根式1 = 0; + let 根式2 = 0; + if (向量1.length == 向量2.length) { + for (let i = 0; i < 向量1.length; i++) { + 分子 += (向量1[i] * 向量2[i]) + 根式1 += (向量1[i] * 向量1[i]) + 根式2 += (向量2[i] * 向量2[i]) + } + return 分子 / (Math.sqrt(根式1) * Math.sqrt(根式2)) + } +} + + +function 文章推荐(cfg) { + const 数据集 = {}; + const 相似度集 = {}; + const 推荐集 = {} + let 所有文章中所有的词 = []; + + for (let i = 0; i < 语料库.length; i++) { + const 分词表 = 语料库[i]; + 所有文章中所有的词 = [...new Set(所有文章中所有的词.concat(分词表))] + } + const 词库 = {} + 所有文章中所有的词.forEach(e => { + 词库[e] = 0 + }) + const 包含该词的文档数库 = JSON.parse(JSON.stringify(词库)) + for (let i = 0; i < 语料库.length; i++) { + const 文章路径 = 文章库[i].path; + const 文章中的词 = 语料库[i]; + + const 词在文章中出现的次数库 = 文章中的词.reduce((词计数对象, 词名称) => { + if (词名称 in 词计数对象) { + 词计数对象[词名称]++; + } + return 词计数对象 + }, JSON.parse(JSON.stringify(词库))) + + 数据集[文章路径] = {}; + 数据集[文章路径]["词频"] = JSON.parse(JSON.stringify(词库)); + for (const 词 of Object.keys(词库)) { + 数据集[文章路径]["词频"][词] = 词在文章中出现的次数库[词] / 文章中的词.length; + if (词在文章中出现的次数库[词]) { + 包含该词的文档数库[词]++; + } + } + } + + for (let i = 0; i < 语料库.length; i++) { + const 文章路径 = 文章库[i].path; + 数据集[文章路径]["逆文档频率"] = JSON.parse(JSON.stringify(词库)); + 数据集[文章路径]["词频-逆文档频率"] = JSON.parse(JSON.stringify(词库)); + 数据集[文章路径]["词频向量"] = [] + for (const 词 of Object.keys(词库)) { + const 逆文档频率 = Math.log(语料库.length / (包含该词的文档数库[词] + 1)) + const 词频逆文档频率 = 数据集[文章路径]["词频"][词] * 逆文档频率 + // 数据集[文章路径]["逆文档频率"][词] = 逆文档频率 + // 数据集[文章路径]["词频-逆文档频率"][词] = 词频逆文档频率 + 数据集[文章路径]["词频向量"].push(词频逆文档频率) + } + } + for (let i = 0; i < 语料库.length; i++) { + const 文章路径1 = 文章库[i].path; + 相似度集[文章路径1] = {} + for (let j = 0; j < 语料库.length; j++) { + const 文章路径2 = 文章库[j].path; + 相似度集[文章路径1][文章路径2] = 余弦相似度(数据集[文章路径1]["词频向量"], 数据集[文章路径2]["词频向量"]); + } + for (let j = 0; j < 语料库.length; j++) { + 推荐集[文章路径1] = Object.keys(相似度集[文章路径1]).sort(function (a, b) { + return 相似度集[文章路径1][b] - 相似度集[文章路径1][a]; // 降序 + }) + } + const index = 推荐集[文章路径1].indexOf(文章路径1); + if (index > -1) { + 推荐集[文章路径1].splice(index, 1); + } + 推荐集[文章路径1] = 推荐集[文章路径1].slice(0, cfg.max_count); + for (let j = 0; j < 推荐集[文章路径1].length; j++) { + const e = 推荐集[文章路径1][j]; + 推荐集[文章路径1][j] = 文章库.filter(w => w.path == e)[0] + } + } + hexo.locals.set('推荐集', function () { + return 推荐集 + }); + // console.log(hexo.locals.get('推荐集')); +} + +hexo.extend.helper.register('文章推荐生成器', function (post) { + if (!post) return ''; + const cfg = hexo.theme.config.article.body.footer_widget.recommended_article; + if (!cfg.enable) { + return ""; + } + for (const dir of cfg.skip_dirs) { + if (new RegExp("^" + dir, "g").test(post.path)) { + return ""; + } + } + const 推荐集 = hexo.locals.get('推荐集'); + const 推荐文章 = 推荐集[post.path]; + // console.log(post.path); + // console.log(推荐文章); + return 用户界面(推荐文章, cfg); +}); + +function 用户界面(推荐文章, cfg) { + let html = "" + for (const item of 推荐文章) { + html += Item界面(item) + } + return `
              +
              + ${cfg.title} +
              +
              ${html}
              +
              ` +} + +function Item界面(item) { + return ` + ${item.title} + ${item.title} +` +} \ No newline at end of file diff --git a/themes/volantis/scripts/tags/btn.js b/themes/volantis/scripts/tags/btn.js new file mode 100755 index 0000000..64143c5 --- /dev/null +++ b/themes/volantis/scripts/tags/btn.js @@ -0,0 +1,54 @@ +'use strict'; + +function postBtn(args) { + if(/::/g.test(args)){ + args = args.join(' ').split('::'); + } + else{ + args = args.join(' ').split(','); + } + let cls = ''; + let text = ''; + let url = ''; + let icon = ''; + if (args.length > 3) { + cls = args[0]; + text = args[1]; + url = args[2]; + icon = args[3]; + } else if (args.length > 2) { + if (args[2].indexOf(' fa-') > -1) { + // text, url, icon + text = args[0]; + url = args[1]; + icon = args[2]; + } else { + cls = args[0]; + text = args[1]; + url = args[2]; + } + } else if (args.length > 1) { + text = args[0]; + url = args[1]; + } else if (args.length > 0) { + text = args[0]; + } + + cls = cls.trim(); + icon = icon.trim(); + text = text.trim(); + url = url.trim(); + if (url.length > 0) { + url = 'href=\'' + url + '\''; + } + if (cls.length > 0) { + cls = ' ' + cls; + } + if (icon.length > 0) { + return `${text}`; + } + return `${text}`; + +} + +hexo.extend.tag.register('btn', postBtn); diff --git a/themes/volantis/scripts/tags/btns.js b/themes/volantis/scripts/tags/btns.js new file mode 100755 index 0000000..632c287 --- /dev/null +++ b/themes/volantis/scripts/tags/btns.js @@ -0,0 +1,40 @@ +'use strict'; + +function postBtns(args, content) { + return `
              + ${content} +
              `; +} + +function postCell(args, content) { + if(/::/g.test(args)){ + args = args.join(' ').split('::'); + } + else{ + args = args.join(' ').split(','); + } + let text = args[0] || ''; + let url = args[1] || ''; + text = text.trim(); + url = url.trim(); + if (url.length > 0) { + url = 'href=\'' + url + '\''; + } + let icon = ''; + let img = hexo.theme.config.default.image; + if (args.length > 2) { + if (args[2].indexOf(' fa-') > -1) { + icon = args[2].trim(); + } else { + img = args[2].trim(); + } + } + if (icon.length > 0) { + return `${text}`; + } + return `${text}`; + +} + +hexo.extend.tag.register('btns', postBtns, {ends: true}); +hexo.extend.tag.register('cell', postCell); diff --git a/themes/volantis/scripts/tags/checkbox.js b/themes/volantis/scripts/tags/checkbox.js new file mode 100755 index 0000000..5fccf06 --- /dev/null +++ b/themes/volantis/scripts/tags/checkbox.js @@ -0,0 +1,63 @@ +'use strict'; + +function postCheckbox(args) { + if(/::/g.test(args)){ + args = args.join(' ').split('::'); + } + else{ + args = args.join(' ').split(','); + } + var cls = ''; + var text = ''; + var checked = false; + if (args.length > 1) { + cls = (args[0] || '').trim(); + if (cls.length > 0) { + cls = ' ' + cls; + } + if (cls.indexOf('checked') > -1) { + checked = true; + } + text = (args[1] || '').trim(); + } else if (args.length > 0) { + text = (args[0] || '').trim(); + } + if (text.length > 0) { + return `
              + ${hexo.render.renderSync({text: text, engine: 'markdown'}).split('\n').join('')} +
              `; + } +} +function postRadio(args) { + if(/::/g.test(args)){ + args = args.join(' ').split('::'); + } + else{ + args = args.join(' ').split(','); + } + var cls = ''; + var text = ''; + var checked = false; + if (args.length > 1) { + cls = (args[0] || '').trim(); + if (cls.length > 0) { + cls = ' ' + cls; + } + if (cls.indexOf('checked') > -1) { + checked = true; + } + text = (args[1] || '').trim(); + } else if (args.length > 0) { + text = (args[0] || '').trim(); + } + if (text.length > 0) { + return `
              + ${hexo.render.renderSync({text: text, engine: 'markdown'}).split('\n').join('')} +
              `; + } +} +// {% checkbox text %} +// {% checkbox checked, text %} +// {% checkbox color checked, text %} +hexo.extend.tag.register('checkbox', postCheckbox); +hexo.extend.tag.register('radio', postRadio); diff --git a/themes/volantis/scripts/tags/contributors.js b/themes/volantis/scripts/tags/contributors.js new file mode 100755 index 0000000..b37f17c --- /dev/null +++ b/themes/volantis/scripts/tags/contributors.js @@ -0,0 +1,99 @@ +/** + * friends.js v1 | https://github.com/xaoxuu/hexo-theme-stellar/ + * 格式与官方标签插件一致使用空格分隔,中括号内的是可选参数(中括号不需要写出来) + * + * {% friends [only:group1] [not:group2] %} + */ + +'use strict'; + +hexo.extend.tag.register('contributors', function(args) { + args = hexo.args.map(args, ['only', 'not', 'api', 'source', 'repo']); + if (args.only) { + if(/::/g.test(args.only)){ + args.only = args.only.split('::'); + }else{ + args.only = args.only.split(','); + } + } + if (args.not) { + if(/::/g.test(args.not)){ + args.not = args.not.split('::'); + }else{ + args.not = args.not.split(','); + } + } + var friends = hexo.locals.get('data').contributors; + if (friends == undefined) { + friends = {}; + } + var api = args.api; + if (api) { + friends = { + group: { + api: api + } + } + } + var el = '
              '; + function groupHeader(group) { + var header = '
              '; + if (group.title) { + header += hexo.render.renderSync({text: group.title, engine: 'markdown'}).split('\n').join(''); + } + if (group.description) { + header += hexo.render.renderSync({text: group.description, engine: 'markdown'}).split('\n').join(''); + } + header += '
              '; + return header; + } + function cell(friend) { + if (friend.url && friend.title) { + var cell = '' + return cell; + } else { + return ''; + } + } + for (let groupId of Object.keys(friends)) { + function f() { + if (args.not && args.not.includes(groupId)) { + return; + } + if (groupId in friends) { + let group = friends[groupId]; + if (group.title || group.description) { + el += groupHeader(group); + } + if (group.api) { + el += '
              { + el += cell(friend); + }); + el += '
              '; + } + } + } + if (args.only) { + if (args.only.includes(groupId)) { + f(); + } + } else { + f(); + } + } + el += '
              '; + return el; +}); diff --git a/themes/volantis/scripts/tags/dropmenu.js b/themes/volantis/scripts/tags/dropmenu.js new file mode 100755 index 0000000..df50440 --- /dev/null +++ b/themes/volantis/scripts/tags/dropmenu.js @@ -0,0 +1,123 @@ +'use strict'; + +function postMenu(args, content) { + if(/::/g.test(args)){ + args = args.join(' ').split('::'); + } + else{ + args = args.join(' ').split(','); + } + if (args.length == 1) { + const title = args[0].trim(); + return `
              +
              + ${title} +
                + ${content} +
              +
              +
              `; + } else if (args.length == 2) { + const prefix = args[0].trim(); + const title = args[1].trim(); + return `
              + ${prefix} +
              + ${title} +
                + ${content} +
              +
              +
              `; + } else if (args.length == 3) { + const prefix = args[0].trim(); + const title = args[1].trim(); + const suffix = args[2].trim(); + return `
              + ${prefix} +
              + ${title} +
                + ${content} +
              +
              + ${suffix} +
              `; + } +} +function postSubmenu(args, content) { + if(/::/g.test(args)){ + args = args.join(' ').split('::'); + } + else{ + args = args.join(' ').split(','); + } + const text = args[0] || ''; + const icon = args[1] || ''; + if (icon.length > 0) { + return `
            • + + + ${text} + +
                + ${content} +
              +
            • `; + } + return `
            • + ${text} +
                + ${content} +
              +
            • `; + +} + +function postMenuItem(args) { + if(/::/g.test(args)){ + args = args.join(' ').split('::'); + } + else{ + args = args.join(' ').split(','); + } + let text = args[0] || ''; + let url = args[1] || ''; + text = text.trim(); + url = url.trim(); + if (url.length > 0) { + url = 'href=\'' + url + '\''; + } + let icon = ''; + if (args.length > 2) { + icon = args[2].trim(); + } + if (url.length > 0) { + if (icon.length > 0) { + return `
            • + + + ${text} + +
            • `; + } + return `
            • + + ${text} + +
            • `; + + } + if (text == 'hr') { + return '
              '; + } + + +} + +// {% menu 标题 %} +// {% menu 前缀, 标题 %} +// {% menu 前缀, 标题, 后缀 %} +hexo.extend.tag.register('menu', postMenu, {ends: true}); +hexo.extend.tag.register('submenu', postSubmenu, {ends: true}); +hexo.extend.tag.register('menuitem', postMenuItem); diff --git a/themes/volantis/scripts/tags/fancybox.js b/themes/volantis/scripts/tags/fancybox.js new file mode 100755 index 0000000..4862ed3 --- /dev/null +++ b/themes/volantis/scripts/tags/fancybox.js @@ -0,0 +1,52 @@ +'use strict'; + +function renderImg(content) { + return `${hexo.render.renderSync({text: content, engine: 'markdown'}).split('\n').join('')}`; +} + +function buidAlt(alt) { + if (!!alt && alt !== 'image') { + return `${alt}` + } else { + return ''; + } +} + +function buidImgFancybox(content, group) { + let html = renderImg(content).trim(); + if(html.startsWith('

              ') && html.endsWith('

              ')) { // 去除无用的 p 标签包裹 + html=html.substring(0, html.length-4).substring(3); + } + + let imageTags = html.includes('image-caption') ? 'image' : undefined; + let imgList = html.match(//g) || []; + imgList.forEach(item => { + const url = (item.match(/\ssrc=['"](.*?)['"]/) || [])[1]; + const alt = (item.match(/\salt=['"](.*?)['"]/) || [])[1] || ''; + const newItem = item.replace('img', 'img fancybox itemprop="contentUrl"'); // 避免出现重复替换,打个标 + const result = `
              ${buidAlt(imageTags || alt)}
              `; + html = html.replace(item, result.trim()); + }) + return html; +} + +function postFancybox(args, content) { + if(/::/g.test(args)){ + args = args.join(' ').split('::'); + } + else{ + args = args.join(' ').split(','); + } + const cls = args[0]; + const col = Number(args[1]) || 0; + const group = (args[2] || 'default').trim(); + + if (col > 0) { + return ``; + } + return ``; +} + + + +hexo.extend.tag.register('gallery', postFancybox, {ends: true}); diff --git a/themes/volantis/scripts/tags/folding.js b/themes/volantis/scripts/tags/folding.js new file mode 100755 index 0000000..651237b --- /dev/null +++ b/themes/volantis/scripts/tags/folding.js @@ -0,0 +1,34 @@ +'use strict'; + +function postFolding(args, content) { + if(/::/g.test(args)){ + args = args.join(' ').split('::'); + } + else{ + args = args.join(' ').split(','); + } + let style = ''; + let title = ''; + if (args.length > 1) { + style = args[0].trim(); + title = args[1].trim(); + } else if (args.length > 0) { + title = args[0].trim(); + } + if (style != undefined) { + return `
              ${title} +
              + ${hexo.render.renderSync({text: content, engine: 'markdown'}).split('\n').join('')} +
              +
              `; + } + return `
              ${title} +
              + ${hexo.render.renderSync({text: content, engine: 'markdown'}).split('\n').join('')} +
              +
              `; + + +} + +hexo.extend.tag.register('folding', postFolding, {ends: true}); diff --git a/themes/volantis/scripts/tags/frame.js b/themes/volantis/scripts/tags/frame.js new file mode 100755 index 0000000..272d39a --- /dev/null +++ b/themes/volantis/scripts/tags/frame.js @@ -0,0 +1,92 @@ +/** + * frame.js | https://github.com/volantis-x/hexo-theme-volantis + */ + +'use strict'; + +// frame 带有设备模型的图片或视频 +// {% frame device | img=xxx %} +// {% frame device | img=xxx | part=top %} +// {% frame device | img=xxx | part=bottom %} +// {% frame device | video=xxx %} +// {% frame device | video=xxx | part=top %} +// {% frame device | video=xxx | part=bottom %} +// device: iphone11, +hexo.extend.tag.register('frame', function(args) { + if(/::/g.test(args)){ + args = args.join(' ').split('::'); + } + else{ + args = args.join(' ').split(' | '); + } + // 所有支持的参数 + const device = args[0].trim(); + let img = ''; + let video = ''; + let part = ''; + let alt = ''; + // 解析 + if (args.length > 0) { + for (let i = 0; i < args.length; i++) { + const tmp = args[i].trim(); + if (tmp.includes('img=')) { + img = tmp.substring(4, tmp.length); + } else if (tmp.includes('video=')) { + video = tmp.substring(6, tmp.length); + } else if (tmp.includes('part=')) { + part = tmp.substring(5, tmp.length); + } else if (tmp.includes('alt=')) { + alt = tmp.substring(4, tmp.length); + } + } + } + if ((img.length == 0 && video.length == 0) || device.length == 0) { + return; + } + let ret = ''; + function imgTag(url, alt) { + let i = ''; + i += ' 0) { + i += ' alt="' + alt + '"'; + } + i += '/>'; + return i; + } + if (video.length > 0) { + ret += '
              '; + ret += '
              0) { + ret += 'part="' + part + '">'; + } else { + ret += '>'; + } + ret += ' 0) { + ret += ' poster="' + img + '"'; + } + ret += ' playsinline="" muted="" loop="" autoplay="" preload="metadata">'; + ret += ''; + ret += ''; + + ret += '
              '; + ret += '
              '; + ret += '
              '; + } else if (img.length > 0) { + ret += '
              '; + ret += '
              0) { + ret += 'part="' + part + '">'; + } else { + ret += '>'; + } + ret += imgTag(img, alt); + ret += '
              '; + ret += '
              '; + if (alt.length > 0) { + ret += '' + alt + ''; + } + ret += '
              '; + } + return ret; +}); diff --git a/themes/volantis/scripts/tags/friends.js b/themes/volantis/scripts/tags/friends.js new file mode 100755 index 0000000..8b04664 --- /dev/null +++ b/themes/volantis/scripts/tags/friends.js @@ -0,0 +1,99 @@ +/** + * friends.js v1 | https://github.com/xaoxuu/hexo-theme-stellar/ + * 格式与官方标签插件一致使用空格分隔,中括号内的是可选参数(中括号不需要写出来) + * + * {% friends [only:group1] [not:group2] %} + */ + +'use strict'; + +hexo.extend.tag.register('friends', function(args) { + args = hexo.args.map(args, ['only', 'not', 'repo', 'api']); + if (args.only) { + if(/::/g.test(args.only)){ + args.only = args.only.split('::'); + }else{ + args.only = args.only.split(','); + } + } + if (args.not) { + if(/::/g.test(args.not)){ + args.not = args.not.split('::'); + }else{ + args.not = args.not.split(','); + } + } + var friends = hexo.locals.get('data').friends; + if (friends == undefined) { + friends = {}; + } + var api = args.api; + if (api) { + friends = { + group: { + api: api + } + } + } + var el = '
              '; + function groupHeader(group) { + var header = '
              '; + if (group.title) { + header += hexo.render.renderSync({text: group.title, engine: 'markdown'}).split('\n').join(''); + } + if (group.description) { + header += hexo.render.renderSync({text: group.description, engine: 'markdown'}).split('\n').join(''); + } + header += '
              '; + return header; + } + function cell(friend) { + if (friend.url && friend.title) { + var cell = '' + return cell; + } else { + return ''; + } + } + for (let groupId of Object.keys(friends)) { + function f() { + if (args.not && args.not.includes(groupId)) { + return; + } + if (groupId in friends) { + let group = friends[groupId]; + if (group.title || group.description) { + el += groupHeader(group); + } + if (group.api) { + el += '
              { + el += cell(friend); + }); + el += '
              '; + } + } + } + if (args.only) { + if (args.only.includes(groupId)) { + f(); + } + } else { + f(); + } + } + el += '
              '; + return el; +}); diff --git a/themes/volantis/scripts/tags/ghcard.js b/themes/volantis/scripts/tags/ghcard.js new file mode 100755 index 0000000..1722d66 --- /dev/null +++ b/themes/volantis/scripts/tags/ghcard.js @@ -0,0 +1,49 @@ +/** + * https://github.com/anuraghazra/github-readme-stats + */ + +'use strict'; + +// {% ghcard volantis-x %} +// {% ghcard volantis-x/hexo-theme-volantis %} +hexo.extend.tag.register('ghcard', function(args) { + if(/::/g.test(args)){ + args = args.join(' ').split('::'); + } + else{ + args = args.join(' ').split(','); + } + const path = args[0].trim(); + let card = ''; + card += ''; + let url = ''; + if (path.includes('/')) { + // is repo + const ps = path.split('/'); + url += 'https://github-readme-stats.xaoxuu.com/api/pin/?username=' + ps[0] + '&repo=' + ps[1]; + } else { + // is user + url += 'https://github-readme-stats.xaoxuu.com/api/?username=' + path; + } + if (args.length > 1) { + for (let i = 1; i < args.length; i++) { + const tmp = args[i].trim(); + url += '&' + tmp; + } + } + if (!url.includes('&show_owner=')) { + url += '&show_owner=true'; + } + card += ''; + card += ''; + return card; +}); + +hexo.extend.tag.register('ghcardgroup', function(args, content) { + let ret = ''; + // wrap + ret += '
              '; + ret += content; + ret += '
              '; + return ret; +}, {ends: true}); diff --git a/themes/volantis/scripts/tags/image.js b/themes/volantis/scripts/tags/image.js new file mode 100755 index 0000000..67ca27d --- /dev/null +++ b/themes/volantis/scripts/tags/image.js @@ -0,0 +1,103 @@ +/** + * image.js v4 | https://volantis.js.org + */ + +'use strict'; + +// {% image url %} +// {% image url, alt=haha %} +// {% image url, width=50% %} +// {% image url, height=32px %} +// {% image url, bg=#eee %} +// {% image url, alt=haha, width=400px %} +// {% image url, alt=haha, width=400px, bg=#eee %} +hexo.extend.tag.register('image', function(args) { + if(/::/g.test(args)){ + args = args.join(' ').split('::'); + } + else{ + args = args.join(' ').split(','); + } + const url = args[0].trim(); + let alt = ''; + let bg = ''; + let style = ''; + if (args.length > 1) { + for (let i = 1; i < args.length; i++) { + const tmp = args[i].trim(); + if (tmp.includes('alt=')) { + alt = tmp.substring(4, tmp.length); + } else if (tmp.includes('width=')) { + style += 'width:' + tmp.substring(6, tmp.length) + ';'; + } else if (tmp.includes('height=')) { + style += 'height:' + tmp.substring(7, tmp.length) + ';'; + } else if (tmp.includes('bg=')) { + bg = tmp.substring(3, tmp.length); + } + } + } + function img(url, alt, style) { + let img = ''; + img += ' 0) { + img += ' alt="' + alt + '"'; + } else { + img += ' alt="image"'; + } + if (style.length > 0) { + img += ' style="' + style + '"'; + } + img += '/>'; + return img; + } + + let ret = ''; + // wrap + ret += '
              '; + // bg + ret += '
              0) { + ret += ' style="background:' + bg + '"'; + } + ret += '>'; + ret += img(url, alt, style); + ret += '
              '; + + if (alt.length > 0) { + ret += '' + alt + ''; + } + + ret += '
              '; + return ret; +}); + + +// {% inlineimage url %} +// {% inlineimage url, height=22px %} +hexo.extend.tag.register('inlineimage', function(args) { + if(/::/g.test(args)){ + args = args.join(' ').split('::'); + } + else{ + args = args.join(' ').split(','); + } + const url = args[0].trim(); + let ret = ''; + ret += ' 1) { + for (let i = 1; i < args.length; i++) { + const tmp = args[i].trim(); + if (tmp.includes('height=')) { + style += 'height:' + tmp.substring(7, tmp.length) + ';'; + } + } + } + if (style.length > 0) { + ret += ' style="' + style + '"'; + } else { + ret += ' style="height:1.5em"'; + } + ret += '/>'; + return ret; +}); diff --git a/themes/volantis/scripts/tags/inline-labels.js b/themes/volantis/scripts/tags/inline-labels.js new file mode 100755 index 0000000..7664197 --- /dev/null +++ b/themes/volantis/scripts/tags/inline-labels.js @@ -0,0 +1,21 @@ +'use strict'; + + +hexo.extend.tag.register('u', function(args) { + return `${args.join(' ')}`; +}); +hexo.extend.tag.register('emp', function(args) { + return `${args.join(' ')}`; +}); +hexo.extend.tag.register('wavy', function(args) { + return `${args.join(' ')}`; +}); +hexo.extend.tag.register('del', function(args) { + return `${args.join(' ')}`; +}); +hexo.extend.tag.register('kbd', function(args) { + return `${args.join(' ')}`; +}); +hexo.extend.tag.register('psw', function(args) { + return `${args.join(' ')}`; +}); diff --git a/themes/volantis/scripts/tags/link.js b/themes/volantis/scripts/tags/link.js new file mode 100755 index 0000000..294c0c6 --- /dev/null +++ b/themes/volantis/scripts/tags/link.js @@ -0,0 +1,45 @@ +'use strict'; + +// {% link title, url %} +// {% link title, url, img %} +hexo.extend.tag.register('link', function(args) { + if(/::/g.test(args)){ + args = args.join(' ').split('::'); + } + else{ + args = args.join(' ').split(','); + } + let text = ''; + let url = ''; + let img = ''; + if (args.length < 2) { + return; + } else if (args.length == 2) { + text = args[0].trim(); + url = args[1].trim(); + } else if (args.length == 3) { + text = args[0].trim(); + url = args[1].trim(); + img = args[2].trim(); + } + let result = ''; + // 发现如果不套一层 div 在其它可渲染 md 的容器中容易被分解 + result += ''; + + return result; +}); + +hexo.extend.tag.register('linkgroup', function(args, content) { + let ret = ''; + ret += ''; + return ret; +}, {ends: true}); diff --git a/themes/volantis/scripts/tags/md.js b/themes/volantis/scripts/tags/md.js new file mode 100755 index 0000000..af155c9 --- /dev/null +++ b/themes/volantis/scripts/tags/md.js @@ -0,0 +1,59 @@ + +hexo.extend.tag.register('md', function(args) { + const {config} = hexo; + const md_path = args[0].trim(); + let md_id = "md-" + hexo.createUuid() + let mat = ` +
              + + ` + + return mat +}); diff --git a/themes/volantis/scripts/tags/media.js b/themes/volantis/scripts/tags/media.js new file mode 100755 index 0000000..1449a6b --- /dev/null +++ b/themes/volantis/scripts/tags/media.js @@ -0,0 +1,53 @@ +'use strict'; + +function postAudio(args) { + const src = args[0].trim(); + return `
              `; +} + +function postVideo(args) { + const {config} = hexo; + const src = args[0].trim(); + // m3u8 https://github.com/volantis-x/hexo-theme-volantis/issues/606 + // 文件扩展名为 .m3u8 + if (hexo.getType(src) === "m3u8") { + let video_id = `video-${hexo.createUuid()}` + return `
              + `; + } + return `
              `; +} + +function postVideos(args, content) { + if(/::/g.test(args)){ + args = args.join(' ').split('::'); + } + else{ + args = args.join(' ').split(','); + } + var cls = args[0]; + if (cls.length > 0) { + cls = ' ' + cls; + } + var col = Number(args[1]) || 0; + if (col > 0) { + return `
              ${content}
              `; + } + return `
              ${content}
              `; + +} + +hexo.extend.tag.register('audio', postAudio); +hexo.extend.tag.register('video', postVideo); +hexo.extend.tag.register('videos', postVideos, {ends: true}); diff --git a/themes/volantis/scripts/tags/note.js b/themes/volantis/scripts/tags/note.js new file mode 100755 index 0000000..b3c88d0 --- /dev/null +++ b/themes/volantis/scripts/tags/note.js @@ -0,0 +1,74 @@ +/** + * note.js | https://github.com/volantis-x/hexo-theme-volantis + */ + +'use strict'; + +// {% note style, content %} +function postNote(args) { + if(/::/g.test(args)){ + args = args.join(' ').split('::'); + } + else{ + args = args.join(' ').split(','); + } + if (args.length > 1) { + const cls = args[0].trim(); + const text = args[1].trim(); + return `
              ${hexo.render.renderSync({text: text, engine: 'markdown'}).split('\n').join('')}
              `; + } else if (args.length > 0) { + const text = args[0].trim(); + return `
              ${hexo.render.renderSync({text: text, engine: 'markdown'}).split('\n').join('')}
              `; + } +} + +// {% noteblock style, title %} +// content +// {% endnoteblock %} +function postNoteBlock(args, content) { + if(/::/g.test(args)){ + args = args.join(' ').split('::'); + } + else{ + args = args.join(' ').split(','); + } + if (args.length < 1) { + return; + } + const cls = args[0].trim(); + let ret = ''; + ret += '
              '; + if (args.length > 1) { + const title = args[1].trim(); + ret += '

              ' + title + '

              '; + } + ret += hexo.render.renderSync({text: content, engine: 'markdown'}).split('\n').join(''); + ret += '
              '; + return ret; +} + +hexo.extend.tag.register('note', postNote); + +// https://github.com/volantis-x/hexo-theme-volantis/issues/712 +// {% blocknote style, title %} +// content +// {% endblocknote %} +hexo.extend.tag.register('blocknote', postNoteBlock, {ends: true}); +// 兼容 noteblock +hexo.extend.filter.register('before_post_render', function(data) { + data.content = data.content.replace(/{%\s+noteblock(.*)%}/g, (p,q)=>{ + return `{% blocknote ${q} %}` + }); + data.content = data.content.replace(/{%\s+endnoteblock\s+%}/g, '{% endblocknote %}'); + return data; +}); +// 兼容 noteblock 失败 +hexo.extend.tag.register('noteblock', postNoteBlockDeprecated, {ends: true}); +function postNoteBlockDeprecated(args, content) { + throw new Error(` +================================================================================== + {% noteblock %} is deprecated. Use {% blocknote %} instead. + see: https://github.com/volantis-x/hexo-theme-volantis/issues/712 +================================================================================== + `); +} \ No newline at end of file diff --git a/themes/volantis/scripts/tags/pandown.js b/themes/volantis/scripts/tags/pandown.js new file mode 100755 index 0000000..e266685 --- /dev/null +++ b/themes/volantis/scripts/tags/pandown.js @@ -0,0 +1,33 @@ +'use strict'; + +// {% pandown type, url, pwd, fname %} +hexo.extend.tag.register('pandown', function(args) { + if(/::/g.test(args)){ + args = args.join(' ').split('::'); + } + else{ + args = args.join(' ').split(','); + } + let type = ''; + let url = ''; + let pwd = ''; + let fname = ''; + if (args.length < 4) { + return; + } else if (args[0].trim() === 'yun') { + return '

              对不起,pandown-tags不支持自定义


              Sorry, pandown-tags does not support customization

              ' + } else { + type = args[0].trim(); + url = args[1].trim(); + pwd = args[2].trim(); + fname = args[3].trim(); + } + let result = ''; + // js + result += '
              '; + //pandown + result += '' + //调用 + result += '
              ' + return result; +}); diff --git a/themes/volantis/scripts/tags/site.js b/themes/volantis/scripts/tags/site.js new file mode 100755 index 0000000..0448189 --- /dev/null +++ b/themes/volantis/scripts/tags/site.js @@ -0,0 +1,95 @@ +/** + * sites.js v1 | https://github.com/xaoxuu/hexo-theme-stellar/ + * 格式与官方标签插件一致使用空格分隔,中括号内的是可选参数(中括号不需要写出来) + * + * {% sites [only:group1] [not:group2] %} + */ + +'use strict'; + +hexo.extend.tag.register('sites', function(args) { + args = hexo.args.map(args, ['only', 'not', 'repo', 'api']); + if (args.only) { + args.only = args.only.split(','); + } + if (args.not) { + args.not = args.not.split(','); + } + var sites = hexo.locals.get('data').sites; + if (sites == undefined) { + sites = {}; + } + var api = args.api; + if (api) { + sites = { + group: { + api: api + } + } + } + var el = '
              '; + function groupHeader(group) { + var header = '
              '; + if (group.title) { + header += hexo.render.renderSync({text: group.title, engine: 'markdown'}).split('\n').join(''); + } + if (group.description) { + header += hexo.render.renderSync({text: group.description, engine: 'markdown'}).split('\n').join(''); + } + header += '
              '; + return header; + } + function cell(site) { + if (site.url && site.title) { + var cell = '' + return cell; + } else { + return ''; + } + } + for (let groupId of Object.keys(sites)) { + function f() { + if (args.not && args.not.includes(groupId)) { + return; + } + if (groupId in sites) { + let group = sites[groupId]; + if (group.title || group.description) { + el += groupHeader(group); + } + if (group.api) { + el += '
              { + el += cell(site); + }); + el += '
              '; + } + } + } + if (args.only) { + if (args.only.includes(groupId)) { + f(); + } + } else { + f(); + } + } + el += '
              '; + return el; +}); diff --git a/themes/volantis/scripts/tags/span.js b/themes/volantis/scripts/tags/span.js new file mode 100755 index 0000000..6ac9768 --- /dev/null +++ b/themes/volantis/scripts/tags/span.js @@ -0,0 +1,27 @@ +'use strict'; + +function postP(args) { + if(/::/g.test(args)){ + args = args.join(' ').split('::'); + } + else{ + args = args.join(' ').split(','); + } + const p0 = args[0].trim(); + const p1 = args[1].trim(); + return `

              ${p1}

              `; +} +function postSpan(args) { + if(/::/g.test(args)){ + args = args.join(' ').split('::'); + } + else{ + args = args.join(' ').split(','); + } + const p0 = args[0].trim(); + const p1 = args[1].trim(); + return `${p1}`; +} + +hexo.extend.tag.register('p', postP); +hexo.extend.tag.register('span', postSpan); diff --git a/themes/volantis/scripts/tags/swiper.js b/themes/volantis/scripts/tags/swiper.js new file mode 100755 index 0000000..928d6b4 --- /dev/null +++ b/themes/volantis/scripts/tags/swiper.js @@ -0,0 +1,38 @@ +/** + * swiper.js v1 | https://github.com/xaoxuu/hexo-theme-stellar/ + * 格式与官方标签插件一致使用空格分隔,中括号内的是可选参数(中括号不需要写出来) + * + * {% swiper %} + * ![img](src) + * {% endswiper %} + */ + +'use strict'; + +hexo.extend.tag.register('swiper', function (args, content) { + args = hexo.args.map(args, ['width']); + var el = ''; + function slide() { + let imgs = hexo.render.renderSync({ text: content, engine: 'markdown' }); + imgs = imgs.match(//gi); + if (imgs && imgs.length > 0) { + imgs.forEach((img, i) => { + img = img.replace(''; + }); + } + } + el += '
              0) { + el += ' ' + hexo.args.joinTags(args, 'width').join(' '); + } + el += '>'; + el += '
              '; + slide(); + el += '
              '; + el += '
              '; + el += '
              '; + el += '
              '; + el += '
              '; + return el; +}, { ends: true }); \ No newline at end of file diff --git a/themes/volantis/scripts/tags/table.js b/themes/volantis/scripts/tags/table.js new file mode 100755 index 0000000..8928c62 --- /dev/null +++ b/themes/volantis/scripts/tags/table.js @@ -0,0 +1,19 @@ +/** + * table.js | https://github.com/volantis-x/hexo-theme-volantis + */ + +'use strict'; + +// {% table title %} +// table markdown +// {% endtable %} + +function postTable(args, content) { + let ret = ''; + ret += '
              '; + ret += hexo.render.renderSync({text: content, engine: 'markdown'}); + ret += '
              '; + return ret; +} + +hexo.extend.tag.register('table', postTable, {ends: true}); diff --git a/themes/volantis/scripts/tags/tabs.js b/themes/volantis/scripts/tags/tabs.js new file mode 100755 index 0000000..e69d6eb --- /dev/null +++ b/themes/volantis/scripts/tags/tabs.js @@ -0,0 +1,89 @@ +/** + * tabs.js | https://theme-next.org/docs/tag-plugins/tabs + */ + +'use strict'; + +function postTabs(args, content) { + var tabBlock = /\n([\w\W\s\S]*?)/g; + + if(/::/g.test(args)){ + args = args.join(' ').split('::'); + } + else{ + args = args.join(' ').split(','); + } + var tabName = args[0]; + var tabActive = Number(args[1]) || 0; + + var matches = []; + var match; + var tabId = 0; + var tabNav = ''; + var tabContent = ''; + + !tabName && hexo.log.warn('Tabs block must have unique name!'); + + while ((match = tabBlock.exec(content)) !== null) { + matches.push(match[1]); + matches.push(match[2]); + } + + for (var i = 0; i < matches.length; i += 2) { + var tabParameters = matches[i].split('@'); + var postContent = matches[i + 1]; + var tabCaption = tabParameters[0] || ''; + var tabIcon = tabParameters[1] || ''; + var tabHref = ''; + + + // 兼容aplayer插件 https://github.com/volantis-x/hexo-theme-volantis/issues/575 + var aplayerTag=0 + var aplayerTagReg=/\/g + if(/class="aplayer aplayer-tag-marker"/g.test(postContent)){ + aplayerTag=aplayerTagReg.exec(postContent)[0] + postContent=postContent.replace(aplayerTagReg,"@aplayerTag@") + } + + // 兼容 gallery 标签 + var fancyboxTag=0 + var fancyboxTagReg = /\\<\/div\>\<\/div\>/g + if(/galleryFlag/g.test(postContent)) { + fancyboxTag=fancyboxTagReg.exec(postContent)[0] + postContent=postContent.replace(fancyboxTagReg,"@fancyboxTag@") + } + + postContent = hexo.render.renderSync({text: postContent, engine: 'markdown'}).trim(); + + if(aplayerTag){ + postContent=postContent.replace(/\\.*@aplayerTag@.*\<\/code><\/pre>/,aplayerTag) + } + + if(fancyboxTag){ + postContent=postContent.replace(/.*@fancyboxTag@.*/,fancyboxTag) + } + + tabId += 1; + tabHref = (tabName + ' ' + tabId).toLowerCase().split(' ').join('-'); + + ((tabCaption.length === 0) && (tabIcon.length === 0)) && (tabCaption = tabName + ' ' + tabId); + + var isOnlyicon = tabIcon.length > 0 && tabCaption.length === 0 ? ' style="text-align: center;"' : ''; + let icon = tabIcon.trim(); + icon = icon.startsWith('fa') ? icon : 'fa fa-' + icon; + tabIcon.length > 0 && (tabIcon = ``); + + var isActive = (tabActive > 0 && tabActive === tabId) || (tabActive === 0 && tabId === 1) ? ' active' : ''; + tabNav += `
            • ${tabIcon + tabCaption.trim()}
            • `; + tabContent += `
              ${postContent}
              `; + } + + tabNav = ``; + tabContent = `
              ${tabContent}
              `; + // https://github.com/volantis-x/hexo-theme-volantis/issues/703 + return `
              ${tabNav + tabContent}
              `; +} + +hexo.extend.tag.register('tabs', postTabs, {ends: true}); +hexo.extend.tag.register('subtabs', postTabs, {ends: true}); +hexo.extend.tag.register('subsubtabs', postTabs, {ends: true}); diff --git a/themes/volantis/scripts/tags/timeline.js b/themes/volantis/scripts/tags/timeline.js new file mode 100755 index 0000000..6dadf8f --- /dev/null +++ b/themes/volantis/scripts/tags/timeline.js @@ -0,0 +1,35 @@ +/** + * timeline.js | https://volantis.js.org/v3/tag-plugins/#Timeline + */ + +'use strict'; + +function postTimeline(args, content) { + if (args.length > 0) { + return `

              ${args}

              ${content}
              `; + } + return `
              ${content}
              `; + +} + +function postTimenode(args, content) { + if(/::/g.test(args)){ + args = args.join(' ').split('::'); + } + else{ + args = args.join(' ').split(','); + } + var time = args[0]; + return `

              ${hexo.render.renderSync({text: time, engine: 'markdown'})}

              ${hexo.render.renderSync({text: content, engine: 'markdown'}).split('\n').join('')}
              `; +} + + +// {% timeline %} +// ... timenode ... +// {% endtimeline %} +hexo.extend.tag.register('timeline', postTimeline, {ends: true}); + +// {% timenode time %} +// what happened +// {% endtimenode %} +hexo.extend.tag.register('timenode', postTimenode, {ends: true}); diff --git a/themes/volantis/source/css/Readme.md b/themes/volantis/source/css/Readme.md new file mode 100755 index 0000000..22f5328 --- /dev/null +++ b/themes/volantis/source/css/Readme.md @@ -0,0 +1,28 @@ +# 样式文件说明 + +## 样式拆分说明 + +方案是对 https://blog.skk.moe/post/improve-fcp-for-my-blog/ 的开源实现 + +### first.styl + +首屏样式, 内含 首屏基础样式、 cover、 navbar、 首屏search、首屏暗黑模式、首屏字体 等样式, 首屏样式采用硬编码的方式写在HTML中. + +内联硬编码自动化方案 see:scripts/helpers/first-style/index.js + +### style.styl + +异步加载样式, 除首屏样式外的其他样式, 最终生成 /css/style.css 异步加载. + +## 暗黑模式样式说明 + +暗黑模式样式被拆分为首屏暗黑模式样式和异步暗黑模式样式,其中在 source/css/ 文件夹下: + +_first/dark_first.styl : 包含 首屏暗黑模式样式 的 暗黑模式 CSS 变量 和 强制覆盖样式 + +_style/_plugins/_dark : 异步暗黑模式样式文件夹 + +_style/_plugins/_dark/dark_async.styl : 包含 异步暗黑模式样式 的 暗黑模式 CSS 变量 + +_style/_plugins/_dark/dark_plugins.styl : 包含 异步暗黑模式样式 的 强制覆盖样式 + diff --git a/themes/volantis/source/css/_defines/AutoPrefixCSS.styl b/themes/volantis/source/css/_defines/AutoPrefixCSS.styl new file mode 100755 index 0000000..c879e4e --- /dev/null +++ b/themes/volantis/source/css/_defines/AutoPrefixCSS.styl @@ -0,0 +1,347 @@ +// AutoPrefixCSS +// https://github.com/stylus/nib + +vendor-prefixes ?= webkit khtml moz o ms + +vendor(prop, only = null ,vendor-property = true, args) + if (only and official in only) or !only + {prop}: args + if vendor-property + for prefix in vendor-prefixes + unless only and !(prefix in only) + {'-' + prefix + '-' + prop}: args + +// A + +animation() + vendor(prop:'animation', only: null, vendor-property: true, args:arguments) + +// B +box-orient() + vendor(prop:'box-orient', only: webkit moz ms official, vendor-property: true, args:arguments) + +box-pack() + vendor(prop:'box-pack', only: webkit moz ms official, vendor-property: true, args:arguments) + +border-radius() + vendor(prop:'border-radius', only: webkit official, vendor-property: true, args:arguments) + +box-shadow() + vendor(prop:'box-shadow', only: webkit official, vendor-property: true, args:arguments) + +border-image() + vendor(prop:'border-image', only: webkit moz o official, vendor-property: true, args:arguments) + +background-image() + if match('-gradient\(', ''+arguments) + vendor(prop:'background-image', only: null, vendor-property: false, args:arguments) + else + background-image arguments + +box-sizing() + vendor(prop:'box-sizing', only: webkit moz official, vendor-property: true, args:arguments) + +backface-visibility() + vendor(prop:'backface-visibility', only: webkit moz ms official, vendor-property: true, args:arguments) + +background-size() + vendor(prop:'background-size', only: webkit moz official, vendor-property: true, args:arguments) + +/* + * Legacy syntax support for background-clip and background-origin + */ + +legacy-bg-values(property, args) + legacy_args = () + importance = unquote('') + for subargs in args + for arg in subargs + if arg in (border-box padding-box content-box) + arg = unquote('border') if arg == border-box + arg = unquote('padding') if arg == padding-box + arg = unquote('content') if arg == content-box + if arg != '!important' + push(legacy_args,arg) + else + importance = !important + vendor(prop:property, only: moz webkit, vendor-property: true, args: unquote(join(', ',legacy_args)) importance) + +background-clip() + if arguments[0] == text + vendor(prop:'background-clip', only: webkit, vendor-property: true, args:arguments) + else + legacy-bg-values('background-clip', arguments) + background-clip: arguments +// C + + +column-count() + vendor(prop:'column-count', only: webkit moz official, vendor-property: true, args:arguments) + +column-gap() + vendor(prop:'column-gap', only: webkit moz official, vendor-property: true, args:arguments) + +column-rule() + vendor(prop:'column-rule', only: webkit moz official, vendor-property: true, args:arguments) + +column-rule-color() + vendor(prop:'column-rule-color', only: webkit moz official, vendor-property: true, args:arguments) + +column-rule-width() + vendor(prop:'column-rule-width', only: webkit moz official, vendor-property: true, args:arguments) + +column-rule-style() + vendor(prop:'column-rule-style', only: webkit moz official, vendor-property: true, args:arguments) + +column-width() + vendor(prop:'column-width', only: webkit moz official, vendor-property: true, args:arguments) + +column-span() + vendor(prop:'column-span', only: webkit official, vendor-property: true, args:arguments) + +column-fill() + vendor(prop:'column-fill', only: moz, vendor-property: true, args:arguments) + + +// D +display(value) + // Initializing a flexbox container + display -webkit-box /* OLD - iOS 6-, Safari 3.1-6 */ + display -moz-box /* OLD - Firefox 19- (buggy but mostly works) */ + if value == inline-flex + display -ms-inline-flexbox /* TWEENER - IE 10 */ + display -webkit-inline-flex /* NEW - Chrome */ + display value /* NEW, Spec - Opera 12.1, Firefox 20+ */ + else if value == flex + display -ms-flexbox /* TWEENER - IE 10 */ + display -webkit-flex /* NEW - Chrome */ + display flex /* NEW, Spec - Opera 12.1, Firefox 20+ */ + + if arguments != 'flex' + display: arguments; + else + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + +// E + +// F +flex-wrap(value) + // Implementation of the flex-wrap attribute. + vendor(prop:'flex-wrap',only: null, vendor-property: true, args:value) + +flex-flow() + vendor(prop:'flex-flow',only: null, vendor-property: true, args:arguments) + +flex-direction(value) + // Implementation of flex-direction attributes. + if value == row + -webkit-box-direction normal + -moz-box-direction normal + -webkit-box-orient horizontal + -moz-box-orient horizontal + else if value == row-reverse + -webkit-box-direction reverse + -moz-box-direction reverse + -webkit-box-orient horizontal + -moz-box-orient horizontal + else if value == column + -webkit-box-direction normal + -moz-box-direction normal + -webkit-box-orient vertical + -moz-box-orient vertical + else if value == column-reverse + -webkit-box-direction reverse + -moz-box-direction reverse + -webkit-box-orient vertical + -moz-box-orient vertical + -webkit-flex-direction value + -ms-flex-direction value + flex-direction value + +flexbox(value) + // Initializing a flexbox container + display -webkit-box /* OLD - iOS 6-, Safari 3.1-6 */ + display -moz-box /* OLD - Firefox 19- (buggy but mostly works) */ + if value == inline-flex + display -ms-inline-flexbox /* TWEENER - IE 10 */ + display -webkit-inline-flex /* NEW - Chrome */ + display value /* NEW, Spec - Opera 12.1, Firefox 20+ */ + else if value == flex + display -ms-flexbox /* TWEENER - IE 10 */ + display -webkit-flex /* NEW - Chrome */ + display flex /* NEW, Spec - Opera 12.1, Firefox 20+ */ + +flex(grow = 0, shrink = 0) + // For configuring the flex elements + -webkit-box-flex grow + -moz-box-flex grow + -webkit-flex grow shrink + -ms-flex grow shrink + flex grow shrink + +flex-content(value) + // Implements the align-content settings + if value == space-around + -webkit-align-content value + -ms-flex-line-pack distribute + align-content value + else if value == space-between + -webkit-align-content value + -ms-flex-line-pack justify + align-content value + else if value == end or value == start + -webkit-align-content flex-+value + -ms-flex-line-pack value + align-content flex-+value + else + -webkit-align-content value + -ms-flex-line-pack value + align-content value + +flex-align(value) + // Function for align-items + if value == start or value == end + -webkit-box-align value + -moz-box-align value + -webkit-align-items flex-+value + -ms-flex-align value + align-items flex-+value + else + -webkit-box-align value + -moz-box-align value + -webkit-align-items value + -ms-flex-align value + +flex-firefox() + // Helper to manage inline bugs in legacy Firefox + width 100% + -moz-box-sizing border-box + +flex-group(value) + // Manages ordering of the flex elements within a container + -webkit-box-ordinal-group value + -moz-box-ordinal-group value + -ms-flex-order value + -webkit-order value + order value + +flex-self(value) + // Function for aligning the flex elements (align-self) + if value == start or value == end + -webkit-align-self flex-+value + -ms-flex-item-align value + align-self flex-+value + else + -webkit-align-self value + -ms-flex-item-align value + align-self value + +flex-justify(value) + // Implements the justify-content settings. + if value == start || value == end + -webkit-box-pack value + -moz-box-pack value + -webkit-justify-content flex-+value + -ms-flex-pack value + justify-content flex-+value + else if value == center + -webkit-box-pack value + -moz-box-pack value + -webkit-justify-content value + -ms-flex-pack value + justify-content value + else if value == space-between + -webkit-box-pack justify + -moz-box-pack justify + -webkit-justify-content value + -ms-flex-pack justify + justify-content value + else if value == space-around + -webkit-box-pack justify + -moz-box-pack justify + -webkit-justify-content value + -ms-flex-pack distribute + justify-content value + + +font-smoothing() + vendor(prop:'font-smoothing', only: webkit, vendor-property: true, args:arguments) +// G + +// H + +// I + +// J +justify-content() + vendor(prop:'justify-content',only: null, vendor-property: true, args:arguments) + +// K + +// L + +// M + +// N + +// O + +opacity() + vendor(prop:'opacity', only: webkit moz official, vendor-property: true, args:arguments) + +// P +print-color-adjust() + vendor(prop:'print-color-adjust',only: null, vendor-property: true, args:arguments) + +// Q + +// R + +// S + +// T +text-size-adjust() + vendor(prop:'text-size-adjust', only: null, vendor-property: true, args:arguments) + +transition() + vendor(prop:'transition', only: null, vendor-property: true, args:arguments) + +transition-property() + vendor(prop:'transition-property', only: null, vendor-property: true, args:arguments) + +transition-duration() + vendor(prop:'transition-duration', only: null, vendor-property: true, args:arguments) + +transition-timing-function() + vendor(prop:'transition-timing-function', only: null, vendor-property: true, args:arguments) + +transition-delay() + vendor(prop:'transition-delay', only: null, vendor-property: true, args:arguments) + +transform() + vendor(prop:'transform', only: null, vendor-property: true, args:arguments) + +transform-origin() + vendor(prop:'transform-origin', only: null, vendor-property: true, args:arguments) + +transform-style() + vendor(prop:'transform-style', only: null, vendor-property: true, args:arguments) + +// U +user-select() + vendor(prop:'user-select', only: webkit moz ms official, vendor-property: true, args:arguments) + + +// V + +// W + +// X + +// Y + +// Z + diff --git a/themes/volantis/source/css/_defines/Readme.md b/themes/volantis/source/css/_defines/Readme.md new file mode 100755 index 0000000..20b6189 --- /dev/null +++ b/themes/volantis/source/css/_defines/Readme.md @@ -0,0 +1,3 @@ +# 定义变量 + +这里存放一些 变量 或 工具函数 ,不建议存放样式 \ No newline at end of file diff --git a/themes/volantis/source/css/_defines/color.styl b/themes/volantis/source/css/_defines/color.styl new file mode 100755 index 0000000..8d97ae7 --- /dev/null +++ b/themes/volantis/source/css/_defines/color.styl @@ -0,0 +1,117 @@ +// -------- 这些是方便开发预定义的颜色,不需要动态改变 -------- +$color-md-red = #f44336 +$color-md-pink = #E91E63 +$color-md-purple = #9c27b0 +$color-md-deep-purple = #673ab7 +$color-md-indigo = #3f51b5 +$color-md-light-blue = #4BA7EE +$color-md-blue = #2196f3 +$color-md-deep-blue = #3367d6 +$color-md-teal = #009688 +$color-md-green = #4caf50 +$color-md-light-green = #8bc34a +$color-md-orange = #ff9800 +$color-md-deep-orange = #ff5722 +$color-md-brown = #795548 +$color-md-blue-grey = #607d8b +$color-md-grey = #9e9e9e +$color-md-light-grey =#e0e0e0 +$color-md-yellow = #FCEC60 +$color-md-amber = #F6C344 + +$color-mac-cyan = #1BCDFC +$color-mac-green = #3DC550 +$color-mac-yellow = #FFBD2B +$color-mac-red = #FE5F58 + +$color-google-blue = #4688F1 +$color-google-green = #3AA757 +$color-google-yellow = #FABB2D +$color-google-red = #E8453C + +$color-read-bkg = #e0d8c8 +$color-read-post = #f8f1e2 + + +// common +$color-theme = convert(hexo-config('color_scheme.common.theme')) +$color-link = convert(hexo-config('color_scheme.common.link')) +$color-button = convert(hexo-config('color_scheme.common.button')) +$color-hover = convert(hexo-config('color_scheme.common.hover')) +$color-inner = convert(hexo-config('color_scheme.common.inner')) +$color-selection = convert(hexo-config('color_scheme.common.selection')) + + +// -------- 动态配色方案 -------- +// 默认浅色 +$color-site-bg = convert(hexo-config('color_scheme.light.site_bg')) +$color-site-inner = convert(hexo-config('color_scheme.light.site_inner')) +$color-site-footer = convert(hexo-config('color_scheme.light.site_footer')) +$color-card = convert(hexo-config('color_scheme.light.card')) +$color-text = convert(hexo-config('color_scheme.light.text')) + +$color-block = convert(hexo-config('color_scheme.light.block')) +$color-codeblock = convert(hexo-config('color_scheme.light.codeblock')) +$color-inlinecode = convert(hexo-config('color_scheme.light.inlinecode')) +$color-h1 = convert(hexo-config('color_scheme.light.h1')) +$color-h2 = convert(hexo-config('color_scheme.light.h2')) +$color-h3 = convert(hexo-config('color_scheme.light.h3')) +$color-h4 = convert(hexo-config('color_scheme.light.h4')) +$color-h5 = convert(hexo-config('color_scheme.light.h5')) +$color-h6 = convert(hexo-config('color_scheme.light.h6')) +$color-p = convert(hexo-config('color_scheme.light.p')) +$color-list = convert(hexo-config('color_scheme.light.list')) +$color-list-hl = convert(hexo-config('color_scheme.light.list_hl')) +$color-meta = convert(hexo-config('color_scheme.light.meta')) +$color-copyright-bkg = convert(hexo-config('color_scheme.light.copyright_bkg')) + +// 深色配色方案在 darkmode.styl 中按需加载 +$color-dark-site-body = convert(hexo-config('color_scheme.dark.site_bd')) // Dark Grey 1 +$color-dark-read-bkg = convert(hexo-config('color_scheme.dark.site_bg')) +$color-dark-read-post = convert(hexo-config('color_scheme.dark.card')) +$color-dark-site-bg = convert(hexo-config('color_scheme.dark.site_bg')) // Dark Grey 2 +$color-dark-site-inner = convert(hexo-config('color_scheme.dark.site_inner')) +$color-dark-site-footer = convert(hexo-config('color_scheme.dark.site_footer')) +$color-dark-card = convert(hexo-config('color_scheme.dark.card')) // Dark Grey 3 +$color-dark-text = convert(hexo-config('color_scheme.dark.text')) + +$color-dark-block = convert(hexo-config('color_scheme.dark.block')) // Dark Grey 4 +$color-dark-codeblock = convert(hexo-config('color_scheme.dark.codeblock')) +$color-dark-inlinecode = convert(hexo-config('color_scheme.dark.inlinecode')) +$color-dark-h1 = convert(hexo-config('color_scheme.dark.h1')) +$color-dark-h2 = convert(hexo-config('color_scheme.dark.h2')) +$color-dark-h3 = convert(hexo-config('color_scheme.dark.h3')) +$color-dark-h4 = convert(hexo-config('color_scheme.dark.h4')) +$color-dark-h5 = convert(hexo-config('color_scheme.dark.h5')) +$color-dark-h6 = convert(hexo-config('color_scheme.dark.h6')) +$color-dark-p = convert(hexo-config('color_scheme.dark.p')) +$color-dark-list = convert(hexo-config('color_scheme.dark.list')) +$color-dark-list-hl = convert(hexo-config('color_scheme.dark.list_hl')) +$color-dark-meta = convert(hexo-config('color_scheme.dark.meta')) +$color-dark-link = convert(hexo-config('color_scheme.dark.meta')) +$color-dark-copyright-bkg = convert(hexo-config('color_scheme.dark.copyright_bkg')) + +bgcolor($c, $mix = 10) + return mix($c, $color-card, $mix) + +list_active() + color: var(--color-list-hl) +list_hover() + color: var(--color-list-hl) + background: var(--color-site-bg) + +// tag plugin from stellar : color +// 浅色页面 +$c-site-bg-light = #f8f8f8 +$c-block-light = #f2f2f2 +$c-title-light = #000 +$c-text-light = #222 +$c-card-light = white + +// 深色页面 +$c-site-bg-dark = black +$c-block-dark = #111 +$c-title-dark = #fff +$c-text-dark = #fff +$c-card-dark = #333 + diff --git a/themes/volantis/source/css/_defines/effect.styl b/themes/volantis/source/css/_defines/effect.styl new file mode 100755 index 0000000..847a9bf --- /dev/null +++ b/themes/volantis/source/css/_defines/effect.styl @@ -0,0 +1,11 @@ +@require('func') +// shadow +$boxshadow-card = 0 1px 2px 0px rgba(0, 0, 0, 0.1) +$boxshadow-card-float = 0 2px 4px 0px rgba(0, 0, 0, 0.1), 0 4px 8px 0px rgba(0, 0, 0, 0.1), 0 8px 16px 0px rgba(0, 0, 0, 0.1) + +$boxshadow-float = 0 4px 8px 0px rgba(0, 0, 0, 0.1) + +$boxshadow-dropmenu = 0 2px 4px 0px rgba(0, 0, 0, 0.08), 0 4px 8px 0px rgba(0, 0, 0, 0.08), 0 8px 16px 0px rgba(0, 0, 0, 0.08) + +$textshadow = 0 1px 2px 0px rgba(0, 0, 0, 0.1) + diff --git a/themes/volantis/source/css/_defines/fonts.styl b/themes/volantis/source/css/_defines/fonts.styl new file mode 100755 index 0000000..e4a2472 --- /dev/null +++ b/themes/volantis/source/css/_defines/fonts.styl @@ -0,0 +1,57 @@ +$fontfamily = "PingFang SC", "Microsoft YaHei", Helvetica, Arial, Menlo, Monaco, monospace, "Lucida Console", sans-serif +if hexo-config('custom_css.fontfamily.bodyfont') + if hexo-config('custom_css.fontfamily.bodyfont.fontfamily') + $fontfamily = convert(hexo-config('custom_css.fontfamily.bodyfont.fontfamily')), Menlo, Monaco, monospace, sans-serif + + +$fontfamily-code = Menlo, Monaco, monospace, courier, sans-serif +if hexo-config('custom_css.fontfamily.codefont') + if hexo-config('custom_css.fontfamily.codefont.fontfamily') + $fontfamily-code = convert(hexo-config('custom_css.fontfamily.codefont.fontfamily')), monospace, courier, sans-serif + + + +$fontfamily-logo = $fontfamily +if hexo-config('custom_css.fontfamily.logofont') + if hexo-config('custom_css.fontfamily.logofont.fontfamily') + $fontfamily-logo = convert(hexo-config('custom_css.fontfamily.logofont.fontfamily')), Helvetica, monospace + + + + +// font size +$fontsize-root = convert(hexo-config('custom_css.fontsize.root')) || 16px +$fontsize-h1 = convert(hexo-config('custom_css.fontsize.h1')) || 1.625rem // 26px +$fontsize-h2 = convert(hexo-config('custom_css.fontsize.h2')) || 1.625rem // 26px bottom line +$fontsize-h3 = convert(hexo-config('custom_css.fontsize.h3')) || 1.375rem // 22px colorful title +$fontsize-h4 = convert(hexo-config('custom_css.fontsize.h4')) || 1.125rem // 18px +$fontsize-h5 = convert(hexo-config('custom_css.fontsize.h5')) || 1rem // 16px bold +$fontsize-h6 = convert(hexo-config('custom_css.fontsize.h6')) || 1rem // 16px +$fontsize-list = convert(hexo-config('custom_css.fontsize.list')) || .9375rem // 15px +$fontsize-meta = convert(hexo-config('custom_css.fontsize.meta')) || .875rem // 14px +$fontsize-code = convert(hexo-config('custom_css.fontsize.code')) || .8125rem // 13px +$fontsize-footnote = convert(hexo-config('custom_css.fontsize.footnote')) || .75rem // the smallest (12px) + +// line-height +$lineheight = hexo-config('custom_css.gap.line_height') || 1.7 + +$fontsize-large = 2.5rem +$fontsize-huge = 4rem +$fontsize-ultra = 6rem + + +// font size +$fs-root = 16px +$fs-15 = .9375rem +$fs-14 = .875rem +$fs-13 = .8125rem +$fs-12 = .75rem + +$fs-h1 = 2rem // 32px +$fs-h2 = 1.5rem // 24px +$fs-h3 = 1.375rem // 22px +$fs-h4 = 1.125rem // 18px +$fs-h5 = $fs-15 +$fs-h6 = $fs-12 +$fs-p = $fs-15 +$fs-code = $fs-13 diff --git a/themes/volantis/source/css/_defines/func.styl b/themes/volantis/source/css/_defines/func.styl new file mode 100755 index 0000000..6ec4632 --- /dev/null +++ b/themes/volantis/source/css/_defines/func.styl @@ -0,0 +1,69 @@ +// 为1个属性设置动画 +trans1($op, $time = 0.2s) + transition: $op $time ease-out + +// 为2个属性设置动画 +trans2($op1, $op2) + transition: $op1 0.2s ease-out, $op2 0.2s ease-out + +trans2pro($op1, $t1, $op2, $t2) + transition: $op1 $t1 ease-out, $op2 $t2 ease-out + +trans3($op1, $op2, $op3) + transition: $op1 0.2s ease-out, $op2 0.2s ease-out, $op3 0.2s ease-out + +trans($time = 0.28s) + transition: all $time ease + +hoverable-card() + trans() + &:hover + box-shadow: 0 0 4px rgba(0,0,0,.1), 0 0 8px rgba(0,0,0,.08) + +txt-ellipsis() + white-space: nowrap + overflow: hidden + text-overflow: ellipsis + +placeholder(rules) + &::-webkit-input-placeholder + rules() + &:-moz-placeholder + rules() + &::-moz-placeholder + rules() + &:-ms-input-placeholder + rules() + +disable-user-select() + user-select: none + +scrollbar($w = 4px, $b = 2px, $c = $color-theme, $h = $color-hover) + &::-webkit-scrollbar + height: $w + width: $w + &::-webkit-scrollbar-track-piece + background: transparent + &::-webkit-scrollbar-thumb + background: $c + cursor: pointer + border-radius: $b + &:hover + background: $h + + +scrollbar-codeblock() + &::-webkit-scrollbar + height: 4px + width: 4px + &::-webkit-scrollbar-track-piece + background: transparent + &::-webkit-scrollbar-thumb + background: transparent + cursor: pointer + border-radius: $border-codeblock + &:hover + &::-webkit-scrollbar-thumb + background: alpha($color-text, .5) + &:hover + background: $color-hover diff --git a/themes/volantis/source/css/_defines/layout.styl b/themes/volantis/source/css/_defines/layout.styl new file mode 100755 index 0000000..d8eeff4 --- /dev/null +++ b/themes/volantis/source/css/_defines/layout.styl @@ -0,0 +1,43 @@ +// device defines +$device-mobile-s = 320px +$device-mobile-m = 375px +$device-mobile-l = 425px +$device-mobile = 500px +$device-tablet = 768px +$device-laptop = 1024px +$device-desktop = 1440px +$device-2k = 2048px +$device-4k = 2560px + + +// site layout +$layout-width = convert(hexo-config('custom_css.max_width')) || 1080px +$sidebar = 240px +$modal-threshold = 680px +$navbar-height = convert(hexo-config('custom_css.navbar.height')) || 64px + +// gap +$gap = convert(hexo-config('custom_css.gap.base')) || 16px // base gap +$gap-h2 = convert(hexo-config('custom_css.gap.h2')) || 48px +$gap-h3 = convert(hexo-config('custom_css.gap.h3')) || 32px +$gap-h4 = convert(hexo-config('custom_css.gap.h4')) || 16px +// 新的段落间距,以实际字体大小为基准 +$gap-p = convert(hexo-config('custom_css.gap.p')) || 1em + + + +// border width +$border-line = 2px + +// border radius +$border-card = convert(hexo-config('custom_css.border_radius.card')) || 12px +$border-codeblock = convert(hexo-config('custom_css.border_radius.codeblock')) || 4px +$border-searchbar = convert(hexo-config('custom_css.border_radius.searchbar')) || 8px +$border-button = convert(hexo-config('custom_css.border_radius.button')) || 2px + +// text align +$textalign-h1 = convert(hexo-config('custom_css.body.text_align.h1')) || left +$textalign-h2 = convert(hexo-config('custom_css.body.text_align.h2')) || left +$textalign-h3 = convert(hexo-config('custom_css.body.text_align.h3')) || left +$textalign-h4 = convert(hexo-config('custom_css.body.text_align.h4')) || left +$textalign-p = convert(hexo-config('custom_css.body.text_align.p')) || justify diff --git a/themes/volantis/source/css/_first/base_first.styl b/themes/volantis/source/css/_first/base_first.styl new file mode 100755 index 0000000..e3831ce --- /dev/null +++ b/themes/volantis/source/css/_first/base_first.styl @@ -0,0 +1,121 @@ +:root + --color-site-body: $color-site-bg + --color-site-bg: $color-site-bg + --color-site-inner: $color-site-inner + --color-site-footer: $color-site-footer + --color-card: $color-card + --color-text: $color-text + --color-block: $color-block + --color-inlinecode: $color-inlinecode + --color-codeblock: $color-codeblock + --color-h1: $color-h1 + --color-h2: $color-h2 + --color-h3: $color-h3 + --color-h4: $color-h4 + --color-h5: $color-h5 + --color-h6: $color-h6 + --color-p: $color-p + --color-list: $color-list + --color-list-hl: $color-list-hl + --color-meta: $color-meta + --color-read-bkg: $color-read-bkg + --color-read-post: $color-read-post + --color-copyright-bkg: $color-copyright-bkg + +* + box-sizing: border-box + outline: none + margin: 0 + padding: 0 + scrollbar() + +html + color: var(--color-text) + width: 100% + height: 100% + font-family: $fontfamily + font-size: $fontsize-root + > + if hexo-config('custom_css.scrollbar.size') + scrollbar(convert(hexo-config('custom_css.scrollbar.size')), convert(hexo-config('custom_css.scrollbar.border')) || 0px) + +body + background-color: var(--color-site-body) + text-rendering: optimizelegibility + -webkit-tap-highlight-color: rgba(0, 0, 0, 0) + line-height: $lineheight + -webkit-text-size-adjust: 100% + -ms-text-size-adjust: 100% + &.modal-active + overflow: hidden + @media screen and (max-width: $modal-threshold) + position: fixed + top: 0 + right: 0 + bottom: 0 + left: 0 + +a + color: $color-link + cursor: pointer + text-decoration: none + trans() + &:hover + color: $color-hover + &:active,&:hover + outline: 0 + +ul,ol + padding-left: 0 + li + list-style: none + +header + display: block + +img + border: 0 + background: none + max-width: 100% + +svg:not(:root) + overflow: hidden + +hr + -moz-box-sizing: content-box + box-sizing: content-box + height: 0 + border: 0 + border-radius: 1px + border-bottom: 1px solid alpha($color-text, .1) + +button,input + color: inherit + font: inherit + margin: 0 + +button + overflow: visible + text-transform: none + -webkit-appearance: button + cursor: pointer + + +.blur + @supports (backdrop-filter: blur(20px)) + background: alpha($color-card, .9) !important + backdrop-filter: saturate(200%) blur(20px) + +if hexo-config('comments.service')=='discuss' || hexo-config('comments.service')=='twikoo' || hexo-config('comments.service')=='waline' + .blur#comments + @supports (backdrop-filter: blur(20px)) + backdrop-filter: unset + #layoutHelper-comments + margin-bottom: 100px + +.shadow + box-shadow: $boxshadow-card + &.floatable + trans() + &:hover + box-shadow: $boxshadow-card-float diff --git a/themes/volantis/source/css/_first/cover_first.styl b/themes/volantis/source/css/_first/cover_first.styl new file mode 100755 index 0000000..5e2a9bd --- /dev/null +++ b/themes/volantis/source/css/_first/cover_first.styl @@ -0,0 +1,304 @@ +#l_cover + min-height: $navbar-height + +.cover-wrapper + top: 0 + left: 0 + max-width: 100% + height: 100vh + display: flex + flex-wrap: nowrap + flex-direction: column + align-items: center + align-self: center + align-content: center + color: var(--color-site-inner) + padding: 0 $gap + disable-user-select() + position: relative + overflow: hidden + margin-bottom: -100px + + if not hexo-config('plugins.parallax.enable') and hexo-config('cover.background') + .cover-bg + position: absolute + width: 100% + height: 100% + background-position: center + background-size: cover + &.lazyload + &:not(.loaded) + opacity: 0 + &.loaded + animation-delay: 0s + animation-duration: .5s + animation-fill-mode: forwards + animation-timing-function: ease-out + animation-name: fadeIn + @keyframes fadeIn + 0% + opacity: 0 + filter blur(12px) + transform: scale(1.02) + 100% + opacity: 1 + + .cover-body + z-index: 1 + position: relative + width: 100% + height: 100% + &#full + height: "calc(%s + 100px)" % 100vh + padding-bottom: 100px + &#half + max-height: 640px + min-height: 400px + height: "calc(36vh - %s + 200px)" % $navbar-height + + #scroll-down + width: 100% + height: 64px + position: absolute + bottom: 100px + text-align: center + cursor: pointer + .scroll-down-effects + color: white + font-size: 24px + line-height: 64px + position: absolute + width: 24px + left: "calc(50% - %s)" % 12px + text-shadow: 0 1px 2px rgba(0, 0, 0, .1) + animation: scroll-down-effect 1.5s infinite + @keyframes scroll-down-effect + 0% + top: 0 + opacity: 1 + 50% + top: -16px + opacity: .4 + 100% + top: 0 + opacity: 1 + + +.cover-wrapper .cover-body + margin-top: $navbar-height + margin-bottom: 100px + &,.top,.bottom + display: flex + flex-direction: column + align-items: center + justify-content: center + max-width: 100% + .bottom + margin-top: $gap * 2 + .title + font-family: $fontfamily-logo + font-size: $fontsize-large * 1.25 + line-height: 1.2 + text-shadow: 0 1px 2px rgba(0, 0, 0, .1) + .subtitle + font-size: $fontsize-root * 1.25 + .logo + max-height: 120px + max-width: "calc(100% - 4 * %s)" % $gap + @media screen and (min-height: 1024px) + .title + font-size: $fontsize-large * 1.2 + .subtitle + font-size: $fontsize-meta * 1.2 + .logo + max-height: 150px + .m_search + $iconW = 32px + $iconMargin = 4px + position: relative + max-width: "calc(100% - %s)" % 16px + width: 320px + vertical-align: middle + .form + position: relative + display: block + width: 100% + .icon,.input + trans() + .icon + position: absolute + display:block + line-height: 2.5rem + width: $iconW + top: 0 + left: $iconMargin+1px + color: alpha($color-p, .75) + .input + display: block + height: 2.5rem + width: 100% + box-shadow: none + box-sizing: border-box + font-size: $fontsize-meta + -webkit-appearance: none + padding-left: $iconW + $iconMargin + @media screen and (max-width: $device-mobile) + padding-left: $iconW + $iconMargin + border-radius: 1.4rem + background: alpha($color-card, .6) + backdrop-filter: blur(10px) + border: none + color: var(--color-text) + &:hover + background: alpha($color-card, .8) + &:focus + background: alpha($color-card, 1) + + +.cover-wrapper .list-h + display: flex + flex-direction: row + flex-wrap: wrap + align-items: stretch + border-radius: $border-button + disable-user-select() + a + flex: 1 + display: flex + font-weight: 600 + img + display: block + border-radius: 2px + margin: $gap * 0.25 + min-width: 40px + max-width: 44px + @media screen and (max-width: $device-tablet) + min-width: 36px + max-width: 40px + @media screen and (max-width: $device-mobile) + margin: 2px $gap * 0.25 + min-width: 32px + max-width: 36px + @media screen and (max-width: $device-mobile-m) + min-width: 28px + max-width: 32px + + +.cover-wrapper + max-width: 100% + &.search .bottom .menu + margin-top: $gap + .list-h a + white-space: nowrap + flex-direction: row + align-items: baseline + padding: 2px + margin: 4px + color: var(--color-site-inner) + opacity: .75 + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.05) + border-bottom: 2px solid transparent + i + margin-right: 4px + p + font-size: $fontsize-list + &:hover, &.active, &:active + opacity: 1 + border-bottom: 2px solid var(--color-site-inner) + if hexo-config('cover.layout_scheme') == 'dock' || hexo-config('cover.layout_scheme') == 'featured' || hexo-config('cover.layout_scheme') == 'focus' + &.dock .menu, &.featured .menu, &.focus .menu + border-radius: $border-button + 2px + .list-h a + flex-direction: column + align-items: center + padding: $gap * 0.75 + line-height: 24px + @media screen and (max-width: $device-mobile) + padding: $gap * 0.75 $gap * 0.5 + border-radius: $border-button + border-bottom: none + text-align: center + align-content: flex-end + color: alpha($color-text, .7) + font-size: 1.5rem + i + margin: $gap * 0.5 + p + font-size: $fontsize-meta + &.active + i, i+p + color: $color-theme + img+p + color: var(--color-text) + background: var(--color-card) + backdrop-filter: none + &:hover + background: var(--color-card) + +if hexo-config('cover.layout_scheme') == 'dock' + .cover-wrapper.dock .top + margin-bottom: $gap * 3 + .cover-wrapper.dock .menu + background: alpha($color-card, .5) + position: absolute + bottom: 0 + max-width: 100% + .list-h + flex-wrap: nowrap + margin: 4px + a+a + margin-left: 4px + @media screen and (max-width: $device-mobile) + overflow-x: scroll + scrollbar(0, 0) + @supports (backdrop-filter: blur(20px)) + background: alpha($color-card, .5) + backdrop-filter: saturate(200%) blur(20px) + +if hexo-config('cover.layout_scheme') == 'featured' + .cover-wrapper.featured .menu + .list-h + margin: -2px + .list-h a + margin: 2px + background: alpha($color-card, .5) + @supports (backdrop-filter: blur(20px)) + background: alpha($color-card, .5) + backdrop-filter: saturate(200%) blur(20px) + +if hexo-config('cover.layout_scheme') == 'focus' + .cover-wrapper.focus .menu + .list-h + margin: 2px + trans() + &:hover + background: alpha($color-card, .5) + @supports (backdrop-filter: blur(20px)) + background: alpha($color-card, .5) + backdrop-filter: saturate(200%) blur(20px) + .list-h a + margin: 2px + &:hover + opacity: 1 + background: var(--color-card) + +if hexo-config('plugins.parallax.enable') + .cover-wrapper + #parallax-window + position: absolute + width: 100% + height: 100% + background: transparent + + .parallax-mirror + animation-delay: 0s + animation-duration: .5s + animation-fill-mode: forwards + animation-timing-function: ease-out + animation-name: fadeIn + @keyframes fadeIn + 0% + opacity: 0 + filter blur(12px) + 100% + opacity: 1 diff --git a/themes/volantis/source/css/_first/dark_first.styl b/themes/volantis/source/css/_first/dark_first.styl new file mode 100755 index 0000000..c4eedde --- /dev/null +++ b/themes/volantis/source/css/_first/dark_first.styl @@ -0,0 +1,77 @@ +// 首屏加载的暗黑模式 +fitst_dark() + // Base Dark Color + --color-site-body: $color-dark-site-body + --color-read-bkg: $color-dark-read-bkg + --color-read-post: $color-dark-read-post + --color-site-bg: $color-dark-site-bg + --color-site-inner: $color-dark-site-inner + --color-site-footer: $color-dark-site-footer + --color-card: $color-dark-card + --color-text: $color-dark-text + + --color-block: $color-dark-block + --color-codeblock: $color-dark-codeblock + --color-inlinecode: $color-dark-inlinecode + --color-h1: $color-dark-h1 + --color-h2: $color-dark-h2 + --color-h3: $color-dark-h3 + --color-h4: $color-dark-h4 + --color-h5: $color-dark-h5 + --color-h6: $color-dark-h6 + --color-p: $color-dark-p + --color-list: $color-dark-list + --color-list-hl: $color-dark-list-hl + --color-meta: $color-dark-meta + --color-link: $color-dark-link + --color-copyright-bkg: $color-dark-copyright-bkg + + img + filter: brightness(convert(hexo-config('color_scheme.dark.brightness'))) !important + //header + .blur + background: rgba($color-dark-site-bg, .9) !important + .white-box.blur + background: rgba($color-dark-card, .9) !important + .nav-main + .u-search-input + background: var(--color-card) !important + #l_main .article .prev-next>a + background: var(--color-block) !important + &:hover + background: var(--color-site-bg) !important + .article blockquote + background: var(--color-block) !important + .article-title a + color: var(--color-h1) !important + details>summary + color: var(--color-p) !important + background: var(--color-site-bg) !important + details + border: 1px solid var(--color-site-bg) !important + background: var(--color-site-bg) !important + + //search + #u-search .modal, + #u-search .modal-header, + #u-search .modal-body + background: var(--color-card) !important + #u-search .modal-body .modal-results .result:hover + background: var(--color-block) !important + .u-search-input:hover + background: var(--color-block) !important + .u-search-input:focus + background: var(--color-site-body) !important + //phone search + .l_header .m_search + @media screen and (max-width: $device-mobile) + background: var(--color-site-bg) !important + +if hexo-config('plugins.darkmode.enable') + @media (prefers-color-scheme: dark) + :root + --color-mode: 'dark' + :root:not([color-scheme]) + fitst_dark() + [color-scheme='dark'] + fitst_dark() diff --git a/themes/volantis/source/css/_first/fontfamily_first.styl b/themes/volantis/source/css/_first/fontfamily_first.styl new file mode 100755 index 0000000..2a70a3e --- /dev/null +++ b/themes/volantis/source/css/_first/fontfamily_first.styl @@ -0,0 +1,17 @@ +if hexo-config('custom_css.fontfamily.bodyfont') + if hexo-config('custom_css.fontfamily.bodyfont.name') + @font-face + font-family: hexo-config('custom_css.fontfamily.bodyfont.name') + src: url(hexo-config('custom_css.fontfamily.bodyfont.url')) + font-weight: hexo-config('custom_css.fontfamily.bodyfont.weight') + font-style: hexo-config('custom_css.fontfamily.bodyfont.style') + font-display: swap + +if hexo-config('custom_css.fontfamily.logofont') + if hexo-config('custom_css.fontfamily.logofont.name') + @font-face + font-family: hexo-config('custom_css.fontfamily.logofont.name') + src: url(hexo-config('custom_css.fontfamily.logofont.url')) + font-weight: hexo-config('custom_css.fontfamily.logofont.weight') + font-style: hexo-config('custom_css.fontfamily.logofont.style') + font-display: swap \ No newline at end of file diff --git a/themes/volantis/source/css/_first/navbar_first.styl b/themes/volantis/source/css/_first/navbar_first.styl new file mode 100755 index 0000000..9c275ca --- /dev/null +++ b/themes/volantis/source/css/_first/navbar_first.styl @@ -0,0 +1,388 @@ +.l_header + $iconW = 36px + $iconMargin = 4px + position: fixed + z-index: 1000 + top: 0 + width: 100% + height: $navbar-height + background: var(--color-card) + box-shadow: $boxshadow-card + &.auto + transition: opacity .4s ease + visibility: hidden + &.show + opacity: 1 !important + visibility: visible + .container + margin-left: $gap + margin-right: $gap + #wrapper + height: 100% + disable-user-select() + .nav-main,.nav-sub + display: flex + flex-wrap: nowrap + justify-content: space-between + align-items: center + + .nav-main + trans() + + // https://github.com/volantis-x/hexo-theme-volantis/issues/658 + &.sub .nav-main + transform: translateY(0 - 1 * $navbar-height) + .nav-sub + ::-webkit-scrollbar + display:none + trans() + opacity: 0 + height: $navbar-height + width: "calc(100% - 2 * %s)" % $gap + position: absolute + @media screen and (min-width: $device-2k) + max-width: 55vw + margin: auto + &.sub .nav-sub + opacity: 1 + .title + position: relative + color: var(--color-text) + padding-left: $gap * 1.5 + max-height: $navbar-height + + .nav-main .title + txt-ellipsis() + flex-shrink: 0 + line-height: $navbar-height + padding: 0 $gap*1.5 + font-size: $fontsize-h3 + font-family: $fontfamily-logo + img + height: $navbar-height + + .nav-sub + max-width: $layout-width + margin: auto + .title + font-weight: bold + font-family: $fontfamily + line-height: 1.2 + max-height: $navbar-height + white-space: normal + flex-shrink: 1 + + + + .switcher + display: none + line-height: $navbar-height + .s-toc + display: none + align-items: center + @media screen and (max-width: $device-tablet) + .s-toc + display: flex + >li + height: $navbar-height - $gap + trans() + margin: 2px + $height = $navbar-height - $gap + @media screen and (max-width: $device-mobile) + margin: 0 1px + height: $height + >a + display: flex + justify-content: center + align-items: center + width: $height + height: $height + padding: .85em 1.1em + border-radius: 100px + border: none + trans() + color: $color-theme + &:hover + border: none + &.active,&:active + border: none + background: var(--color-site-bg) + @media screen and (max-width: $device-mobile) + width: $iconW + height: $height + + .nav-sub .switcher + display: flex + + .m_search + display: flex + height: $navbar-height + width: $sidebar + trans() + @media screen and (max-width: $device-laptop) + width: 44px + min-width: 44px + input + &::placeholder + opacity: 0 + &:hover + input + &::placeholder + opacity: 1 + width: $sidebar + @media screen and (min-width: $device-mobile) + &:hover .input + &::placeholder + opacity: 1 + width: 100% + @media screen and (max-width: $device-mobile) + input + &::placeholder + opacity: 1 + min-width: 0 + + .form + position: relative + display: flex + width: 100% + align-items: center + + .icon + position: absolute + width: $iconW + left: $iconMargin + 1px + color: var(--color-meta) + @media screen and (max-width: $device-mobile) + display: none + .input + display: block + padding-top: $gap * 0.5 + padding-bottom: $gap * 0.5 + line-height: 1.3 + width: 100% + color: var(--color-text) + background: darken($color-card, 2) + box-shadow: none + box-sizing: border-box + padding-left: $iconW + $iconMargin + font-size: $fontsize-meta + border-radius: $border-searchbar + border: none + trans() + @media screen and (min-width: $device-mobile) + &:focus + box-shadow: $boxshadow-float + @media screen and (max-width: $device-mobile) + background: var(--color-block) + padding-left: $gap * 0.5 + border: none + &:hover,&:focus + border: none + + + @media (max-width: $device-mobile) + .m_search + left: 0 + width: 0 + overflow: hidden + position: absolute + background: lighten($color-card, 5) + trans() + .input + border-radius: $navbar-height * 0.5 + margin-left: $gap + padding-left: $gap + &.z_search-open + .m_search + width: 100% + .input + width: "calc(100% - %s)" % (3 * $gap + 2 * $iconW) + +ul.m-pc + >li>a + color: inherit + border-bottom: 2px solid transparent + &:active,&.active + border-bottom: 2px solid $color-theme +ul.m-pc,ul.list-v + li:hover + >ul.list-v + display: block + + +ul.nav-list-h + display: flex + align-items: stretch + &>li + position: relative + justify-content: center + height: 100% + line-height: 2.4 + border-radius: $border-button + >a + -webkit-font-smoothing: antialiased + -moz-osx-font-smoothing: grayscale + font-weight: 600 + +ul.list-v + z-index: 1 + display: none + &.show + display: block + position: absolute + background: var(--color-card) + box-shadow: $boxshadow-dropmenu + margin-top: -2px - $border-card * 0.5 + border-radius: $border-card * 0.5 + padding: $gap * 0.5 0 + hr + margin-top: $gap * 0.5 + margin-bottom: $gap * 0.5 + >li + white-space: nowrap + word-break: keep-all + &.header + font-size: $fontsize-footnote + font-weight: bold + line-height: 2em + color: var(--color-meta) + margin: $gap * 0.5 $gap $gap * 0.25 + i + margin-right: 8px + ul + margin-left: 0 + display: none + margin-top: 0 - 32px - $gap * 0.5 + .aplayer-container + min-height: 64px + padding: $gap - 10px $gap + >li>a + trans() + display: block + color: var(--color-list) + font-size: $fontsize-meta + font-weight: bold + line-height: 36px + @media screen and (max-width: $device-laptop) + line-height: 40px + padding: 0 $gap + $border-line + 2px 0 $gap + text-overflow: ellipsis + margin: 0 4px + border-radius: 4px + >i + margin-right: 8px + &:active,&.active + list_active() + &:hover + list_hover() + +.l_header + .menu + >ul>li>a + display: block + padding: 0 8px + >i + margin-right: 4px + +.l_header ul.nav-list-h>li + color: var(--color-list) + line-height: $navbar-height + >a + max-height: $navbar-height + overflow: hidden + color: inherit + &:active,&.active + color: $color-theme + &:hover>a + color: var(--color-list-hl) + i.music + animation: rotate-effect 1.5s linear infinite + @keyframes rotate-effect + 0% + transform: rotate(0) + 25% + transform: rotate(90deg) + 50% + transform: rotate(180deg) + 75% + transform: rotate(270deg) + 100% + transform: rotate(360deg) + + +.menu-phone li ul.list-v + right: "calc(100% - 0.5 * %s)" % $gap + ul + right: "calc(100% - 0.5 * %s)" % $gap + +#wrapper + if hexo-config('custom_css.navbar.width') == 'auto' + max-width: $layout-width + margin: auto + @media screen and (min-width: $device-2k) + max-width: 55vw + .menu + flex: 1 1 auto + margin: 0 $gap 0 0 + .list-v ul + left: "calc(100% - 0.5 * %s)" % $gap + else + .m_search + margin-left: auto + margin-right: $gap + .menu + order: 1 + .menu li ul.list-v + right: 0 + ul + right: "calc(100% - 0.5 * %s)" % $gap + + +.menu-phone + display: none + margin-top: $gap + right: $gap * 0.5 + ul + right: "calc(100% - 0.5 * %s)" % $gap + @media screen and (max-width: $device-mobile) + display: block + trans() + +.l_header + if hexo-config('custom_css.navbar.width') == 'auto' + max-width: 65vw + left: "calc((100% - %s) * 0.5)" % @max-width + border-bottom-left-radius: $border-card + border-bottom-right-radius: $border-card + @media screen and (max-width: $device-2k) + max-width: $layout-width + 2 * $gap + left: "calc((100% - %s) * 0.5)" % @max-width + @media screen and (max-width: $layout-width + 2 * $gap) + left: 0 + border-radius: 0 + max-width: 100% + @media screen and (max-width: $device-mobile) + .container + margin-left: 0 + margin-right: 0 + #wrapper + .nav-main + .title + padding-left: $gap + padding-right: $gap + .nav-sub + width: 100% + .title + overflow-y: scroll + margin-top: 2px + padding: 8px $gap + .switcher + display: flex + margin-right: $gap * 0.5 + .menu + display:none + +@media screen and (max-width: $device-mobile) + .list-v + li + max-width: 270px diff --git a/themes/volantis/source/css/_first/search_first.styl b/themes/volantis/source/css/_first/search_first.styl new file mode 100755 index 0000000..0acd9a0 --- /dev/null +++ b/themes/volantis/source/css/_first/search_first.styl @@ -0,0 +1,12 @@ +#u-search + $border-card = 4px + display: none + position: fixed + top: 0 + left: 0 + width: 100% + height: 100% + padding: 60px 20px + z-index: 1001 + @media screen and (max-width: $modal-threshold) + padding: 0px diff --git a/themes/volantis/source/css/_style/_base/base.styl b/themes/volantis/source/css/_style/_base/base.styl new file mode 100755 index 0000000..959178b --- /dev/null +++ b/themes/volantis/source/css/_style/_base/base.styl @@ -0,0 +1,196 @@ +:root + // tag plugin from stellar + --block-hover: mix($c-block-light, $c-text-light, 98) + --text-p1: $c-text-light + --text-p3: mix($c-text-light, $c-site-bg-light, 60) + --card: $c-card-light + +::-moz-selection { + background: $color-selection +} + +::selection { + background: $color-selection +} + + +h1 + font-size: $fontsize-h1 +h2 + font-size: $fontsize-h2 +h3 + font-size: $fontsize-h3 +h4 + font-size: $fontsize-h4 +h5 + font-size: $fontsize-h5 +h6 + font-size: $fontsize-h6 + +h1,h2,h3,h4,h6 + font-weight: normal + +a + &:not([href]) + cursor: default + + +pre + tab-size: 4 + -moz-tab-size: 4 + -o-tab-size: 4 + -webkit-tab-size: 4 + +.clearfix + zoom: 1 + &:before,&:after + content: " " + display: table + &:after + clear: both + +.hidden + text-indent: -9999px + visibility: hidden + display: none + +.inner + position: relative + width: 80% + max-width: 710px + margin: 0 auto +.vertical + display: table-cell + vertical-align: middle + +article,aside,details,figcaption,figure,footer,hgroup,main,menu,nav,section,summary + display: block + +article + overflow: hidden + +abbr[title] + border-bottom: 1px dotted +b,strong + font-weight: bold +dfn + font-style: italic +h1 + font-size: 2em + margin: 0.67em 0 +mark + background: #ff0 + color: #000 +small + font-size: 80% +sub,sup + font-size: 50% + line-height: 1em +sup + vertical-align: text-top +sub + vertical-align: text-bottom + +figure + margin: 1em 40px + +pre + overflow: auto + +span.dot,span.sep + font-size: 0.9em + margin: 0 .2rem +span.dot:before + content: '·' +span.sep:before + content: '/' + +code,kbd,pre,samp + font-family: monospace, monospace + font-size: 1em + +optgroup,select,textarea + color: inherit /* 1 */ + font: inherit /* 2 */ + margin: 0 /* 3 */ + +select + text-transform: none + +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] + -webkit-appearance: button /* 2 */ + cursor: pointer /* 3 */ + + +button[disabled],html input[disabled] + cursor: default + +button::-moz-focus-inner, +input::-moz-focus-inner + border: 0 + padding: 0 + + +input[type="checkbox"], +input[type="radio"] + box-sizing: border-box /* 1 */ + padding: 0 /* 2 */ + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button + height: auto + + +input[type="search"] + -webkit-appearance: textfield /* 1 */ + -moz-box-sizing: content-box + -webkit-box-sizing: content-box /* 2 */ + box-sizing: content-box + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration + -webkit-appearance: none + + +fieldset + border: 1px solid #c0c0c0 + margin: 0 2px + padding: 0.35em 0.625em 0.75em + + +legend + border: 0 /* 1 */ + padding: 0 /* 2 */ + +textarea + overflow: auto + +optgroup + font-weight: bold + + +table:not([class]) + border-collapse: collapse + overflow: auto + display: inline-block + max-width: 100% + vertical-align: text-top + th + background-color: darken($color-block, 2) + td,th + padding: 8px 16px + border: 2px solid darken($color-block, 2) + line-height: 1.5 + font-size: 90% + tr + word-break: keep-all + background-color: lighten($color-block, 3) + trans() + &:hover + background-color: darken($color-block, 2) + + +td,th + padding: 0 diff --git a/themes/volantis/source/css/_style/_base/fontfamily_async.styl b/themes/volantis/source/css/_style/_base/fontfamily_async.styl new file mode 100755 index 0000000..e12fb7d --- /dev/null +++ b/themes/volantis/source/css/_style/_base/fontfamily_async.styl @@ -0,0 +1,8 @@ +if hexo-config('custom_css.fontfamily.codefont') + if hexo-config('custom_css.fontfamily.codefont.name') + @font-face + font-family: hexo-config('custom_css.fontfamily.codefont.name') + src: url(hexo-config('custom_css.fontfamily.codefont.url')) + font-weight: hexo-config('custom_css.fontfamily.codefont.weight') + font-style: hexo-config('custom_css.fontfamily.codefont.style') + font-display: swap diff --git a/themes/volantis/source/css/_style/_layout/archive.styl b/themes/volantis/source/css/_style/_layout/archive.styl new file mode 100755 index 0000000..9eed01b --- /dev/null +++ b/themes/volantis/source/css/_style/_layout/archive.styl @@ -0,0 +1,117 @@ +article + &#arc,&#cat,&#tag + padding-top: $gap * 3 + padding-bottom: $gap * 3 + h2 + font-weight: 600 + &:first-child + margin-top: 0 + + +// 归档页面 +article#arc + margin-bottom: $gap * 2 + padding-bottom: $gap * 4 + .timenode + &:before,&:after + margin-left: 12px + .meta + padding: 6px 0 + line-height: 1.5 + height: auto + max-width: 100% + display: flex + font-size: $fontsize-list + font-weight: 500 + border-radius: 2px + color: var(--color-list) + &:before + display: none + &:after + margin-left: 14px + &:hover + color: var(--color-p) + background: var(--color-site-bg) + time + color: var(--color-meta) + margin-left: $gap * 0.25 + 30px + margin-right: $gap * 0.25 + flex-shrink: 0 + width: 60px + i + line-height: 1.5 + color: $color-hover + &.red + color: $color-mac-red + &.green + color: $color-mac-green + &.yellow + color: $color-mac-yellow + &.blue + color: $color-mac-cyan + &.theme + color: $color-theme + &.accent + color: $color-hover + &.orange + color: $color-md-deep-orange + + +// 分类页面 +article#cat + .all-cats + a + display: block + padding: $gap * 0.5 $gap + border-radius: $border-button + color: var(--color-list) + font-size: $fontsize-list + font-weight: 500 + &:hover + list_hover() + &.child + padding-left: 3 * $gap + +// 标签页面 +article#tag + .all-tags + display: flex + flex-wrap: wrap + align-items: flex-start + justify-content: flex-start + align-items: baseline + text-align: center + ul + margin: 0 -8px + padding: 0 + display: flex + flex-wrap: wrap + li + list-style: none + margin: 8px + border-radius: $border-button + overflow: hidden + display: flex + position: relative + font-size: $fontsize-list + a + display: inline-block + color: var(--color-list) + padding: 4px 52px 4px 16px + background: var(--color-block) + font-weight: 500 + &:hover + background: $color-hover + color: $color-inner + span + &:before + content: 'x' + color: var(--color-meta) + background: var(--color-card) + padding: 2px 8px + border-radius: $border-button - 2px + pointer-events: none + position: absolute + right: 2px + top: 2px + height: "calc(100% - %s)" % 4px diff --git a/themes/volantis/source/css/_style/_layout/article.styl b/themes/volantis/source/css/_style/_layout/article.styl new file mode 100755 index 0000000..ea4a6b8 --- /dev/null +++ b/themes/volantis/source/css/_style/_layout/article.styl @@ -0,0 +1,416 @@ +.article + color: var(--color-p) + // word-break: break-all + word-wrap: break-word + + a + word-break: break-word + h1.title,h2.title + left: 0 + &:before + content: none + h1,h2 + padding-bottom: .2rem + margin-bottom: 1rem + border-bottom: 1px solid alpha($color-text, 10%) + h1 + text-align: $textalign-h1 + color: var(--color-h1) + margin-top: $gap-h2 + h2 + text-align: $textalign-h2 + color: var(--color-h2) + margin-top: $gap-h2 + h3 + text-align: $textalign-h3 + color: var(--color-h3) + margin-top: $gap-h3 + h4 + text-align: $textalign-h4 + color: var(--color-h4) + margin-top: $gap-h4 + h5 + font-weight: bold + color: var(--color-h5) + margin-top: $gap-p + h6 + color: var(--color-h6) + margin-top: $gap-p + + center + &,p + text-align: center + .aplayer + margin: $gap-p 0 + display: inline-block + width: 400px + max-width: 100% + border-radius: 4px + color: #666 + + p.small-img, + div.small-img + img + width: auto + max-width: 100% + margin: 0 + box-shadow: none + s + color: mix($color-p, $color-card, 60) + text-decoration-color: @color + p + margin-top: $gap-p + margin-bottom: $gap-p + text-align: $textalign-p + max-width: 100% + line-height: inherit + + + .subtitle + h6 + color: alpha($color-text, 90%) + + figure + figcaption + span + display: inline-block + margin-right: 5px + + + + blockquote + background: var(--color-block) + border-left: $border-codeblock solid $color-theme + border-radius: $border-codeblock + + blockquote + &,p,ul,ol + text-align: left + word-wrap: normal + font-size: $fontsize-list + margin-top: .5em + margin-bottom: .5em + position: relative + width: 100% + padding: $gap + trans() + footer + padding: 0 + text-align: justify + color: inherit + font-style: italic + margin: $gap-p 0 + cite + &::before + content: '----' + padding: 0 .3em + + color: var(--color-meta) + margin-left: 1em + + + &.pullquote + &.right + border-left: none + border-right: $border-codeblock solid $color-theme + p + text-align: right + + pre + display: block + -moz-box-sizing: border-box + box-sizing: border-box + margin-top: $gap-p + margin-bottom: $gap-p + overflow: auto + background: var(--color-codeblock) + font-size: $fontsize-code + font-family: $fontfamily-code + border: 1px solid darken($color-codeblock, 6) + padding: $gap + border-radius: $border-codeblock + >code:not([class]) + background: transparent + div>pre + border-radius: $border-codeblock + &>code:not([class]) + padding: 0 + margin: 0 + background: transparent + color: alpha($color-text, 90%) + code + font-family: $fontfamily-code + &:not([class]) + word-break: break-all + color: var(--color-inlinecode) + border-radius: $border-codeblock * 0.5 + + + @media screen and (max-width: $device-mobile) + ul,ol + font-size: $fontsize-meta + figure + font-size: 13px + line-height: 1.5 + + + .widget + background: transparent + margin: $gap-p 0 + box-shadow: none + border-radius: $border-codeblock + cursor: auto + background: var(--color-block) + padding: $gap * 0.5 0 + trans() + &:hover + box-shadow: none + + &:active + box-shadow: none + header + padding: $gap * 0.25 .6em + padding-bottom: 0 + &,a + color: alpha($color-text, 85%) + + &.copyright,&.qrcode + background: none + padding: 0 + header + display: none + .content + padding: 0 + width: 100% + + &.list, &.related_posts + .content + padding: 0 .6em !important + a + color: $color-link + &:hover + color: $color-hover + .content + padding: 0 .6em + margin: 0 + ul + padding-left: 4px + margin-left: $gap + a + trans(0.1s) + display: inline + border-left: none + padding: 0 + padding-left: 4px + color: $color-link + font-weight: normal + text-decoration: none + &:hover,&.active,&:active + border-left: none !important + background: none !important + &:hover + color: $color-hover + + .list + a + .name + display: inline + color: $color-link + &:hover + .name + color: $color-hover + + + &.qrcode > .content + display: flex + flex-wrap: wrap + align-items: center + justify-content: center + padding-left: $gap + padding-right: $gap + &>.fancybox, &>img + margin: 0 $gap * 0.5 + + img + margin-bottom: 4px + + margin-bottom: 4px + + + .article_footer + margin-top: $gap * 4 + .widget-blur + backdrop-filter: none + +.md .footer + margin-top: $gap * 4 + >div + margin-top: $gap-p + margin-bottom: $gap-p + .header + i + margin-right: 2px + line-height: 1.75 + padding-bottom: $gap * 0.5 + font-weight: 500 + font-size: $fontsize-meta + color: var(--color-list) + .body + ul,ol + margin-top: 0 + margin-bottom: 0 + .references,.related_posts + background: var(--color-block) + border-radius: $border-codeblock + padding: $gap + .references .body a + font-size: $fontsize-list + font-weight: 500 + .related_posts + .body + margin: 4px + overflow: hidden + border-radius: 2px + .body .vlts-rps + display: flex + // overflow: scroll + .item + &+.item + margin-left: $gap + flex-shrink: 0 + width: 240px + &:hover + img + filter: opacity(1) + img + border-radius: 2px + width: 100% + height: 120px + object-fit: cover + filter: opacity(0.75) + span + display: block + text-align: justify + display: -webkit-box + -webkit-box-orient: vertical + overflow: hidden + .title + font-weight: 600 + -webkit-line-clamp: 1 + .excerpt + font-size: $fontsize-meta + color: var(--color-meta) + -webkit-line-clamp: 3 + + .copyright blockquote p + font-size: $fontsize-meta + margin: .25em 0 + a + font-weight: 500 + .donate + display: flex + margin: 0 auto + .imgs + display: inline-flex + margin: 0 auto + .fancybox + margin: $gap * 0.5 + img + width: 80px + + +article .readmore + display: block + margin-top: $gap * 1.5 + font-size: $fontsize-meta + +.copyright.license + &:after + background: url("data:image/svg+xml;charset=utf-8,%3Csvg version='1.1' id='Capa_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 367.467 367.467' style='enable-background:new 0 0 367.467 367.467;' xml:space='preserve'%3E%3Cg%3E%3Cpath d='M183.73,0.018C82.427,0.018,0,82.404,0,183.733c0,101.289,82.427,183.716,183.73,183.716 c101.315,0,183.737-82.427,183.737-183.716C367.467,82.404,285.045,0.018,183.73,0.018z M183.73,326.518 c-78.743,0-142.798-64.052-142.798-142.784c0-78.766,64.055-142.817,142.798-142.817c78.752,0,142.807,64.052,142.807,142.817 C326.536,262.466,262.481,326.518,183.73,326.518z'/%3E%3Cpath d='M244.036,217.014c-11.737,20.141-33.562,32.635-56.956,32.635c-36.329,0-65.921-29.585-65.921-65.915 c0-36.36,29.592-65.955,65.921-65.955c23.395,0,45.219,12.54,56.956,32.641l1.517,2.627h44.28l-2.658-7.129 c-7.705-20.413-21.225-37.769-39.122-50.157c-17.942-12.42-39.017-19.009-60.973-19.009c-58.981,0-106.946,48.006-106.946,106.982 c0,58.98,47.965,106.941,106.946,106.941c21.956,0,43.03-6.567,60.973-19.006c17.897-12.391,31.417-29.741,39.122-50.154 l2.658-7.133h-44.28L244.036,217.014z'/%3E%3C/g%3E%3C/svg%3E") + content: " "; + opacity: .1; + height: 180px; + right: -10px; + top: -35px; + width: 180px; + position: absolute; + a + color: var(--color-meta); + &:hover + color: #ff5722; + background: var(--color-copyright-bkg); + color: var(--color-meta); + display: block; + font-size: .95rem; + line-height: 1.2; + margin: 15px -40px; + overflow: hidden; + padding: 1.25em 40px; + position: relative; + border-radius: 4px; + .license-title, + .license-meta-title + margin: 0 0 .25rem; + .license-link, + .license-meta-title + font-size: .8rem; + .license-title + font-weight: 700; + .license-link + margin-bottom: 1rem; + .license-meta + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; + .license-meta-item + margin: 0 2rem 1em 0; + .license-meta-text + margin: 0; + a + border-bottom: 1px solid var(--color-meta); + &:hover + border-bottom-color: #ff5722 +.recommended-article + overflow: hidden + .recommended-article-header + margin-top: $gap * 0.5 + margin-left: $gap * 0.5 + margin-right: 0 + .recommended-article-group + display: flex + flex-wrap: wrap + overflow: hidden + @media screen and (max-width: $device-tablet) + height: 190px + overflow: scroll + &::-webkit-scrollbar + width: 0 !important + -ms-overflow-style: none + .recommended-article-item + display: flex + flex-wrap: wrap + align-content: center; + justify-content: center; + align-items: center; + overflow: hidden + width: "calc(100%/3 - %s)" % $gap + @media screen and (max-width: $device-tablet) + width: "calc(100%/2 - %s)" % $gap + @media screen and (max-width: $device-mobile) + width: "calc(100% - %s)" % $gap + max-height: 200px + margin-top: $gap * 0.5 + margin-left: $gap * 0.5 + margin-right: 0 + img + display: flex; + width: 100% + height: 150px + span + display: block + text-align: justify + display: -webkit-box + -webkit-box-orient: vertical + -webkit-line-clamp: 1; + overflow: hidden diff --git a/themes/volantis/source/css/_style/_layout/footer.styl b/themes/volantis/source/css/_style/_layout/footer.styl new file mode 100755 index 0000000..3df16ee --- /dev/null +++ b/themes/volantis/source/css/_style/_layout/footer.styl @@ -0,0 +1,55 @@ +footer.footer + position: relative + padding: 40px 10px 120px 10px + width: 100% + color: var(--color-site-footer) + margin: 0px auto + &,p + font-size: $fontsize-code + overflow: hidden + text-align: center + .licenses + color: fade(@color_text_main, 50%) + .social-wrapper + display: flex + justify-content: center + flex-wrap: wrap + margin: 4px $gap * 0.5 + + a + color: var(--color-site-footer) + padding: 0 + trans() + &:hover + color: $color-hover + &:not(.social):hover + text-decoration: underline + &.social + position: relative + display: inline-block + text-align: center + display: flex + justify-content: center + align-items: center + min-width: 36px + min-height: 36px + margin: 4px + opacity: .75 + border-radius: 4px + font-size: 1rem + img + margin: 8px + height: 24px + &:hover + color: $color-hover + background: alpha(@color, 0.1) + + + + .copyright + margin-top: $gap + p + font-size: $fontsize-footnote + + @media screen and (max-width: $device-tablet) + justify-content: center diff --git a/themes/volantis/source/css/_style/_layout/friends-simpleuser.styl b/themes/volantis/source/css/_style/_layout/friends-simpleuser.styl new file mode 100755 index 0000000..c6be812 --- /dev/null +++ b/themes/volantis/source/css/_style/_layout/friends-simpleuser.styl @@ -0,0 +1,23 @@ +// layout/friends.ejs +if hexo-config('pages.friends.layout_scheme') != 'traditional' + .md .simpleuser-group + margin: 0 + display: grid + grid-template-columns: repeat(auto-fill, 112px) + .md .simpleuser + text-align: center + padding: 1em .5em + border-radius: 4px + img + display: block + width: 50px + height 50px + border-radius: 50px + object-fit: cover + img+span + display: block + font-size: $fontsize-meta + line-height: 1.2 + color: var(--color-text) + &:hover + background: var(--color-site-bg) diff --git a/themes/volantis/source/css/_style/_layout/friends-traditional.styl b/themes/volantis/source/css/_style/_layout/friends-traditional.styl new file mode 100755 index 0000000..b718af7 --- /dev/null +++ b/themes/volantis/source/css/_style/_layout/friends-traditional.styl @@ -0,0 +1,81 @@ +// layout/friends.ejs +if hexo-config('pages.friends.layout_scheme') == 'traditional' + .article.l_friends + .friends-group + .friend-content + display: flex + flex-wrap: wrap + margin: -0.5 * $gap + border-radius: $border-card + align-items: flex-start + line-height: 1.3 + .friend-card + display: flex + border-radius: $border-codeblock + box-shadow: $boxshadow-card + padding: $gap * 0.5 0 + margin: $gap * 0.5 + margin-top: "calc(2.25 * %s + 32px)" % $gap + color: var(--color-meta) + background: var(--color-block) + justify-content: flex-start + align-content: flex-start + flex-direction: column + width: "calc(100%/4 - %s)" % $gap + @media screen and (max-width: $device-laptop) + width: "calc(100%/4 - %s)" % $gap + + @media screen and (max-width: $device-tablet) + width: "calc(100%/3 - %s)" % $gap + + @media screen and (max-width: $device-mobile) + width: "calc(100%/2 - %s)" % $gap + + &:hover + .friend-left + .avatar + transform: scale(1.2) rotate(12deg) + box-shadow: $boxshadow-card-float + + + + .friend-left + display: flex + align-self: center + .avatar + width: 64px + height: 64px + trans() + box-shadow: $boxshadow-card + margin: $gap $gap * 0.5 $gap * 0.25 $gap * 0.5 + margin-top: "calc(-1.25 * %s - 32px)" % $gap + border-radius: 100% + border: 2px solid white + background: white + + + .friend-right + margin: $gap * 0.25 $gap * 0.5 + display: flex + flex-direction: column + text-align: center + p + text-align: center + + .friend-tags-wrapper + trans() + margin-left: -2px + word-break:break-all + p + margin: 0 + &.friend-name + font-size: $fontsize-code + padding-top: 4px + font-weight: bold + + &.tags + font-size: $fontsize-footnote + display: inline + background: none + word-wrap: break-word + padding-right: 4px diff --git a/themes/volantis/source/css/_style/_layout/img.styl b/themes/volantis/source/css/_style/_layout/img.styl new file mode 100755 index 0000000..3427d1c --- /dev/null +++ b/themes/volantis/source/css/_style/_layout/img.styl @@ -0,0 +1,33 @@ +.md + img + position: relative + trans() + @media screen and (max-width: $device-mobile) + box-shadow: none + div>img,p>img + display: block + margin: auto + border-radius: 4px + @media screen and (max-width: $device-mobile) + border-radius: 2px + span + img + display: inline + margin: auto + + +// image +.md .img-wrap + margin: 1.5rem auto + text-align: center + border-radius: 2px + overflow: hidden + .img-bg + width: 100% + .image-caption + display: block + margin: .75rem auto + font-size: $fontsize-code + color: var(--color-meta) + &:empty + display: none diff --git a/themes/volantis/source/css/_style/_layout/loading.styl b/themes/volantis/source/css/_style/_layout/loading.styl new file mode 100755 index 0000000..6178fe9 --- /dev/null +++ b/themes/volantis/source/css/_style/_layout/loading.styl @@ -0,0 +1,14 @@ +svg.loading + display: block + position: absolute + color: var(--text-p3) + width: 100% + height: 2rem + margin: auto + animation: spin infinite 2s + animation-timing-function: linear + @keyframes spin + from + transform:rotate(0deg) + to + transform:rotate(360deg) diff --git a/themes/volantis/source/css/_style/_layout/main.styl b/themes/volantis/source/css/_style/_layout/main.styl new file mode 100755 index 0000000..da9556e --- /dev/null +++ b/themes/volantis/source/css/_style/_layout/main.styl @@ -0,0 +1,348 @@ +#safearea + margin: $gap $gap 0 +#l_body + position: relative + if hexo-config('custom_css.font_smoothing') == true + -webkit-font-smoothing: antialiased + -moz-osx-font-smoothing: grayscale + div.loading + margin: $gap 0 + width: 100% + display: block + &,p + text-align: center + #s-top + trans(0.6s) + z-index: 50 + position: fixed + width: 48px + height: 48px + line-height: 48px + border-radius: 100% + bottom: $gap*2 + right: $gap*2 + transform: translateY(100px) scale(0) + transform-origin: bottom + color: var(--color-text) + @media screen and (max-width: $device-tablet) + right: $gap + &.show + transform: translateY(0) scale(1) + &.hl + background: $color-theme + color: $color-inner + box-shadow: $boxshadow-card + @media screen and (min-width: $device-tablet) + &:hover + transform: scale(1.2) + border-radius: 25% + background: $color-theme + color: white + box-shadow: $boxshadow-card-float + &.hl + box-shadow: $boxshadow-card-float + +#l_main + width: "calc(100% - 1 * %s)" % $sidebar + @media screen and (max-width: $device-tablet) + width: 100% + if hexo-config('sidebar.position') =='right' + padding-right: $gap + if hexo-config('sidebar.position') =='left' + padding-left: $gap + @media screen and (max-width:$device-tablet) + padding-left: 0 + &.no_sidebar + width: 100% + padding-right: 0 + max-width: $layout-width - $sidebar + @media screen and (min-width: $device-2k) + max-width: "calc(55vw - %s)" % $sidebar + margin: auto + ~#l_side + display: none + float: left + if hexo-config('sidebar.position') =='left' + -webkit-box-ordinal-group: 2; + -moz-box-ordinal-group: 2; + -ms-flex-order: 2; + -webkit-order: 2; + order: 2; + .post-list + position: relative + margin-bottom: $gap + column-gap: $gap + // @media screen and (max-width: $device-mobile) + // margin: 0 + + &.multiple-columns + columns: 320px // 支持多列 + + + .post-wrapper + column-break-inside: avoid + break-inside: avoid-column + + .widget + .content + p,ul,ol,table,.tabs,details + margin-top: $gap-p + margin-bottom: $gap-p + .post + padding-top: 0 + padding-bottom: 0 + margin-top: $gap-p + margin-bottom: $gap-p + &.grid .content .grid.fixed a + width: "calc(100%/8 - 0 * %s)" % $gap + @media screen and (max-width: $device-laptop) + width: "calc(100%/7 - 0 * %s)" % $gap + @media screen and (max-width: $device-tablet) + width: "calc(100%/6 - 0 * %s)" % $gap + @media screen and (max-width: $device-mobile) + width: "calc(100%/5 - 0 * %s)" % $gap + @media screen and (max-width: $device-mobile-l) + width: "calc(100%/4 - 0 * %s)" % $gap + @media screen and (max-width: $device-mobile-m) + width: "calc(100%/3 - 0 * %s)" % $gap + + + + + .post + position: relative + margin-bottom: $gap + padding: 1.5 * $gap + border-radius: $border-card + h1.title + font-size: $fontsize-h1 + margin: 0 + border-bottom: none + padding-bottom: 4px + border-bottom: none + .article-meta + color: var(--color-meta) + margin-bottom: $gap + line-height: normal + &#top + margin-top: 1 * $gap + margin-bottom: 2 * $gap + &#bottom + margin-top: 2 * $gap + margin-bottom: 0.5 * $gap + .aplayer,.aplayer-pic,.thumbnail + width: 48px + height: 48px + .aplayer,.thumbnail + trans() + border-radius: 100% + float: right + margin: 2px + box-shadow: $boxshadow-card + &:hover + border-radius: 25% + transform: scale(1.1) + box-shadow: $boxshadow-card-float + @media screen and (max-width: $device-mobile) + &:hover + border-radius: 100% + transform: scale(1) + box-shadow: $boxshadow-card + .thumbnail + width: auto + border-radius: 4px + box-shadow: none + trans() + &:hover + border-radius: 4px + transform: scale(1.1) rotate(4deg) + box-shadow: none + + + + .new-meta-box + trans(.1s) + display: flex + align-items: center + flex-wrap: wrap + -webkit-font-smoothing: auto + -moz-osx-font-smoothing: auto + &,p,i + font-size: $fontsize-code + .new-meta-item + color: var(--color-meta) + .notlink + cursor: default + &:hover + color: var(--color-meta) + p + color: var(--color-meta) + display: flex + align-items: baseline + justify-content: center + margin: 0 $gap 0 0 + padding: 8px 0 // seo https://web.dev/tap-targets/ + &:last-child + margin-right: 0 + img,i + display: inline-block + i + margin-right: 4px + border-radius: 0 + &.fa-hashtag + margin-right: 2px + p,a + color: var(--color-meta) + padding: 3px 0 + a + display: flex + justify-content: center + align-items: center + img + height: 16px + width: 16px + margin-right: 8px // seo https://web.dev/tap-targets/ + p + margin: 0 + font-weight: normal + trans() + &:hover + color: $color-hover + p + color: $color-hover + + .author + img,i + border-radius: 100% + img + transform: translateY(-0.5px) + + @media screen and (max-width: $device-mobile) + .share + width: 100% + margin-top: $gap + background: var(--color-block) + border-radius: $border-codeblock + + .share-body + position: relative + display: flex + justify-content: center + margin: 0 + padding: 0 2px + a + padding: 0 + margin: 0 1px + img + margin: 2px + height: 24px + @media screen and (max-width: $device-mobile) + height: 32px + margin: 8px + width: auto + background: transparent + div.hoverbox + div.target + display: none + position: absolute + background: var(--color-card) + border-radius: $border-card + box-shadow: $boxshadow-card-float + padding: 8px + left: 50% + top: -20px + transform: translate(-50%, -100%) + img + display: block + margin: 0 + padding: 0 + height: 128px + width: 128px + min-width: 128px + &:hover + div.target + display: flex + @media screen and (max-width: $device-mobile) + div.target + position: absolute + + span>img + display: inline-block + + a + img + display: inline + + + + @media screen and (max-width:$device-tablet) + padding-right: 0 + @media screen and (max-width: $device-mobile) + width: 100% + + + + +.body-wrapper + position: relative + display: flex + width: 100% + max-width: $layout-width + @media screen and (min-width: $device-2k) + max-width: 55vw + margin: 0 auto + flex-wrap: wrap + justify-content: space-between + align-items: stretch + + + + +article#comments + p[ct] + margin-top: 0 + margin-bottom: $gap-p + font-size: $fontsize-h4 + color: var(--color-text) + font-weight: 600 + p[cst] + margin-top: $gap-p + margin-bottom: $gap-p + font-size: $fontsize-meta + #load-btns, #loading-comments + text-align: center + margin: $gap 0 + &,a,i + line-height: 3em + a.load-comments + display: inline-block + border-radius: 2px + cursor: pointer + background: $color-button + color: $color-inner + padding-left: $gap * 3 + padding-right: $gap * 3 + &:hover + background: $color-hover + +.white-box + background: var(--color-card) + +// if hexo-config('plugins.scrollreveal.enable') +// .reveal +// visibility: hidden + +img + max-width 100% + &.lazyload:not(.placeholder) + transition opacity .5s ease-out 0s + &:not(.loaded) + opacity: 0 + &.loaded + opacity: 1 + if hexo-config('plugins.lazyload.blurIn') == true + transition filter .25s ease-out 0s + &:not(.loaded) + filter blur(8px) + &.loaded + filter none diff --git a/themes/volantis/source/css/_style/_layout/md.styl b/themes/volantis/source/css/_style/_layout/md.styl new file mode 100755 index 0000000..12ae97f --- /dev/null +++ b/themes/volantis/source/css/_style/_layout/md.styl @@ -0,0 +1,85 @@ +// 以后关于 md 渲染方面的都写到这里 +.md + >p + padding-top: 4px + h1,h2,h3,h4,h5,h6 + position: relative + pointer-events: none + margin-top: 0 + font-weight: 500 + >a + color: inherit + pointer-events: auto + &:hover + color: $color-hover + &:before + content: '' + display: block + margin-top: 0 - $navbar-height + $gap + height: $navbar-height + $gap * 2 + visibility: hidden + pointer-events: none + h1,h2 + &:before + margin-top: $gap-h2 - $navbar-height - $gap * 1 + .article-meta+h1,.article-meta+h2 + margin-top: $gap-h2 - $navbar-height - $gap * 4 + h3,h4,h5,h6 + margin-bottom: $gap-p + h3 + &:before + margin-top: $gap-h3 - $navbar-height - $gap + h4 + &:before + margin-top: $gap-h4 - $navbar-height - $gap + h5 + font-weight: bold + h2+h3:before + margin-top: $gap-h2 - $navbar-height - $gap * 4 + ul,ol + font-size: $fontsize-list + list-style: initial + padding-left: 8px + margin-left: $gap + margin-top: $gap-p + margin-bottom: $gap-p + ul,ol + margin-top: 0 + margin-bottom: 0 + li + margin-top: 0px + margin-bottom: 0px + li + margin-top: 0 + margin-bottom: 0 + p + margin-top: 4px + margin-bottom: 0 + &.task-list + padding-left: 0 + margin-left: 4px + li + list-style: none + input + margin-right: 4px + + + ul>li + list-style: initial + ol>li + list-style: decimal + + .div-ori-link + display: block + text-align: center + margin: 4rem 0 + .ori-link + margin: auto + padding: 1em 3em + border: 1px solid $color-theme + border-radius: $border-button + color: $color-theme + font-weight: 500 + &:hover + color: $color-hover + border-color: $color-hover diff --git a/themes/volantis/source/css/_style/_layout/pagination.styl b/themes/volantis/source/css/_style/_layout/pagination.styl new file mode 100755 index 0000000..c693b29 --- /dev/null +++ b/themes/volantis/source/css/_style/_layout/pagination.styl @@ -0,0 +1,74 @@ +#l_main + .prev-next + width: 100% + display: flex + justify-content: space-between + align-items: baseline + color: var(--color-meta) + margin: 0 + font-weight: 600 + .prev + text-align: left + border-top-right-radius: 32px + border-bottom-right-radius: 32px + + .next + text-align: right + border-top-left-radius: 32px + border-bottom-left-radius: 32px + + p + margin: $gap + + section + color: var(--color-meta) + padding: $gap + border-radius: $border-card + &:hover + color: $color-hover + + + // 文章中 + .article + .prev-next + width: 100% + display: flex + justify-content: space-between + align-content: flex-start + margin-top: $gap * 0.5 + >a + width: 100% + padding: $gap * 0.5 + color: var(--color-meta) + background: var(--color-block) + border-radius: $border-codeblock + &:hover + background: bgcolor($color-hover) + p.title + color: $color-hover + p + margin: $gap * 0.5 .5rem + p.title + font-weight: 600 + font-size: $fontsize-h5 + >i + width: 1rem + p.content + font-size: $fontsize-meta + font-weight: 400 + text-align: justify + word-break: break-all + &:only-child + margin-left: 0 + margin-right: 0 + .prev + p.title + text-align: left + margin-left: 0 + margin-right: $gap * 0.5 + + .next + p.title + text-align: right + margin-left: $gap * 0.5 + margin-right: 0 diff --git a/themes/volantis/source/css/_style/_layout/posts.styl b/themes/volantis/source/css/_style/_layout/posts.styl new file mode 100755 index 0000000..ab6ca89 --- /dev/null +++ b/themes/volantis/source/css/_style/_layout/posts.styl @@ -0,0 +1,96 @@ +.article-title + font-weight: 500 + margin-bottom: $gap * 0.75 + line-height: 1.4 + a + color: var(--color-h1) + &:hover + color: $color-hover + &[pin] + margin-right: 36px +.article-desc + word-break: break-word +.post-v3 + overflow: hidden + text-align: justify + .md + color: var(--color-p) + + .pin + position: absolute + width: 20px + height: 20px + border-radius: 20px + right: $gap * 1.5 + top: $gap * 1.5 + z-index: 1 + pointer-events: none + +.meta-v3[line_style='solid'] + border-top: 1px solid alpha($color-text, 0.1) +.meta-v3[line_style='dashed'] + border-top: 2px dashed alpha($color-text, 0.1) +.meta-v3[line_style='dotted'] + border-top: 4px dotted alpha($color-text, 0.1) + +.meta-v3 + margin-top: $gap + padding-top: $gap * 0.75 + display: flex + flex-wrap: wrap + justify-content: space-between + color: var(--color-meta) + >div + display: flex + align-items: center + user-select: none + time + font-size: $fontsize-meta + .category-link + font-size: $fontsize-meta + color: var(--color-meta) + -webkit-font-smoothing: auto + -moz-osx-font-smoothing: auto + &:hover + color: $color-hover + .readmore + font-weight: bold + .avatar + line-height: 0 + margin-right: .75em + img + width: 24px + height: 24px + display: block + border-radius: 12px + object-fit: cover + +.headimg-div + display: block + margin-left: 0 - 1.5 * $gap + margin-top: 0 - 1.5 * $gap + margin-bottom: 1.25 * $gap + width: "calc(100% + 3 * %s)" % $gap + .headimg-a + display: block + overflow: hidden + height: 280px + @media screen and (max-width: $device-tablet) + height: 250px + @media screen and (max-width: $device-mobile) + height: 220px + @media screen and (max-width: $device-mobile-l) + height: 190px + .headimg + object-fit: cover + width: 100% + height: 100% + transition transform 3s ease-out + &:hover + transform: scale(1.1) + &.lazyload:not(.placeholder) + transition transform 3s ease-out, opacity .5s ease-out + &:not(.loaded) + opacity: 0 + &.loaded + opacity: 1 diff --git a/themes/volantis/source/css/_style/_layout/search.styl b/themes/volantis/source/css/_style/_layout/search.styl new file mode 100755 index 0000000..d62a83f --- /dev/null +++ b/themes/volantis/source/css/_style/_layout/search.styl @@ -0,0 +1,353 @@ +#u-search + .modal + position: fixed + height: 80% + width: 100% + max-width: 640px + left: 50% + top: 0 + margin: 64px 0px 0px -320px + background: var(--color-card) + z-index: 3 + border-radius: $border-card + overflow: hidden + .search-icon, + #resule-hits-empty + position: absolute; + top: 50%; + left: 50%; + width: 50%; + text-align: center; + transform: translate(-50%, -50%); + i + font-size: 8em; + color: #e8e8e8 + margin-bottom 10px + @media screen and (max-width: $modal-threshold) + box-shadow: none + max-width: none + top: 0 + left: 0 + margin: 0 + height: 100% + border-radius: 0 + .modal-header + position: relative + width: 100% + height: 64px + z-index: 3 + border-top-left-radius: $border-card + border-top-right-radius: $border-card + font-size: $fontsize + box-shadow: $boxshadow-card + background: lighten($color-card, 5) + @media screen and (max-width: $modal-threshold) + border-radius: 0 + padding: 0px + trans() + .btn-close + display: block + position: absolute + width: 50px + 5px + height: 64px + top: 0 + right: 0 + color: $color-theme + cursor: pointer + text-align: center + line-height: 64px + vertical-align: middle + trans() + z-index: 2 + + &:hover + transform: rotate(90deg) + + #u-search-modal-form + position: relative + width: 100% + height: 100% + z-index: 2 + input + color: var(--color-text) + #u-search-modal-input + margin: $gap 50px + padding: 0 $gap * 0.5 + width: "calc(100% - 100px - %s)" % $gap + @media screen and (max-width: $modal-threshold) + padding: 0 + line-height: 2rem + border-radius: $border-card + vertical-align: middle + border: none + appearance: none + box-shadow: none + background: transparent + trans() + &:focus + border-top-left-radius: $border-card + border-top-right-radius: $border-card + + #u-search-modal-btn-submit + position: absolute + top: 0 + left: 0 + padding-left: 5px + padding-top: 2px + background: transparent + border: none + width: 50px + height: 64px + vertical-align: middle + color: $color-theme + z-index: 2 + + .modal-body + position: absolute + padding: $gap + width: 100% + height: "calc(100% - %s)" % 64px + top: 64px + left: 0 + overflow-y: scroll + -webkit-overflow-scrolling: touch + background: var(--color-card) + border-radius: $border-card + scrollbar() + .modal-results + list-style: none + .result + position: relative + display: block + padding: $gap + border-radius: $border-card + b[mark] + color: darken($color-theme, 10) + text-decoration: underline + font-size 120% + background-color #ffe600 + &:hover + background: var(--color-site-bg) + .title + color: var(--color-list-hl) + .title + display: inline-block + max-width: 100% + color: var(--color-list) + font-weight: bold + padding: 1px + margin-bottom: 2px + white-space: normal + overflow: hidden + text-overflow: ellipsis + font-size: $fontsize-h4 + .digest + display: block + white-space: inherit + overflow: hidden + word-break: break-all + text-overflow: ellipsis + font-size: $fontsize-code + color: var(--color-meta) + .icon + position: absolute + top: 50% + right: 0 + margin-top: -4px + font-size: 11px + color: var(--color-meta) + + .modal-overlay + position: absolute + top: 0 + left: 0 + width: 100% + height: 100% + background: rgba(0,0,0,0.7) + z-index: 1 + + +if hexo-config('search.service') == 'meilisearch' + #u-search + .modal-header + .ais-SearchBox-input + margin: $gap 50px + padding: 0 $gap * 0.5 + width: "calc(100% - 100px - %s)" % $gap + @media screen and (max-width: $modal-threshold) + padding: 0 + line-height: 2rem + border-radius: $border-card + vertical-align: middle + border: none + appearance: none + box-shadow: none + background: transparent + trans() + &:focus + border-top-left-radius: $border-card + border-top-right-radius: $border-card + .modal .modal-body + height: "calc(100% - %s)" % 115px + .ais-Hits-list + list-style: none + .result + position: relative + display: block + padding: $gap + border-radius: $border-card + b[mark] + color: darken($color-theme, 10) + text-decoration: underline + font-size 120% + background-color #ffe600 + &:hover + background: var(--color-site-bg) + .title + color: var(--color-list-hl) + .title + display: inline-block + max-width: 100% + color: var(--color-list) + font-weight: bold + padding: 1px + margin-bottom: 2px + white-space: normal + overflow: hidden + text-overflow: ellipsis + font-size: $fontsize-h4 + .digest + display: block + white-space: inherit + overflow: hidden + word-break: break-all + text-overflow: ellipsis + font-size: $fontsize-code + color: var(--color-meta) + .icon + position: absolute + top: 50% + right: 0 + margin-top: -4px + font-size: 11px + color: var(--color-meta) + footer + position: absolute; + bottom: 0; + padding: 0 16px; + width: 100%; + height: 51px; + hr + margin 5px 0 + #meilisearch-info + height 40px + line-height 40px + font-size 14px + div + display: inline + .meilisearch-poweredBy + float: right + +if hexo-config('search.service') == 'algolia' + #u-search + .modal-header + .ais-SearchBox-input + margin: $gap 50px + padding: 0 $gap * 0.5 + width: "calc(100% - 100px - %s)" % $gap + @media screen and (max-width: $modal-threshold) + padding: 0 + line-height: 2rem + border-radius: $border-card + vertical-align: middle + border: none + appearance: none + box-shadow: none + background: transparent + trans() + &:focus + border-top-left-radius: $border-card + border-top-right-radius: $border-card + .modal .modal-body + height: "calc(100% - %s)" % 155px + .ais-Hits-list + list-style: none + .result + position: relative + display: block + padding: $gap + border-radius: $border-card + b[mark] + color: darken($color-theme, 10) + text-decoration: underline + font-size 120% + background-color #ffe600 + &:hover + background: var(--color-site-bg) + .title + color: var(--color-list-hl) + .title + display: inline-block + max-width: 100% + color: var(--color-list) + font-weight: bold + padding: 1px + margin-bottom: 2px + white-space: normal + overflow: hidden + text-overflow: ellipsis + font-size: $fontsize-h4 + .digest + display: block + white-space: inherit + overflow: hidden + word-break: break-all + text-overflow: ellipsis + font-size: $fontsize-code + color: var(--color-meta) + .icon + position: absolute + top: 50% + right: 0 + margin-top: -4px + font-size: 11px + color: var(--color-meta) + footer + position: absolute; + bottom: 0; + padding: 0 16px; + width: 100%; + height: 91px; + hr + margin 5px 0 + #algolia-info + height 40px + line-height 40px + font-size 14px + div + display: inline + .algolia-poweredBy + float: right + #algolia-pagination + height 40px + line-height 40px + .ais-Pagination + text-align: center + padding-top: 5px; + .ais-Pagination-item + display: inline + margin: 0 4px + padding: 0 + .ais-Pagination-link + display: inline-block + min-width: 24px + height: 24px + text-align: center + line-height: 24px + .ais-Pagination-item--selected + a + background: darken($color-theme, 10) + color: #eee + cursor: default + .ais-Pagination-item--disabled + visibility: hidden diff --git a/themes/volantis/source/css/_style/_layout/sidebar.styl b/themes/volantis/source/css/_style/_layout/sidebar.styl new file mode 100755 index 0000000..9705af7 --- /dev/null +++ b/themes/volantis/source/css/_style/_layout/sidebar.styl @@ -0,0 +1,385 @@ +#l_side + width: $sidebar + float: right + if hexo-config('sidebar.position') =='left' + -webkit-box-ordinal-group: 1; + -moz-box-ordinal-group: 1; + -ms-flex-order: 1; + -webkit-order: 1; + order: 1; + position: relative + display: flex + flex-direction: column + @media screen and (max-width: $device-tablet) + width: 100% + .widget + overflow: hidden + &.sticky + position: sticky + top: $navbar-height + $gap + z-index: 1 + >.content + max-height: 200vh + @media screen and (max-width: $device-tablet) + max-height: none + overflow: auto + scrollbar() + text-align: justify + font-size: $fontsize-meta + max-width: 100% + + +.widget + z-index: 0 + background: var(--color-card) + margin-bottom: $gap + border-radius: $border-card + width: 100% + display: none + ul,ol + li + margin-top: 0 + margin-bottom: 0 + &.desktop + display: block + @media screen and (max-width: $device-tablet) + display: none !important + &.mobile + display: block !important + + + header + border-top-left-radius: $border-card + border-top-right-radius: $border-card + padding: "calc(%s - 2px)" % $gap + font-weight: bold + font-size: $fontsize-meta + padding-bottom: 0 + &,a + color: var(--color-meta) + >a:hover + color: $color-hover + + span.name + margin-left: $gap * 0.5 + + + >.content + padding: $gap * 0.5 0 + p + margin-top: $gap-p + margin-bottom: $gap-p + &:first-child + margin-top: $gap-p * 0.5 + ul>li + a + color: var(--color-meta) + padding: 0 $gap + padding-left: $gap * 0.5 + 4px + line-height: 2 + display: flex + justify-content: space-between + align-content: center + border-left: $border-line solid transparent + trans() + ul.entry, ul.popular-posts + list-style: none + a + color: var(--color-list) + .name + flex: auto + .badge + flex:none + font-weight: normal + font-size: $fontsize-meta + color: alpha($color-text, .7) + &.active + border-left: $border-line solid $color-theme + list_active() + .badge + color: alpha($color-theme, .9) + &.child + padding-left: $gap * 2 + &:hover + border-left: $border-line solid $color-theme + list_hover() + + + + &.blogger + trans() + .content + padding: 0 + display: flex + flex-direction: column + align-items: stretch + >.avatar + align-self: center + overflow: hidden + position: relative + border-top-left-radius: $border-card + border-top-right-radius: $border-card + line-height: 0 + &.circle + border-radius: 100% + width: 128px + height: 128px + margin-top: $gap * 2 + margin-bottom: $gap-p + img + display: block + position: absolute + top: 50% + left: 50% + transform: translate(-50%, -50%) + @media screen and (max-width: $device-tablet) + width: 80px + height: 80px + border-radius: 100% + border: 2px solid white + img + display: block + top: 50% + left: 50% + transform: translate(-50%, -50%) + position: absolute + .text + :first-child + margin-top: $gap + h2 + text-align: center + font-weight: bold + margin: $gap * 0.5 + @media screen and (max-width: $device-tablet) + margin: $gap * 0.5 + p + text-align: center + font-weight: bold + margin: $gap * 0.5 $gap * 0.5 0 $gap * 0.5 + empty-cells: hide + .social-wrapper + display: flex + justify-content: space-between + flex-wrap: wrap + margin: 4px $gap * 0.25 + a + color: var(--color-meta) + padding: 0 + trans() + &:hover + color: $color-hover + &.social + display: flex + justify-content: center + align-items: center + width: 32px + height: 32px + margin: 4px + border-radius: 100px + &:hover + background: bgcolor($color-theme) + color: $color-theme + + @media screen and (max-width: $device-tablet) + justify-content: center + display: none + + @media screen and (max-width: $device-tablet) + box-shadow: none + background: transparent !important + margin-top: 2 * $gap + backdrop-filter: none + color: var(--color-site-inner) + + + + &.text + .content + &,p + font-size: $fontsize-meta + word-break: break-all + padding: $gap * 0.25 $gap + a + color: $color-link + trans() + &:hover + color: $color-hover + &:active + color: darken($color-hover, 25%) + + + &.list + .content + padding: $gap * 0.5 0 + a + font-size: $fontsize-meta + font-weight: bold + line-height: 1.5 + padding-top: 6px + padding-bottom: 6px + img,i + margin-right: 4px + i + margin-left: 1px + img + vertical-align: middle + height: 20px + width: 20px + margin-bottom: 4px + &#round + border-radius: 100% + + + &.grid + .content + .grid + border: none + display: flex + flex-wrap: wrap + justify-content: space-around + padding: $gap * 0.25 $gap + a + text-align: center + border-radius: $border-line + margin: 0 + padding: 4px 8px + display: flex + flex-direction: column + align-items: center + font-size: $fontsize-footnote + font-weight: bold + color: alpha($color-text, 70%) + line-height: 1.5 + word-wrap: break-word + i + margin-top: .3em + margin-bottom: .3em + font-size: 1.8em + + img + display: inline + vertical-align: middle + margin-bottom: 4px + &#round + border-radius: 100% + + &.active + list_hover() + &:hover + list_hover() + border-radius: $border-line + + + &.fixed a + width: "calc(100%/3 - 0 * %s)" % $gap + @media screen and (max-width: $device-tablet) + width: "calc(100%/6 - 0 * %s)" % $gap + @media screen and (max-width: $device-mobile) + width: "calc(100%/5 - 0 * %s)" % $gap + @media screen and (max-width: $device-mobile-l) + width: "calc(100%/4 - 0 * %s)" % $gap + @media screen and (max-width: $device-mobile-m) + width: "calc(100%/3 - 0 * %s)" % $gap + + + &.tagcloud + .content + text-align: justify + padding: $gap * 0.5 $gap + a + display: inline-block + trans() + line-height: 1.2em + margin: 4px 0 + border-bottom: 1px solid transparent + &:hover + color: $color-hover !important //to cover inline style. + border-bottom: 1px solid $color-hover + + + + &.related_posts + .content + font-weight: bold + ul + margin-top: $gap * 0.5 + margin-bottom: $gap * 0.5 + h3 + font-size: $fontsize-meta + font-weight: bold + margin: 0 + a + line-height: inherit + padding-top: 4px + padding-bottom: 4px + + + + &.qrcode + .content + display: flex + flex-wrap: wrap + align-items: center + justify-content: space-around + padding-left: $gap + padding-right: $gap + &,img + margin-bottom: 4px + + +#l_side>.widget.page + >.content + padding-top: 0 + padding-left: $gap - 4px + padding-right: $gap - 4px + + +.webinfo + padding 0.2rem 1rem + .webinfo-item + display block + padding 4px 0 0 + div + &:first-child + display inline-block + &:last-child + display inline-block + float right + +.widget-last + display: block !important + .item + display: flex + justify-content: space-between + font-size: 0.8rem + .item-title + width: 100% // 设定宽度 + display: inline-block // 将 span 当作块级元素 + white-space: nowrap // 不换行 + overflow: hidden // 超出宽度部分隐藏 + text-overflow: ellipsis // 超出部分以点号替代 + +.widget-sticky + position: sticky + top: $navbar-height + $gap + z-index 10 + +.bber-talk + padding 0.2rem 1rem + :hover + border-color: #49b1f5 + box-shadow: none + a + color: var(--font-color) + .talk-list + display: block !important + max-height: 25px + overflow: hidden + :hover + color: #49b1f5 !important + transition: all .2s ease-in-out + .item + text-overflow: ellipsis + white-space: nowrap + width: 98% + overflow: hidden diff --git a/themes/volantis/source/css/_style/_layout/snackbar.styl b/themes/volantis/source/css/_style/_layout/snackbar.styl new file mode 100755 index 0000000..c7a49b5 --- /dev/null +++ b/themes/volantis/source/css/_style/_layout/snackbar.styl @@ -0,0 +1,51 @@ +.snackbar-wrap + position: fixed + width: 100% + left: 0 + bottom: 0 + background: $color-theme + padding: $gap + z-index: 2 + +.snackbar-content + max-width: $layout-width + margin: $gap auto + @media screen and (max-width: $layout-width) + max-width: 100% + +.snackbar-content + p + margin-top: .5rem + margin-bottom: .5rem + color: $color-inner + .title + font-size: $fontsize-h2 + font-weight: 600 + .action + display: block + margin: 1.5rem 0 - $gap * 0.25 + a + margin: $gap * 0.25 + cursor: pointer + color: $color-inner + display: inline-block + padding: .4em 2em + font-weight: 600 + border-radius: 2px + border: 1px solid $color-inner + &:hover + color: $color-theme + background: $color-inner + +.snackbar-wrap + &[theme='warning'] + background: #F7E751 + .snackbar-content + p + color: black + a + color: black + border-color: black + &:hover + color: #F7E751 + background: black diff --git a/themes/volantis/source/css/_style/_layout/toc.styl b/themes/volantis/source/css/_style/_layout/toc.styl new file mode 100755 index 0000000..e1d4b4c --- /dev/null +++ b/themes/volantis/source/css/_style/_layout/toc.styl @@ -0,0 +1,97 @@ +#l_side .toc-wrapper + z-index: 1 + overflow: hidden + border-radius: $border-card + //position: sticky + //top: $navbar-height + $gap + trans() + line-height: 1.6 + header + position: sticky + width: 100% + top: 0 + padding-bottom: $gap * 0.25 + .content + max-height: "calc(100vh - %s)" % ($gap * 5 + $navbar-height) + a + border-left: $border-line solid transparent + &.active + list_active() + border-left: $border-line solid $color-theme + &:hover + list_hover() + border-left: $border-line solid $color-theme + + + trans() + @media screen and (max-width: $device-tablet) + z-index: 1001 + position: fixed + max-height: 1000px + width: auto + max-width: "calc(100% - 2 * %s)" % $gap + top: $navbar-height - $gap + right: $gap + border-radius: $border-card * 0.5 + box-shadow: $boxshadow-float + border: 1px solid darken($color-block, 6) + visibility: hidden + transform: scale(0,0) + transform-origin: right top + &.active + visibility: visible + transform: scale(1,1) + @media screen and (max-width: $device-mobile-m) + right: 0 + + a + padding-left: 8px + color: var(--color-meta) + font-size: $fontsize-meta + display: inline-block + + ul,ol + .toc-child a + font-weight: normal + .toc-item.toc-level-1 + .toc-child a + padding-left: 0.8 * $gap + .toc-item.toc-level-2 + .toc-child a + padding-left: 1.6 * $gap + .toc-item.toc-level-3 + .toc-child a + padding-left: 2.4 * $gap + .toc-item.toc-level-4 + .toc-child a + padding-left: 3.2 * $gap + .toc-item.toc-level-5 + .toc-child a + padding-left: 4 * $gap + .toc-item.toc-level-6 + .toc-child a + padding-left: 4.8 * $gap + + li + a + padding: 0 $gap * 0.5 0 ($gap - 5px) + font-weight: bold + width: 100% + width: auto + text-align: left + + &:empty + display:none + + .toc-child + font-size: 1rem + overflow: hidden + transition: max-height 0.6s ease-in + max-height: 0 + .toc-item + &.active + &>.toc-link + list_active() + border-left: $border-line solid $color-theme + &>.toc-child + max-height: 1000px diff --git a/themes/volantis/source/css/_style/_layout/video.styl b/themes/volantis/source/css/_style/_layout/video.styl new file mode 100755 index 0000000..ef66dac --- /dev/null +++ b/themes/volantis/source/css/_style/_layout/video.styl @@ -0,0 +1,2 @@ +.md .video-wrap + margin: 1.5rem auto diff --git a/themes/volantis/source/css/_style/_plugins/_dark/dark_async.styl b/themes/volantis/source/css/_style/_plugins/_dark/dark_async.styl new file mode 100755 index 0000000..e403fe6 --- /dev/null +++ b/themes/volantis/source/css/_style/_plugins/_dark/dark_async.styl @@ -0,0 +1,41 @@ +// 异步加载的暗黑模式 暗黑模式 CSS 变量 + +async_dark() + // tag plugin from stellar + --block-hover: mix($c-block-dark, $c-text-dark, 95) + --text-p1: $c-text-dark + --text-p3: mix($c-text-light, $c-site-bg-light, 60) + --card: $c-card-light + + // waline Dark Color https://github.com/volantis-x/hexo-theme-volantis/issues/633 + if hexo-config('comments.service')=='waline' + --waline-white: #000 !important + --waline-light-grey: #666 !important + --waline-dark-grey: #999 !important + --waline-text-color: #888 !important + --waline-bgcolor: #1e1e1e !important + --waline-bgcolor-light: #272727 !important + --waline-border-color: #333 !important + --waline-disable-bgcolor: #444 !important + --waline-disable-color: #272727 !important + --waline-bq-color: #272727 !important + --waline-info-bgcolor: #272727 !important + --waline-info-color: #666 !important + + + // Custom Files + for $injects_darkVar in hexo-config('injects.darkVar') + @import $injects_darkVar; + // eg: + // body + // --color-site-body: blue !important + +@media (prefers-color-scheme: dark) + :root + --color-mode: 'dark' + :root:not([color-scheme]) + async_dark() + @import 'dark_plugins' +[color-scheme='dark'] + async_dark() + @import 'dark_plugins' diff --git a/themes/volantis/source/css/_style/_plugins/_dark/dark_plugins.styl b/themes/volantis/source/css/_style/_plugins/_dark/dark_plugins.styl new file mode 100755 index 0000000..53d175e --- /dev/null +++ b/themes/volantis/source/css/_style/_plugins/_dark/dark_plugins.styl @@ -0,0 +1,296 @@ +// 异步加载的暗黑模式 强制覆盖样式 + +fa-solid, +fa-regular, +fa-duotone, +fa-light, +fa-thin, +fal, +fad, +fa, +svg.iconfont, +img, +.lazyload + filter: brightness(convert(hexo-config('color_scheme.dark.brightness'))) !important + +//side +.widget.blogger .content .social-wrapper a.social:hover + background: var(--color-card) +.widget >.content ul.entry a .badge, .widget >.content ul.popular-posts a .badge + color: unset !important +.content + color: var(--color-p) +.widget >.content a + color: var(--color-p) !important + &:hover + color: var(--color-list-hl) !important +.note + background: var(--color-block) !important +div.tabs ul.nav-tabs li.tab.active a + color: var(--color-p) + background: var(--color-card) +kbd + background: var(--color-block) !important +.cover-wrapper.dock .menu .list-h a:hover, .cover-wrapper.featured .menu .list-h a:hover, .cover-wrapper.focus .menu .list-h a:hover + color: var(--color-text) !important + +//highlight +if hexo-config('plugins.code_highlight') == "highlightjs" + .gutter + background: var(--color-card) !important + background-color: var(--color-card) !important + .highlight figcaption + background-color: #14161a + .highlight pre .line, .highlight pre .params + color: rgba(158, 142, 142, 0.9) + +//table +*:not(.highlight) >table tr + background-color: var(--color-card) +*:not(.highlight) >table th + background: var(--color-site-bg) +*:not(.highlight) table td,*:not(.highlight) table th + border-color: var(--color-site-bg) +*:not(.highlight) >table tr:hover + background: var(--color-codeblock) +.timenode .highlight + border-color: var(--color-site-bg) !important +blockquote p + color: var(--color-p) + +// tags +#archive-page .archive .all-tags ul li span + color: var(--color-text) + background: #6f6f72 + +// btn-copy +.btn-copy:hover + background: var(--color-site-body) + +if hexo-config('comments.service')=='gitalk' + .gt-container .gt-header-textarea + background-color: var(--color-card) + &:hover + background-color: var(--color-block) + .gt-container .gt-comment-content + background-color: var(--color-card) + &:hover + box-shadow: none + .gt-container .gt-comment-admin .gt-comment-content + background-color: var(--color-card) + +if hexo-config('plugins.aplayer.enable') + .aplayer + background: var(--color-site-bg) + .aplayer .aplayer-list ol li:hover + background: rgba($color-theme,.2) + .aplayer .aplayer-list ol li.aplayer-list-light + background: var(--color-block) + .aplayer-info + background: var(--color-site-bg) !important + .aplayer .aplayer-lrc:before + background: linear-gradient(180deg,#282c34 0,hsla(0,0%,100%,0)) + .aplayer .aplayer-lrc:after + background: linear-gradient(180deg,hsla(0,0%,0%,0) 0,hsla(0,0%,13%,.8)) + .aplayer-pic + filter: brightness(convert(hexo-config('color_scheme.dark.brightness'))) + .aplayer .aplayer-list ol li + border-top: 1px solid var(--color-card) + .aplayer.aplayer-withlist .aplayer-info + border-bottom: 1px solid var(--color-block) + .aplayer .aplayer-notice + background-color: var(--color-site-bg) !important + +if hexo-config('comments.service')=='twikoo' + .OwO + .OwO-body + color: silver !important + background-color: #252627 !important + border-color: #4a4b50 !important + .OwO-bar + border-top: 1px solid #4a4b50 !important + background:#4a4b50 !important + color: #ccc !important + .OwO-packages + li:hover + background-color: #252627 !important + .OwO-package-active + background-color: #252627 !important + .OwO-items + .OwO-item + background:#4a4b50 !important + color: #ccc !important + .OwO-items-image + .OwO-item:hover + background-color: #252627 !important + +if hexo-config('plugins.tianliGPT.enable') + /* AI */ + .post-TianliGPT { + background: #30343f; + border-radius: 12px; + padding: 12px; + line-height: 1.3; + border: 1px solid #3d3d3f; + margin-top: 16px; + } + + @media screen and (max-width: 768px) { + .post-TianliGPT { + margin-top: 22px; + } + } + + .tianliGPT-title { + display: flex; + color: #f2b94b; + border-radius: 8px; + align-items: center; + padding: 0 12px; + cursor: default; + user-select: none; + } + + .tianliGPT-title-text { + font-weight: bold; + margin-left: 8px; + line-height: 1; + } + + .tianliGPT-explanation { + margin-top: 12px; + padding: 8px 12px; + background: #1d1e22; + border-radius: 8px; + border: 1px solid #3d3d3f; + font-size: 15px; + line-height: 1.4; + display: block; + } + + .tianliGPT-suggestions { + display: flex; + flex-wrap: wrap; + } + + .tianliGPT-suggestions .tianliGPT-suggestions-item { + margin-top: 12px; + padding: 8px 12px; + background: #1d1e22; + border-radius: 8px 8px 8px 0; + border: 1px solid #3d3d3f; + font-size: 15px; + line-height: 1.4; + display: flex; + width: fit-content; + margin-right: 12px; + cursor: pointer; + transition: 0.3s; + } + + .tianliGPT-suggestions .tianliGPT-suggestions-item:hover { + background: #f2b94b; + color: #fff; + } + + .blinking-cursor { + background-color: #f2b94b; + width: 10px; + height: 16px; + display: inline-block; + vertical-align: middle; + animation: blinking-cursor 0.5s infinite; + -webkit-animation: blinking-cursor 0.5s infinite; + margin-left: 4px; + } + + @keyframes blinking-cursor { + 0% { + opacity: 1; + } + + 40% { + opacity: 1; + } + + 50% { + opacity: 0; + } + + 90% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .tianliGPT-tag { + font-size: 12px; + background-color: #f2b94b; + color: #1d1e22; + font-weight: bold; + border-radius: 4px; + margin-left: auto; + line-height: 1; + padding: 4px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: 0.3s; + } + + .tianliGPT-tag:hover { + background: #F7F7FA; + color: #1d1e22; + } + + ins.adsbygoogle { + margin: 16px 0; + background: #1d1e22; + border-radius: 12px; + overflow: hidden; + border: 1px solid #3d3d3f; + } + + #tianliGPT-Toggle { + font-size: 12px; + background: #f2b94b; + color: #1d1e22; + padding: 4px; + border-radius: 4px; + margin-left: 6px; + transform: scale(0.8); + cursor: pointer; + transition: 0.3s; + font-weight: bold; + } + + #tianliGPT-Toggle:hover { + background: #F7F7FA; + color: #1d1e22; + } + + .tianliGPT-title-icon { + width: 20px; + height: 20px; + } + + .tianliGPT-title-icon svg { + width: 20px; + height: 20px; + fill: #f2b94b; + } + + .tianliGPT-title-icon svg path { + fill: #f2b94b; + } + +// Custom Files +for $injects_dark in hexo-config('injects.dark') + @import $injects_dark; +// eg: +// body +// --color-site-body: blue !important diff --git a/themes/volantis/source/css/_style/_plugins/_highlight/highlightjs/clipboard.styl b/themes/volantis/source/css/_style/_plugins/_highlight/highlightjs/clipboard.styl new file mode 100755 index 0000000..8a7ac7c --- /dev/null +++ b/themes/volantis/source/css/_style/_plugins/_highlight/highlightjs/clipboard.styl @@ -0,0 +1,36 @@ +//代码块复制按钮 +.highlight + //方便copy代码按钮(btn-copy)的定位 + position: relative + +.btn-copy + z-index: 1 + display: inline-block + cursor: pointer + border: none + disable-user-select() + -webkit-appearance: none + font-family: Menlo, $fontfamily-code + font-size: 11px + font-weight: bold + padding: $gap * 0.25 $gap * 0.5 + >i + margin-right: 4px + color: var(--color-meta) + background: var(--color-block) + border-radius: 3px + box-shadow: $boxshadow-card + position: absolute + top: 1px + right: 1px + opacity: 0 + trans() + &:hover + color: $color-hover + background: bgcolor($color-hover) + +.highlight:hover .btn-copy + opacity: 1 + +.article pre:hover .btn-copy + opacity: 1 diff --git a/themes/volantis/source/css/_style/_plugins/_highlight/highlightjs/color.styl b/themes/volantis/source/css/_style/_plugins/_highlight/highlightjs/color.styl new file mode 100755 index 0000000..0ade67b --- /dev/null +++ b/themes/volantis/source/css/_style/_plugins/_highlight/highlightjs/color.styl @@ -0,0 +1,96 @@ +$hl-keyword = #9c27b0 +$hl-blue = #1E80F0 +$hl-cyan = #17AFCA +$hl-green = #3FA33F +$hl-light-blue = #6ECDF9 +$hl-red = #EE2B29 +$hl-orange = #FB3F1B +$hl-amber = #FD8607 +$hl-text = alpha($color-text, .9) +.highlight pre + // 行 + .line,.params + color: $hl-text + + .line .addition + color: $hl-green + .line .deletion + color: $hl-red + + .marked + background-color: alpha(#FED542, .4) + padding: 2px 8px 2px 0 + border-radius: 2px + width: 100% + + .title, .attr, .attribute + color: $color-md-indigo + + // 注释 + .comment + color: var(--color-meta) + + .keyword, .meta-keyword, .javascript .function + color: $hl-keyword + + .type, .built_in, .tag .name + color: $color-md-light-blue + + .variable, .regexp, .ruby .constant, .xml .tag .title, .xml .pi, .xml .doctype, .html .doctype, .css .id, .css .class, .css .pseudo + color: $hl-amber + + .number, .preprocessor, .literal, .constant + color: $hl-amber + + .class, .ruby .class .title, .css .rules .attribute + color: $color-md-orange + + .string, .meta-string + color: darken($color-md-green, 10%) + + .value, .inheritance, .header, .ruby .symbol, .xml .cdata + color: $color-md-green + + .css .hexcolor + color: #66cccc + + .function, .python .decorator, .python .title, .ruby .function .title, .ruby .title .keyword, .perl .sub, .javascript .title, .coffeescript .title + color: #6699cc + + +.highlight.html,.highlight.css,.highlight.less,.highlight.stylus + .line + .tag .name, .selector-tag + color: $hl-red + .selector-class, .selector-attr + color: $hl-amber + .attribute + color: $color-md-indigo + .number + color: $hl-cyan + + +.highlight.objc,.highlight.objectivec,.highlight.swift,.highlight.c + .line + .meta + color: $hl-keyword + .meta-string,.string + color: $hl-orange + .class + color: $hl-text + .title + color: $hl-blue + .comment + color: $hl-green + +.highlight.json + .line + .attr + color: #E24F5A + .literal + color: $color-md-indigo + +.highlight.yaml + .line + .attr + color: #E24F5A diff --git a/themes/volantis/source/css/_style/_plugins/_highlight/highlightjs/index.styl b/themes/volantis/source/css/_style/_plugins/_highlight/highlightjs/index.styl new file mode 100755 index 0000000..bc7370f --- /dev/null +++ b/themes/volantis/source/css/_style/_plugins/_highlight/highlightjs/index.styl @@ -0,0 +1,102 @@ +@import 'clipboard' +@import 'language' +@import 'color' + +pre + position: relative + +.hljs + margin: 0 - $gap !important + padding: $gap !important + -webkit-font-smoothing: auto + -moz-osx-font-smoothing: auto + scrollbar() + + +.highlight + position: relative + width: 100% + margin: $gap-p 0 + display: block + background: var(--color-block) + font-size: $fontsize-code + font-family: $fontfamily-code + border-radius: $border-codeblock + // border: 1px solid transparent + line-height: 1.5 + -webkit-font-smoothing: auto + -moz-osx-font-smoothing: auto + // overflow: hidden // 实验中发现 overflow 这个属性设置为 hidden/auto 会导致手机端长文本代码块截断仅显示 70 行, PC端无影响. + trans() + if hexo-config('custom_css.body.highlight.grayscale') == true + filter: grayscale(100%) + &:hover + background: var(--color-codeblock) + if hexo-config('custom_css.body.highlight.grayscale') == true + filter: grayscale(0%) + figcaption + trans() + background: darken($color-codeblock, 5%) + .gutter + background: darken($color-codeblock, 5) + figcaption + font-size: 13px + position: sticky + left: 0 + padding: $gap * 0.25 $gap * 0.5 $gap * 0.25 $gap * 0.5 + background: darken($color-block, 5%) + border-top-left-radius: "calc(%s - 1px)" % $border-codeblock + border-top-right-radius: "calc(%s - 1px)" % $border-codeblock + + >table + overflow: auto + display: block + scrollbar-codeblock() + td,th + padding: 0 + border: none + line-height: 1.5 + margin: 0 + background-color: transparent + border: none + tr + background-color: transparent + &:hover + background-color: transparent + pre + overflow-y: hidden + + .gutter + disable-user-select() + padding: 0 12px + text-align: right + border-width: 0 + margin-left: 0 + position: sticky + left: 0 + z-index: 1 + background: darken($color-block, 5) + pre + color: var(--color-meta) + + + pre + background: transparent + margin: 0 + padding: 0 + border: none + .code:before + display: none + + .code + padding: $gap * 1.25 $gap + vertical-align: top + background-color: transparent + &:before + content: "" + position: absolute + top: 0 + right: 0 + color: var(--color-meta) + font-size: 13px + padding: 4px 8px diff --git a/themes/volantis/source/css/_style/_plugins/_highlight/highlightjs/language.styl b/themes/volantis/source/css/_style/_plugins/_highlight/highlightjs/language.styl new file mode 100755 index 0000000..054dff8 --- /dev/null +++ b/themes/volantis/source/css/_style/_plugins/_highlight/highlightjs/language.styl @@ -0,0 +1,63 @@ +if hexo-config('custom_css.body.highlight.language') == true + .hljs,.highlight + &:before + position: absolute + top: 0 + right: 0 + color: var(--color-meta) + font-size: 13px + padding: 4px 8px + &.md:before,&.markdown:before + content: "md" + &.yaml:before + content: "YAML" + &.json:before + content: "JSON" + + &.html:before + content: "HTML" + &.js:before,&.javascript:before + content: "JS" + &.css:before + content: "CSS" + &.less:before + content: "Less" + &.stylus:before + content: "Stylus" + + &.bash:before + content: "bash" + &.shell:before + content: "shell" + &.sh:before + content: "sh" + &.ini:before + content: "ini" + + &.c:before + content: "C" + &.cpp:before + content: "C++" + &.objc:before,&.objectivec:before + content: "Objective-C" + &.swift:before + content: "Swift" + + &.java:before + content: "Java" + &.python:before + content: "Python" + &.php:before + content: "PHP" + &.rust:before + content: "Rust" + &.sql:before + content: "SQL" + &.ruby:before + content: "Ruby" + &.makefile:before + content: "Makefile" + &.go:before + content: "Go" + &.typescript:before + content: "TypeScript" \ No newline at end of file diff --git a/themes/volantis/source/css/_style/_plugins/_highlight/index.styl b/themes/volantis/source/css/_style/_plugins/_highlight/index.styl new file mode 100755 index 0000000..93ef378 --- /dev/null +++ b/themes/volantis/source/css/_style/_plugins/_highlight/index.styl @@ -0,0 +1 @@ +@import hexo-config('plugins.code_highlight') diff --git a/themes/volantis/source/css/_style/_plugins/_highlight/prismjs/clipboard.styl b/themes/volantis/source/css/_style/_plugins/_highlight/prismjs/clipboard.styl new file mode 100755 index 0000000..ca9f2cc --- /dev/null +++ b/themes/volantis/source/css/_style/_plugins/_highlight/prismjs/clipboard.styl @@ -0,0 +1,33 @@ +//代码块复制按钮 +.code-toolbar + //方便copy代码按钮(btn-copy)的定位 + position: relative + +.btn-copy + z-index: 1 + display: inline-block + cursor: pointer + border: none + disable-user-select() + -webkit-appearance: none + font-family: Menlo, $fontfamily-code + font-size: 11px + font-weight: bold + padding: $gap * 0.25 $gap * 0.5 + >i + margin-right: 4px + color: var(--color-meta) + background: var(--color-card) + border-radius: 3px + box-shadow: $boxshadow-card + position: absolute + top: 5px + right: 5px + opacity: 0 + trans() + &:hover + color: $color-hover + background: bgcolor($color-hover) + +.code-toolbar:hover .btn-copy + opacity: 1 \ No newline at end of file diff --git a/themes/volantis/source/css/_style/_plugins/_highlight/prismjs/index.styl b/themes/volantis/source/css/_style/_plugins/_highlight/prismjs/index.styl new file mode 100755 index 0000000..4ecc431 --- /dev/null +++ b/themes/volantis/source/css/_style/_plugins/_highlight/prismjs/index.styl @@ -0,0 +1,8 @@ +@import 'clipboard' +@import 'language' + +pre + position: relative + -webkit-font-smoothing: auto + -moz-osx-font-smoothing: auto + scrollbar() diff --git a/themes/volantis/source/css/_style/_plugins/_highlight/prismjs/language.styl b/themes/volantis/source/css/_style/_plugins/_highlight/prismjs/language.styl new file mode 100755 index 0000000..f2e81e6 --- /dev/null +++ b/themes/volantis/source/css/_style/_plugins/_highlight/prismjs/language.styl @@ -0,0 +1,63 @@ +if hexo-config('custom_css.body.highlight.language') == true + pre + &:before + position: absolute + top: 0 + right: 0 + color: var(--color-meta) + font-size: 13px + padding: 4px 8px + &.language-md:before,&.markdown:before + content: "md" + &.language-yaml:before + content: "YAML" + &.language-json:before + content: "JSON" + + &.language-html:before + content: "HTML" + &.language-js:before,&.language-javascript:before + content: "JS" + &.language-css:before + content: "CSS" + &.language-less:before + content: "Less" + &.language-stylus:before + content: "Stylus" + + &.language-bash:before + content: "bash" + &.language-shell:before + content: "shell" + &.language-sh:before + content: "sh" + &.language-ini:before + content: "ini" + + &.language-c:before + content: "C" + &.language-cpp:before + content: "C++" + &.language-objc:before,&.language-objectivec:before + content: "Objective-C" + &.language-swift:before + content: "Swift" + + &.language-java:before + content: "Java" + &.language-python:before + content: "Python" + &.language-php:before + content: "PHP" + &.language-rust:before + content: "Rust" + &.language-sql:before + content: "SQL" + &.language-ruby:before + content: "Ruby" + &.language-makefile:before + content: "Makefile" + &.language-go:before + content: "Go" + &.language-typescript:before + content: "TypeScript" diff --git a/themes/volantis/source/css/_style/_plugins/_rightmenu/reading.styl b/themes/volantis/source/css/_style/_plugins/_rightmenu/reading.styl new file mode 100755 index 0000000..9e3675a --- /dev/null +++ b/themes/volantis/source/css/_style/_plugins/_rightmenu/reading.styl @@ -0,0 +1,56 @@ +.common_read + z-index: auto !important + opacity: 1 !important + overflow: visible !important + transform: none !important + animation: none !important + position: relative !important + +.body-wrapper.common_read + display: block + +#safearea.common_read + padding-bottom: 16px + @media screen and (max-width: 900px) + padding: 0 + margin: 0 + +#l_body.common_read + z-index: 2147483646 !important; + +.read_cover + min-height: 10px !important + @media screen and (max-width: 900px) + min-height: 0 !important + +.common_read_bkg + background-color: var(--color-read-bkg) !important + opacity: 1 !important + display: block !important + position: fixed !important + top: 0 !important + left: 0 !important + right: 0 !important + bottom: 0 !important + z-index: 2147483645 !important + transition: opacity 1s cubic-bezier(.23,1,.32,1) 0ms !important + +.common_read_hide + opacity: 0 !important + z-index: -2147483645 !important + +.common_read_main + width: 840px !important; + padding: 0 !important; + margin: 0 auto; + float: initial !important; + @media screen and (max-width: 900px) + width: auto !important; + +.post_read + background-color: var(--color-read-post) !important + z-index: 2147483646 !important + overflow: visible !important + font-size: 1.15rem !important + border-radius: 0 !important; + box-shadow: 0 6px 12px 3px #00000033 \ No newline at end of file diff --git a/themes/volantis/source/css/_style/_plugins/_rightmenu/rightmenu.styl b/themes/volantis/source/css/_style/_plugins/_rightmenu/rightmenu.styl new file mode 100755 index 0000000..790378c --- /dev/null +++ b/themes/volantis/source/css/_style/_plugins/_rightmenu/rightmenu.styl @@ -0,0 +1,110 @@ +div#rightmenu-wrapper + display: none + position:fixed + z-index: 2147483648 + disable-user-select() +ul.list-v.rightmenu + display: block + max-width: 240px + overflow: hidden + &.left + right: 0 + &.top + bottom: 0 + $cellH = 32px + a + cursor: default + a.vlts-menu + text-overflow: ellipsis + overflow: hidden + line-height: $cellH + font-weight: normal + >li>span + trans() + display: block + color: var(--color-list) + font-size: $fontsize-meta + // font-weight: bold + line-height: 36px + @media screen and (max-width: $device-laptop) + line-height: 40px + padding: 0 $gap + $border-line + 2px 0 $gap + text-overflow: ellipsis + margin: 0 4px + border-radius: 4px + >i + margin-right: 8px + &:active,&.active + list_active() + &:hover + list_hover() + li.navigation, li.music + display: flex + justify-content: space-between + a.icon-only + line-height: 0 + margin: 0 + padding: 0 + border-radius: $cellH + overflow: hidden + width: $cellH + height: $cellH + a.nav + i + margin: 0 + width: $cellH + line-height: $cellH + &:first-child + margin-left: 2px + $gap * 0.5 + &:last-child + margin-right: 2px + $gap * 0.5 + li.music + &.name + display: flex + flex-direction: column + align-items: center + p.nav.music-title + color: mix($color-text, $color-card, 80) + font-size: $fontsize-meta + max-width: 128px + margin: 0 4px + $gap + overflow: hidden + &:hover + background: none + .nav.volume + width: 100% + padding: 0 $gap * 0.5 + &:hover + background: transparent + .aplayer-volume-bar + margin: $gap * 0.25 0 $gap * 0.5 + position: relative + height: 8px + width: 100% + background: mix($color-block, $color-text, 95) + border-radius: $cellH + overflow: hidden + cursor: pointer + i.left, i.right + color: mix($color-text, $color-card, 80) + position: absolute + top: 0 + width: $cellH - 4px + line-height: $cellH - 4px + trans() + opacity: 0 + transform: scale(0.5) translateY(-0.5 * $cellH - 2px) + i.left + left: 0 + i.right + right: 0 + trans() + &:hover + height: $cellH - 4px + i + opacity: 1 + transform: scale(1) translateY(0) + .aplayer-volume + background: $color-theme + height: 100% + width: 100% diff --git a/themes/volantis/source/css/_style/_plugins/aplayer.styl b/themes/volantis/source/css/_style/_plugins/aplayer.styl new file mode 100755 index 0000000..59f12ce --- /dev/null +++ b/themes/volantis/source/css/_style/_plugins/aplayer.styl @@ -0,0 +1,36 @@ +@media screen and (max-width: $device-mobile) + .l_header + .list-v + .aplayer,.aplayer-pic + border-radius: $border-card * 0.5 + width: 64px + height: 64px + +.aplayer-container + display: flex + justify-content: center + min-height: 100px + meting-js + max-width: 100% + + +.aplayer + max-width: 500px + border-radius: 4px + color: var(--color-text) + font-family: $fontfamily + .aplayer-list + text-align: left + @media screen and (max-width: $device-mobile) + border-radius: $border-card + +.l_header + .aplayer-volume-wrap + display: none !important // 隐藏导航栏播放器音量调节 see: https://github.com/volantis-x/hexo-theme-volantis/issues/328 + + +if hexo-config('plugins.aplayer.autoHide') + .aplayer.aplayer-fixed.aplayer-narrow .aplayer-body + left: -66px !important + &:hover + left: 0px !important diff --git a/themes/volantis/source/css/_style/_plugins/cursor.styl b/themes/volantis/source/css/_style/_plugins/cursor.styl new file mode 100755 index 0000000..9974062 --- /dev/null +++ b/themes/volantis/source/css/_style/_plugins/cursor.styl @@ -0,0 +1,144 @@ +$text = url(hexo-config('custom_css.cursor.text')) +$pointer = url(hexo-config('custom_css.cursor.pointer')) +$default = url(hexo-config('custom_css.cursor.default')) +$not-allowed = url(hexo-config('custom_css.cursor.not-allowed')) +$zoom-out = url(hexo-config('custom_css.cursor.zoom-out')) +$zoom-in = url(hexo-config('custom_css.cursor.zoom-in')) +$grab = url(hexo-config('custom_css.cursor.grab')) + + +///////////////// +// 样式覆盖区域 // +///////////////// + + +p, +input, +pre>span, +textarea + cursor: $text,text + + +.fancybox-container .fancybox-stage, +.fancybox__carousel .is-draggable + cursor: $zoom-out,zoom-out + + +.fancybox a, +.fancybox-can-zoomIn .fancybox-content, +.fancybox__carousel .fancybox__slide.can-zoom_in .fancybox__content + cursor: $zoom-in,zoom-in + +span.btn>a:not([href]):hover, +.fancybox-button[disabled], .fancybox-button[disabled]:hover, +.gt-container .gt-btn.is--disable, +span.not-select + cursor: $not-allowed,not-allowed + + +html, +a:not([href]), +a:not([href]) p, +button[disabled],html input[disabled], +.article .widget, +#l_body .post section.meta .new-meta-box .new-meta-item .notlink, +#rightmenu-wrapper ul.list-v.rightmenu a, +span.btn a:not([href]), +div.tabs ul.nav-tabs li.tab.active a, +kbd, +.a > p, +.not-select, +.not-select p, +.aplayer .aplayer-info .aplayer-music, +.gt-container a.is--active, +.iziToast, +.iziToast p, +.iframe, +.embed-show, +p > img, +p > svg, +.fix-cursor-default + cursor: $default,default + + +a, +psw, +button, +html input[type=button], +input[type=reset], +input[type=submit], +table::-webkit-scrollbar-thumb, +scrollbar::-webkit-scrollbar-thumb, +#scroll-down, +#rightmenu-wrapper .aplayer-volume-bar, +#rightmenu-wrapper li.music.ctrl a, +#u-search .modal .modal-header .btn-close, +#u-search .modal .modal-footer .nav, +article .checkbox input, +details summary, +.article a.link-card, +div.tabs ul.nav-tabs li.tab a, +.btn-copy, +.fancybox-can-pan .fancybox-content,.fancybox-can-swipe .fancybox-content, +.waves-effect,a.result.search-result-fix, +.tag > p, +.prev > p, +.next > p, +.author > p, +.list-h > a > p, +.category > a > p, +.friend-right p, +.v[data-class=v] a, +.v[data-class=v] .vbtn, +.v[data-class=v] .vicon, +.v[data-class=v] .vcards .vcard .vhead .vnick, +.v[data-class=v] .vcards .vcard .vh .vmeta .vat, +.v[data-class=v] .vwrap .vemojis i, +.v[data-class=v] .vcards .vcard .vcontent.expand, +.aplayer .aplayer-pic, +.aplayer .aplayer-info .aplayer-controller .aplayer-time .aplayer-icon, +.aplayer .aplayer-info .aplayer-controller .aplayer-bar-wrap, +.aplayer .aplayer-list ol li, +.aplayer .aplayer-list ol li .aplayer-list-author, +.aplayer .aplayer-list ol li .aplayer-list-index, +.waves-button, .waves-button-input, .waves-button:hover, .waves-button:visited, +.fancybox-button, +.gt-container .gt-btn, +.gt-container .gt-user-inner, +.gt-container .gt-avatar-github, +.gt-container .gt-popup .gt-action, +.gt-container .gt-comment-like:hover, +.gt-container .gt-comment-edit:hover, +.gt-container .gt-comment-reply:hover, +.tk-icon, +.tk-avatar img, +.tk-meta a, +.tk-action-icon, +.fancybox, +.fix-cursor-pointer + cursor: $pointer,pointer + +// 强制覆盖区域 +.cur-default + cursor: $default,default !important + +.cur-pointer, +.carousel__button, +.fancybox__slide + cursor: $pointer,pointer !important + +.cur-not-allowed + cursor: $not-allowed,not-allowed !important + +.cur-zoom-in, +.fancybox__carousel .fancybox__slide.can-zoom_in .fancybox__content, +.has-image[data-image-fit=contain].can-zoom_in .fancybox__image + cursor: $zoom-in,zoom-in !important + +.cur-zoom-out, +.fancybox__carousel .is-draggable, +.has-image[data-image-fit=contain].is-draggable .fancybox__image + cursor: $zoom-out,zoom-out !important + +.cur-text + cursor: $text,text !important diff --git a/themes/volantis/source/css/_style/_plugins/fontcolor.styl b/themes/volantis/source/css/_style/_plugins/fontcolor.styl new file mode 100755 index 0000000..d03a7aa --- /dev/null +++ b/themes/volantis/source/css/_style/_plugins/fontcolor.styl @@ -0,0 +1,84 @@ +// Icon 颜色 +// https://flatuicolors.com/palette/defo +.fa, +.fas, +.far, +.fad, +.fal, +.fa-solid, +.fa-regular, +.fa-duotone, +.fa-light, +.fa-thin, +// 图标颜色自定义 +.iziToast>.iziToast-body .iziToast-icon + &.red + color: $color-md-red + &.pink + color: $color-md-pink + &.purple + color: $color-md-purple + &.indigo + color: $color-md-indigo + &.light-blue + color: $color-md-light-blue + &.deep-blue + color: $color-md-deep-blue + &.teal + color: $color-md-teal + &.light-green + color: $color-md-light-green + &.orange + color: $color-md-orange + &.deep-orange + color: $color-md-deep-orange + &.brown + color: $color-md-brown + &.blue-grey + color: $color-md-blue-grey + &.yellow + color: $color-md-yellow + + &.TURQUOISE + color: #1abc9c + &.EMERALD + color: #2ecc71 + &.PETERRIVE + color: #3498db + &.AMETHYST + color: #9b59b6 + &.WETASPHALT + color: #34495e + + &.GREENSEA + color: #16a085 + &.NEPHRITIS + color: #27ae60 + &.BELIZEHOLE + color: #2980b9 + &.WISTERIA + color: #8e44ad + &.MIDNIGHTBLUE + color: #2c3e50 + + &.SUNFLOWER + color: #f1c40f + &.CARROT + color: #e67e22 + &.ALIZARIN + color: #e74c3c + &.CLOUDS + color: #ecf0f1 + &.CONCRETE + color: #95a5a6 + + &.ORANGE + color: #f39c12 + &.PUMPKIN + color: #d35400 + &.POMEGRANATE + color: #c0392b + &.SILVER + color: #bdc3c7 + &.ASBESTOS + color: #7f8c8d \ No newline at end of file diff --git a/themes/volantis/source/css/_style/_plugins/gitalk.styl b/themes/volantis/source/css/_style/_plugins/gitalk.styl new file mode 100755 index 0000000..af99f7e --- /dev/null +++ b/themes/volantis/source/css/_style/_plugins/gitalk.styl @@ -0,0 +1,467 @@ +/* variables */ +$gt-color-main := $color-theme +$gt-color-sub := #a1a1a1 +$gt-color-loader := #999999 +$gt-color-error := $color-md-red +$gt-color-hr := #E9E9E9 +$gt-color-input-border := rgba(0,0,0,0.1) +$gt-color-input-bg := #f6f6f6 +$gt-color-comment-bg := #f9f9f9 +$gt-color-comment-adminbg := #f6f9fe +$gt-color-comment-txt := #333333 +$gt-color-link-active := #333333 +$gt-color-btn := #ffffff +$gt-color-popbg := #ffffff +$gt-size-base := 16px // default font-size +$gt-size-border-radius := 5px +$gt-breakpoint-mobile := 479px +$gt-mask-z-index := 9999 + +/* functions & mixins */ +clearfix() { + &:before, + &:after { + content: " "; + display: table; + } + &:after { clear: both; } +} +em($px, $base-size = $gt-size-base) + u = unit($px) + if (u is 'px') + unit($px / $base-size, 'em') + else + unit($px, u) + +mobile() + @media (max-width: $gt-breakpoint-mobile) + {block} + +/* variables - calculated */ +$gt-size-loader-dot := em(6px) +$gt-size-loader := em(28px) +$gt-size-avatar := em(50px) +$gt-size-avatar-mobi := em(32px) + +/* styles */ +// Put everything under container to avoid style conflicts +.gt-container + box-sizing: border-box + * + box-sizing: border-box + font-size: $gt-size-base + // common + a + color: $gt-color-main + &:hover + color: lighten($gt-color-main, 20%) + border-color: lighten($gt-color-main, 20%) + &.is--active + color: $gt-color-link-active + cursor: default + &:hover + color: $gt-color-link-active + .hide + display: none !important + // icons + .gt-svg + display: inline-block + width: em(16px) + height: em(16px) + vertical-align: sub + svg + width: 100% + height: 100% + fill: $gt-color-main + .gt-ico + display: inline-block + &-text + margin-left: em(5px) + &-github + width: 100% + height: 100% + .gt-svg + width: 100% + height: 100% + svg + fill: inherit + /* loader */ + .gt-spinner + position: relative + &::before + content: '' + box-sizing: border-box + position: absolute + top: 3px + width: em(12px) + height: em(12px) + margin-top: em(-3px) + margin-left: em(-6px) + border-radius: 50% + border: 1px solid $gt-color-btn + border-top-color: $gt-color-main + animation: gt-kf-rotate .6s linear infinite + + .gt-loader + position: relative + border: 1px solid $gt-color-loader + animation: ease gt-kf-rotate 1.5s infinite + display: inline-block + font-style: normal + width: $gt-size-loader + height: $gt-size-loader + //font-size: $gt-size-loader + line-height: $gt-size-loader + border-radius: 50% + &:before + content: '' + position: absolute + display: block + top: 0 + left: 50% + margin-top: -($gt-size-loader-dot / 2) + margin-left: -($gt-size-loader-dot / 2) + width: $gt-size-loader-dot + height: $gt-size-loader-dot + background-color: $gt-color-loader + border-radius: 50% + // avatar + .gt-avatar + display: inline-block + width: $gt-size-avatar + height: $gt-size-avatar + +mobile() + width: $gt-size-avatar-mobi + height: $gt-size-avatar-mobi + img + width: 100% + height: auto + border-radius: 3px + &-github + width: $gt-size-avatar - em(2px) + height: $gt-size-avatar - em(2px) + cursor: pointer + +mobile() + width: $gt-size-avatar-mobi - em(2px) + height: $gt-size-avatar-mobi - em(2px) + // button + .gt-btn + padding: em(12px) em(20px) + display: inline-block + line-height: 1 + text-decoration: none + white-space: nowrap + cursor: pointer + border: 1px solid $gt-color-main + border-radius: $gt-size-border-radius + background-color: $gt-color-main + color: $gt-color-btn + outline: none + font-size: em(12px) + &-text + font-weight: 400 + &-loading + position: relative + margin-left: em(8px) + display: inline-block + width: em(12px) + height: em(16px) + vertical-align: top + &.is--disable + cursor: not-allowed + opacity: 0.5 + &-login + margin-right: 0 + &-preview + background-color: $gt-color-btn + color: $gt-color-main + &:hover + background-color: darken($gt-color-btn, 5%) + border-color: lighten($gt-color-main, 20%) + &-public + &:hover + background-color: lighten($gt-color-main, 20%) + border-color: lighten($gt-color-main, 20%) + &-loadmore + // loadmore + + /* error */ + .gt-error + text-align: center + margin: em(10px) + color: $gt-color-error + + /* initing */ + .gt-initing + padding: em(20px) 0 + text-align: center + &-text + margin: em(10px) auto + font-size: 92% + + /* no int */ + .gt-no-init + padding: em(20px) 0 + text-align: center + + /* link */ + .gt-link + border-bottom: 1px dotted $gt-color-main + &-counts, &-project + text-decoration: none + + /* meta */ + .gt-meta + margin: em(20px) 0 + padding: em(16px) 0 + position: relative + border-bottom: 1px solid $gt-color-hr + font-size: em(16px) + position: relative + z-index: 10 + clearfix() + + .gt-counts + margin: 0 em(10px) 0 0 + + .gt-user + float: right + margin: 0 + font-size: 92% + &-pic + width: 16px + height: 16px + vertical-align: top + margin-right: em(8px) + &-inner + display: inline-block + cursor: pointer + .gt-ico + margin: 0 0 0 em(5px) + svg + fill: inherit + .is--poping + .gt-ico + svg + fill: $gt-color-main + + .gt-version + color: $gt-color-sub + margin-left: em(6px) + + .gt-copyright + margin: 0 em(15px) em(8px) + border-top: 1px solid $gt-color-hr + padding-top: em(8px) + + /* popup */ + .gt-popup + position: absolute + right: 0 + top: em(38px) + background: $gt-color-popbg + display: inline-block + border: 1px solid $gt-color-hr + padding: em(10px) 0 + font-size: em(14px) + letter-spacing: .5px + .gt-action + cursor: pointer + display: block + margin: em(8px) 0 + padding: 0 em(18px) + position: relative + text-decoration: none + &.is--active + &:before + content: '' + width: em(4px) + height: em(4px) + background: $gt-color-main + position: absolute + left: em(8px) + top: em(7px) + /* header */ + .gt-header + position: relative + display: flex + &-comment + flex: 1 + margin-left: em(20px) + +mobile() + margin-left: em(14px) + &-textarea + padding: em(12px) + display: block + box-sizing: border-box + width: 100% + min-height: em(82px) + max-height: em(240px) + border-radius: $gt-size-border-radius + border: 1px solid $gt-color-input-border + font-size: em(14px) + word-wrap: break-word + resize: vertical + background-color: $gt-color-input-bg + outline: none + transition: all 0.25s ease + &:hover + background-color: lighten($gt-color-input-bg, 50%) + // box-shadow: 0 em(10px) em(60px) 0 $gt-color-input-bg + &-preview + padding: em(12px) + border-radius: $gt-size-border-radius + border: 1px solid $gt-color-input-border + background-color: $gt-color-input-bg + &-controls + position: relative + margin: em(12px) 0 0 + clearfix() + +mobile() + margin: 0 + &-tip + font-size: em(14px) + color: $gt-color-main + text-decoration: none + vertical-align: sub + +mobile() + display: none + .gt-btn + float: right + margin-left: em(20px) + +mobile() + float: none + width: 100% + margin: em(12px) 0 0 + + &:after + content: '' + position: fixed + bottom: 100% + left: 0 + right: 0 + top: 0 + opacity: 0 + &.gt-input-focused + position: relative + &:after + content: '' + position: fixed + bottom: 0% + left: 0 + right: 0 + top: 0 + background: #000 + opacity: 0.6 + transition: opacity .3s, bottom 0s + z-index: $gt-mask-z-index + .gt-header-comment + z-index: $gt-mask-z-index + 1 + + /* comments */ + .gt-comments + padding-top: em(20px) + &-null + text-align: center + &-controls + margin: em(20px) 0 + text-align: center + + /* comment */ + .gt-comment + position: relative + padding: em(10px) 0 + display: flex + &-content + flex: 1 + margin-left: em(20px) + padding: em(12px) em(16px) + background-color: $gt-color-comment-bg + overflow: auto + transition: all ease 0.25s + &:hover + box-shadow: 0 em(10px) em(60px) 0 darken($gt-color-comment-bg, 2%) + +mobile() + margin-left: em(14px) + padding: em(10px) em(12px) + &-header + margin-bottom: em(8px) + font-size: em(14px) + position: relative + &-block-1 + float: right + height: em(22px) + width: em(32px) + &-block-2 + float: right + height: em(22px) + width: em(64px) + &-username + font-weight: 500 + color: $gt-color-main + text-decoration: none + &:hover + text-decoration: underline + &-text + margin-left: em(8px) + color: $gt-color-sub + &-date + margin-left: em(8px) + color: $gt-color-sub + &-like, &-edit, &-reply + position: absolute + height: em(22px) + &:hover + cursor: pointer + &-like + top: 0 + right: em(32px) + &-edit, &-reply + top: 0 + right: 0 + &-body + color: $gt-color-comment-txt !important + .email-hidden-toggle a + display: inline-block; + height: 12px; + padding: 0 9px; + font-size: 12px; + font-weight: 600; + line-height: 6px; + color: #444d56; + text-decoration: none; + vertical-align: middle; + background: #dfe2e5; + border-radius: 1px; + &:hover + background-color: #c6cbd1; + .email-hidden-reply + display: none; + white-space: pre-wrap + .email-signature-reply + padding: 0 15px; + margin: 15px 0; + color: #586069; + border-left: 4px solid #dfe2e5; + .email-hidden-reply.expanded + display: block + &-admin + .gt-comment-content + background-color: $gt-color-comment-adminbg + +@keyframes gt-kf-rotate + 0% + transform: rotate(0) + 100% + transform: rotate(360deg) +.gt-initing-text + color: $gt-color-main !important + text-align: center !important +.markdown-body blockquote + border-left: .25em solid $gt-color-main !important + padding: 16.1px 16px 16px !important + transition: all .28s ease !important + -moz-transition: all .28s ease !important + -webkit-transition: all .28s ease !important + -o-transition: all .28s ease !important + diff --git a/themes/volantis/source/css/_style/_plugins/index.styl b/themes/volantis/source/css/_style/_plugins/index.styl new file mode 100755 index 0000000..ef71577 --- /dev/null +++ b/themes/volantis/source/css/_style/_plugins/index.styl @@ -0,0 +1,23 @@ +@import 'mathjax' +@import 'fontcolor' + + +if hexo-config('plugins.code_highlight') + @import '_highlight' +if hexo-config('plugins.message.enable') + @import 'message' +if hexo-config('plugins.aplayer.enable') + @import 'aplayer' +if hexo-config('plugins.tianliGPT.enable') + @import 'tianliGPT' +if hexo-config('comments.service')=='gitalk' + @import 'gitalk' +if hexo-config('custom_css.cursor.enable') + @import 'cursor' +if hexo-config('rightmenus.enable') + @import '_rightmenu/*' + + +// 暗黑模式样式放到最后加载 +if hexo-config('plugins.darkmode.enable') + @import '_dark/dark_async' \ No newline at end of file diff --git a/themes/volantis/source/css/_style/_plugins/mathjax.styl b/themes/volantis/source/css/_style/_plugins/mathjax.styl new file mode 100755 index 0000000..bbf7fa5 --- /dev/null +++ b/themes/volantis/source/css/_style/_plugins/mathjax.styl @@ -0,0 +1,10 @@ +.article + mjx-container + font-family: $fontfamily-code + padding: $gap $gap * 0.5 + border-radius: $border-codeblock + min-width: 0 !important + mjx-container[jax="CHTML"][display="true"], .has-jax + overflow: auto hidden + mjx-container + br + display: none diff --git a/themes/volantis/source/css/_style/_plugins/message.styl b/themes/volantis/source/css/_style/_plugins/message.styl new file mode 100755 index 0000000..7800b97 --- /dev/null +++ b/themes/volantis/source/css/_style/_plugins/message.styl @@ -0,0 +1,14 @@ +// 覆盖消息提示的样式 +//.iziToast-wrapper +// z-index: 2147483647 !important +.iziToast-texts + max-width: 300px !important + min-width: 200px !important + @media screen and (max-width: 500px) + max-width: unset !important + min-width: unset !important +.iziToast-title + margin-bottom: 6px !important + font-size: 1rem !important +.iziToast-message + word-break: break-all !important diff --git a/themes/volantis/source/css/_style/_plugins/tianliGPT.styl b/themes/volantis/source/css/_style/_plugins/tianliGPT.styl new file mode 100755 index 0000000..fb52416 --- /dev/null +++ b/themes/volantis/source/css/_style/_plugins/tianliGPT.styl @@ -0,0 +1,162 @@ +/* AI */ +.post-TianliGPT { + background: #f1f3f8; + border-radius: 12px; + padding: 12px; + line-height: 1.3; + border: 1px solid #e3e8f7; + margin-top: 16px; +} + +@media screen and (max-width: 768px) { + .post-TianliGPT { + margin-top: 22px; + } +} + +.tianliGPT-title { + display: flex; + color: #425AEF; + border-radius: 8px; + align-items: center; + padding: 0 12px; + cursor: default; + user-select: none; +} + +.tianliGPT-title-text { + font-weight: bold; + margin-left: 8px; + line-height: 1; +} + +.tianliGPT-explanation { + margin-top: 12px; + padding: 8px 12px; + background: #fff; + border-radius: 8px; + border: 1px solid #e3e8f7; + font-size: 15px; + line-height: 1.4; + display: block; +} + +.tianliGPT-suggestions { + display: flex; + flex-wrap: wrap; +} + +.tianliGPT-suggestions .tianliGPT-suggestions-item { + margin-top: 12px; + padding: 8px 12px; + background: #fff; + border-radius: 8px 8px 8px 0; + border: 1px solid #e3e8f7; + font-size: 15px; + line-height: 1.4; + display: flex; + width: fit-content; + margin-right: 12px; + cursor: pointer; + transition: 0.3s; +} + +.tianliGPT-suggestions .tianliGPT-suggestions-item:hover { + background: #425AEF; + color: #fff; +} + +.blinking-cursor { + background-color: #425AEF; + width: 10px; + height: 16px; + display: inline-block; + vertical-align: middle; + animation: blinking-cursor 0.5s infinite; + -webkit-animation: blinking-cursor 0.5s infinite; + margin-left: 4px; +} + +@keyframes blinking-cursor { + 0% { + opacity: 1; + } + + 40% { + opacity: 1; + } + + 50% { + opacity: 0; + } + + 90% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +.tianliGPT-tag { + font-size: 12px; + background-color: #425AEF; + color: #fff; + font-weight: bold; + border-radius: 4px; + margin-left: auto; + line-height: 1; + padding: 4px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: 0.3s; +} + +.tianliGPT-tag:hover { + background: #363636; + color: #fff; +} + +ins.adsbygoogle { + margin: 16px 0; + background: #fff; + border-radius: 12px; + overflow: hidden; + border: 1px solid #e3e8f7; +} + +#tianliGPT-Toggle { + font-size: 12px; + background: #425AEF; + color: #fff; + padding: 4px; + border-radius: 4px; + margin-left: 6px; + transform: scale(0.8); + cursor: pointer; + transition: 0.3s; + font-weight: bold; +} + +#tianliGPT-Toggle:hover { + background: #363636; + color: #fff; +} + +.tianliGPT-title-icon { + width: 20px; + height: 20px; +} + +.tianliGPT-title-icon svg { + width: 20px; + height: 20px; + fill: #425AEF; +} + +.tianliGPT-title-icon svg path { + fill: #425AEF; +} \ No newline at end of file diff --git a/themes/volantis/source/css/_style/_tag-plugins/Readme.md b/themes/volantis/source/css/_style/_tag-plugins/Readme.md new file mode 100755 index 0000000..e3da94f --- /dev/null +++ b/themes/volantis/source/css/_style/_tag-plugins/Readme.md @@ -0,0 +1,6 @@ +这里存放 tag 标签 的样式 + +为便于管理样式, 文件名使用 tag 名称命名 + +tag.json 索引 tag 标签名称和使用的样式文件的对应关系 + diff --git a/themes/volantis/source/css/_style/_tag-plugins/btns.styl b/themes/volantis/source/css/_style/_tag-plugins/btns.styl new file mode 100755 index 0000000..bfcddc9 --- /dev/null +++ b/themes/volantis/source/css/_style/_tag-plugins/btns.styl @@ -0,0 +1,166 @@ +// inline btn +.article span.btn, .md span.btn + display: inline + a + text-decoration: none + border-bottom: none + display: inline-block + padding: 3px 4px 2px 4px + margin: 2px + line-height: 1.1 + border-radius: 2px + i + margin-right: 2px + trans() + &:not([href]) + opacity: 0.5 + &:hover + cursor: $not-allowed,not-allowed + + & a, &.regular a + color: $color-button + border: 1px solid @color + &:hover + color: $color-hover + border-color: $color-hover + i + margin-right: 4px + + &.regular a, &.solid a + padding: 8px 12px + + &.solid a + border: none + background: $color-button + color: $color-inner + &:hover + color: $color-inner + background: $color-hover + + &.large a + font-size: 1rem + padding: 12px 36px + i + margin-right: 8px + + &.center + display: block + text-align: center + + +// btns +.article div.btns, .md div.btns + margin: 0 -0.5 * $gap + &,p,a + font-size: $fontsize-code + color: var(--color-p) + b + font-size: $fontsize-meta + display: flex + flex-wrap: wrap + align-items: flex-start + overflow: visible + line-height: 1.8 + &.wide>a + padding-left: $gap*2 + padding-right: $gap*2 + &.fill>a + flex-grow: 1 + width: auto + &.around + justify-content: space-around + &.center + justify-content: center + &.grid2>a + width: "calc(100%/2 - %s)" % $gap + @media screen and (max-width: $device-laptop) + width: "calc(100%/2 - %s)" % $gap + @media screen and (max-width: $device-tablet) + width: "calc(100%/2 - %s)" % $gap + @media screen and (max-width: $device-mobile) + width: "calc(100%/1 - %s)" % $gap + &.grid3>a + width: "calc(100%/3 - %s)" % $gap + @media screen and (max-width: $device-laptop) + width: "calc(100%/3 - %s)" % $gap + @media screen and (max-width: $device-tablet) + width: "calc(100%/3 - %s)" % $gap + @media screen and (max-width: $device-mobile) + width: "calc(100%/1 - %s)" % $gap + &.grid4>a + width: "calc(100%/4 - %s)" % $gap + @media screen and (max-width: $device-laptop) + width: "calc(100%/3 - %s)" % $gap + @media screen and (max-width: $device-tablet) + width: "calc(100%/3 - %s)" % $gap + @media screen and (max-width: $device-mobile) + width: "calc(100%/2 - %s)" % $gap + &.grid5>a + width: "calc(100%/5 - %s)" % $gap + @media screen and (max-width: $device-laptop) + width: "calc(100%/4 - %s)" % $gap + @media screen and (max-width: $device-tablet) + width: "calc(100%/3 - %s)" % $gap + @media screen and (max-width: $device-mobile) + width: "calc(100%/2 - %s)" % $gap + a + trans() + text-decoration: none + border-bottom: none + margin: $gap * 0.5 + margin-top: "calc(1.25 * %s + 32px)" % $gap + min-width: 120px + font-weight: bold + display: flex + justify-content: flex-start + align-content: center + align-items: center + flex-direction: column + padding: $gap * 0.5 + text-align: center + &>img:first-child, &>i:first-child + trans() + height: 64px + width: 64px + box-shadow: $boxshadow-card + &.auto + width: auto + margin: $gap $gap * 0.5 $gap * 0.25 $gap * 0.5 + margin-top: "calc(-1.25 * %s - 32px)" % $gap + border: 2px solid var(--color-card) + background: $color-inner + line-height: 60px + font-size: 28px + &>i:first-child + color: $color-inner + background: $color-theme + background: var(--color-block) + border-radius: 4px + p,b + margin: .25em + font-weight: normal + line-height: 1.25 + word-wrap: break-word + b + font-weight: bold + line-height: 1.3 + img + margin: .4em auto + &:not([href]) + cursor: default + color: inherit + &[href]:hover + background: alpha($color-hover, 15%) + &,b + color: $color-hover + &>img:first-child, &>i:first-child + transform: scale(1.1) translateY(-8px) + box-shadow: $boxshadow-float + &>i:first-child + background: $color-hover + &.circle a + &>img:first-child, &>i:first-child + border-radius: 32px + &.rounded a + &>img:first-child, &>i:first-child + border-radius: 16px diff --git a/themes/volantis/source/css/_style/_tag-plugins/checkbox.styl b/themes/volantis/source/css/_style/_tag-plugins/checkbox.styl new file mode 100755 index 0000000..093c02a --- /dev/null +++ b/themes/volantis/source/css/_style/_tag-plugins/checkbox.styl @@ -0,0 +1,196 @@ +.md .checkbox + display: flex + align-items: center + margin-top: $gap-p + margin-bottom: $gap-p + &+.checkbox + margin-top: 0 - $gap-p + input + transform: translate(0, -1px) + -webkit-appearance: none + -moz-appearance: none + -ms-appearance: none + -o-appearance: none + appearance: none + position: relative + height: 16px + width: 16px + transition: all .15s ease-out 0s + cursor: pointer + display: inline-block + outline: none + border-radius: 2px + flex-shrink: 0 + margin-right: 8px + if hexo-config('tag_plugins.checkbox.interactive') != true + pointer-events: none + /* Checkbox */ + input[type=checkbox] + &:before, &:after + position: absolute + content: "" + background: #fff + &:before + left: 1px + top: 5px + width: 0px + height: 2px + transition: all .2s ease-in + transform: rotate(45deg) + -webkit-transform: rotate(45deg) + -moz-transform: rotate(45deg) + -ms-transform: rotate(45deg) + -o-transform: rotate(45deg) + &:after + right: 7px + bottom: 3px + width: 2px + height: 0px + transition: all .2s ease-out + transform: rotate(40deg) + -webkit-transform: rotate(40deg) + -moz-transform: rotate(40deg) + -ms-transform: rotate(40deg) + -o-transform: rotate(40deg) + transition-delay: .25s + &:checked + &:before + left: 0px + top: 7px + width: 6px + height: 2px + &:after + right: 3px + bottom: 1px + width: 2px + height: 10px + &.minus input[type=checkbox] + &:before + transform: rotate(0) + left: 1px + top: 5px + width: 0px + height: 2px + &:after + transform: rotate(0) + left: 1px + top: 5px + width: 0px + height: 2px + &:checked + &:before + left: 1px + top: 5px + width: 10px + height: 2px + &:after + left: 1px + top: 5px + width: 10px + height: 2px + &.plus input[type=checkbox] + &:before + transform: rotate(0) + left: 1px + top: 5px + width: 0px + height: 2px + &:after + transform: rotate(0) + left: 5px + top: 1px + width: 2px + height: 0px + &:checked + &:before + left: 1px + top: 5px + width: 10px + height: 2px + &:after + left: 5px + top: 1px + width: 2px + height: 10px + &.times input[type=checkbox] + &:before + transform: rotate(45deg) + left: 3px + top: 1px + width: 0px + height: 2px + &:after + transform: rotate(135deg) + right: 3px + top: 1px + width: 0px + height: 2px + &:checked + &:before + left: 1px + top: 5px + width: 10px + height: 2px + &:after + right: 1px + top: 5px + width: 10px + height: 2px + /* Radio */ + input[type=radio] + border-radius: 50% + &:before + content: "" + display: block + width: 8px + height: 8px + border-radius: 50% + margin: 2px + transform: scale(0) + transition: all .25s ease-out + &:checked:before + transform: scale(1) + /* Colors */ + input + $c = convert(hexo-config('tag_plugins.checkbox.color')) || $color-theme + border: 2px solid $c + &[type=checkbox]:checked + background: $c + &[type=radio]:checked:before + background: $c + &.red input + border-color: $color-mac-red + &[type=checkbox]:checked + background: $color-mac-red + &[type=radio]:checked:before + background: $color-mac-red + &.green input + border-color: $color-mac-green + &[type=checkbox]:checked + background: $color-mac-green + &[type=radio]:checked:before + background: $color-mac-green + &.yellow input + border-color: $color-mac-yellow + &[type=checkbox]:checked + background: $color-mac-yellow + &[type=radio]:checked:before + background: $color-mac-yellow + &.cyan input + border-color: $color-mac-cyan + &[type=checkbox]:checked + background: $color-mac-cyan + &[type=radio]:checked:before + background: $color-mac-cyan + &.blue input + border-color: $color-md-blue + &[type=checkbox]:checked + background: $color-md-blue + &[type=radio]:checked:before + background: $color-md-blue + +article .checkbox + p + display: inline-block + margin-top: 0 !important + margin-bottom: 0 !important diff --git a/themes/volantis/source/css/_style/_tag-plugins/dropmenu.styl b/themes/volantis/source/css/_style/_tag-plugins/dropmenu.styl new file mode 100755 index 0000000..04fc2b8 --- /dev/null +++ b/themes/volantis/source/css/_style/_tag-plugins/dropmenu.styl @@ -0,0 +1,22 @@ +div.dropmenu-wrapper + display: inline-block + +div.dropmenu + position: relative + display: inline-block + trans() + color: $color-link + &:hover + color: inherit + >ul + display: block + left: 0 + margin-left: 0 + margin-top: 0px + ul>li + list-style: none + >a + &:hover + text-decoration: none !important + .list-v .list-v + left: "calc(100% - 0.5 * %s)" % $gap diff --git a/themes/volantis/source/css/_style/_tag-plugins/fancybox.styl b/themes/volantis/source/css/_style/_tag-plugins/fancybox.styl new file mode 100755 index 0000000..6393fbf --- /dev/null +++ b/themes/volantis/source/css/_style/_tag-plugins/fancybox.styl @@ -0,0 +1,100 @@ +div.gallery + margin: $gap-p 0 + overflow: hidden + $sp = 1px + &+.gallery + margin-top: 0 - $gap-p + >.fancybox,>p>.fancybox + margin: $sp + padding: 0 + position: relative + a + height: 100% + width: 100% + img + object-fit: cover + height: 100% + width: 100% + .image-caption + opacity: 0 + transform: translateY(100%) + transition: all 0.3s ease + pointer-events: none + position: absolute + width: 100% + bottom: 0 + text-align: center + background: rgba(0, 0, 0, 0.3) + color: #fff + &:empty + display:none + &:hover + .image-caption + opacity: 1 + transform: translateY(0) + &,>p + display: flex + justify-content: center + align-items: center + flex-wrap: nowrap + padding: 0 !important + align-items: stretch + &[col] + flex-wrap: wrap + justify-content: flex-start + &[col='2']>.fancybox + width: "calc(50% - 2 * %s)" % $sp + &[col='3']>.fancybox + width: "calc(33.33% - 2 * %s)" % $sp + &[col='4']>.fancybox + width: "calc(25% - 2 * %s)" % $sp + &[col='5']>.fancybox + width: "calc(20% - 2 * %s)" % $sp + &[col='6']>.fancybox + width: "calc(16.66% - 2 * %s)" % $sp + &[col='7']>.fancybox + width: "calc(14.2857% - 2 * %s)" % $sp + &[col='8']>.fancybox + width: "calc(12.5% - 2 * %s)" % $sp + >p + margin: 0 + &.left,&.left>p + justify-content: flex-start + &.center,&.center>p + justify-content: center + &.right,&.right>p + justify-content: flex-end + &.stretch,&.stretch>p + align-items: stretch + + +.fancybox-container + .fancybox-stage + cursor: zoom-out + +div.fancybox + margin-top: $gap-p + margin-bottom: $gap-p + display: flex + flex-direction: column + justify-content: center + align-items: center + flex-wrap: nowrap + padding: 0 !important + overflow: hidden + border-radius: 2px + @media screen and (max-width: $device-mobile) + border-radius: 1px + a + line-height: 0 + margin: 0 auto + align-items: stretch + .gallery + overflow: hidden + .image-caption + font-size: $fontsize-code + padding-top: $gap-p * 0.5 + padding-bottom: $gap-p + color: var(--color-meta) + &:empty + display: none diff --git a/themes/volantis/source/css/_style/_tag-plugins/folding.styl b/themes/volantis/source/css/_style/_tag-plugins/folding.styl new file mode 100755 index 0000000..ed9f37b --- /dev/null +++ b/themes/volantis/source/css/_style/_tag-plugins/folding.styl @@ -0,0 +1,100 @@ +details + display: block + padding: $gap + margin: $gap-p 0 + border-radius: $border-codeblock + background: var(--color-card) + font-size: $fontsize-list + trans() + summary + cursor: pointer + padding: $gap + margin: 0 - $gap + border-radius: $border-codeblock + color: alpha($color-p, .7) + font-size: $fontsize-meta + font-weight: bold + position: relative + line-height: normal + > + p,h1,h2,h3,h4,h5,h6 + display: inline + border-bottom: none !important + &:hover + color: var(--color-p) + &:after + position: absolute + content: '+' + text-align: center + top: 50% + transform: translateY(-50%) + right: $gap + + border: 1px solid var(--color-block) + >summary + background: var(--color-block) + &[blue] + border-color: bgcolor($color-md-blue) + >summary + background: bgcolor($color-md-blue) + &[cyan] + border-color: bgcolor($color-mac-cyan) + >summary + background: bgcolor($color-mac-cyan) + &[green] + border-color: bgcolor($color-mac-green) + >summary + background: bgcolor($color-mac-green) + &[yellow] + border-color: bgcolor($color-mac-yellow) + >summary + background: bgcolor($color-mac-yellow) + &[red] + border-color: bgcolor($color-mac-red) + >summary + background: bgcolor($color-mac-red) + +details[open] + border-color: alpha($color-p, .2) + >summary + border-bottom: 1px solid alpha($color-p, .2) + border-bottom-left-radius: 0 + border-bottom-right-radius: 0 + &[blue] + border-color: alpha($color-md-blue, .3) + >summary + border-bottom-color: alpha($color-md-blue, .3) + &[cyan] + border-color: alpha($color-mac-cyan, .3) + >summary + border-bottom-color: alpha($color-mac-cyan, .3) + &[green] + border-color: alpha($color-mac-green, .3) + >summary + border-bottom-color: alpha($color-mac-green, .3) + &[yellow] + border-color: alpha($color-mac-yellow, .3) + >summary + border-bottom-color: alpha($color-mac-yellow, .3) + &[red] + border-color: alpha($color-mac-red, .3) + >summary + border-bottom-color: alpha($color-mac-red, .3) + >summary + color: $color-p + margin-bottom: 0 + &:hover + &:after + content: '-' + >div.content + padding: $gap + margin: 0 - $gap + margin-top: 0 + p>a:hover + text-decoration: underline + > + p,.tabs,ul,ol,.highlight,.note,details + &:first-child + margin-top: 0 + &:last-child + margin-bottom: 0 diff --git a/themes/volantis/source/css/_style/_tag-plugins/frame.styl b/themes/volantis/source/css/_style/_tag-plugins/frame.styl new file mode 100755 index 0000000..8b4b9a8 --- /dev/null +++ b/themes/volantis/source/css/_style/_tag-plugins/frame.styl @@ -0,0 +1,55 @@ +.md .frame-wrap + position: relative + overflow: hidden + margin: 0 auto + max-width: 100% + display: flex + flex-direction: column + align-items: center + img,video + border-radius: 0 +.md .frame-wrap .frame + z-index: 1 + display: block + position: absolute; + background-size: 100%; + background-repeat: no-repeat; + overflow: hidden; + +.md .img-wrap .frame-wrap + &[part] + height: auto + +.md .frame-wrap + &#iphone11 + img,video + width: 287px + margin-top: 19px + margin-bottom: 20px + .frame + background-image: url(https://cdn.jsdelivr.net/gh/volantis-x/cdn-volantis@3/img/frame/iphone11.svg); + width: 329px + height: 658px + &[part='top'] + img,video + margin-bottom: 0 !important + &:not([part='bottom']) + .frame + top: 0 + &[part='bottom'] + img,video + bottom: 0 + margin-top: 0 !important + .frame + bottom: 0 + +@media screen and (max-width: $device-mobile) + .md .frame-wrap + &#iphone11 + img,video + width: 208px + margin-top: 13px + margin-bottom: 14px + .frame + width: 238px + height: 476px diff --git a/themes/volantis/source/css/_style/_tag-plugins/friends.styl b/themes/volantis/source/css/_style/_tag-plugins/friends.styl new file mode 100755 index 0000000..f30fc9c --- /dev/null +++ b/themes/volantis/source/css/_style/_tag-plugins/friends.styl @@ -0,0 +1,72 @@ +.users-wrap + overflow: hidden + .group-header + margin: 0 0 1rem + p + margin: 0 + font-size: $fs-14 + &:first-child + font-size: 1.25rem + font-weight: 500 + .group-body + width: 100% + display: flex + flex-wrap: wrap + align-items: stretch + margin-bottom: 2rem + .friendsjs-wrap + display: block + .loading-wrap + min-height: 50px + margin: 2rem 0 + text-align: center + +.users-wrap .user-card + flex-shrink: 1 + display: flex + align-items: stretch + width: 12.5% + @media screen and (max-width: 980px) + width: 14.28% + @media screen and (max-width: 900px) + width: 16.66% + @media screen and (max-width: 820px) + width: 20% + @media screen and (max-width: $device-tablet) + width: 16.66% + @media screen and (max-width: $device-mobile) + width: 25% + .card-link + margin: 0 + width: 100% + color: var(--text-p1) + font-size: 10px + font-weight: 500 + display: flex + justify-content: flex-start + flex-direction: column + align-items: center + text-align: center + line-height: 1.2 + border-radius: 4px + overflow: hidden + position: relative + padding: 1rem 0.5rem + img + object-fit: cover + display: block + width: 48px + height: 48px + background: var(--card) + border-radius: 64px + margin: 0 0 0.5rem + +// transform +.users-wrap .user-card .card-link + >img + trans2 transform box-shadow + &:hover + background: var(--block-hover) + img + transform: scale(1.2) rotate(8deg) + box-shadow: $boxshadow-card-float diff --git a/themes/volantis/source/css/_style/_tag-plugins/ghcard.styl b/themes/volantis/source/css/_style/_tag-plugins/ghcard.styl new file mode 100755 index 0000000..d2c0df9 --- /dev/null +++ b/themes/volantis/source/css/_style/_tag-plugins/ghcard.styl @@ -0,0 +1,10 @@ +a.ghcard + display: inline-block + line-height: 0 + +.md .ghcard-group + column-count: 2 + column-gap: 0 + margin: 0 0 - $gap * 0.5 + .ghcard + margin: $gap * 0.5 diff --git a/themes/volantis/source/css/_style/_tag-plugins/image.styl b/themes/volantis/source/css/_style/_tag-plugins/image.styl new file mode 100755 index 0000000..eaee7c2 --- /dev/null +++ b/themes/volantis/source/css/_style/_tag-plugins/image.styl @@ -0,0 +1,7 @@ +.md .img + object-fit: contain + +img.inline + display: inline !important + vertical-align: middle + transform: translateY(-4px) diff --git a/themes/volantis/source/css/_style/_tag-plugins/link.styl b/themes/volantis/source/css/_style/_tag-plugins/link.styl new file mode 100755 index 0000000..ad45a6a --- /dev/null +++ b/themes/volantis/source/css/_style/_tag-plugins/link.styl @@ -0,0 +1,67 @@ +.md .tag.link + margin-top: $gap-p + margin-bottom: $gap-p + +.md .link-card + margin-right: $gap-p + background: var(--color-block) + display: inline-flex + align-items: center + cursor: pointer + text-align: center + width: $device-mobile-l - 4 * $gap + max-width: 100% + box-shadow: $boxshadow-card + @media screen and (max-width: $device-mobile-l) + max-width: 100% + width: 100% + color: var(--color-p) + border-radius: $border-card + &:hover + box-shadow: $boxshadow-float, $boxshadow-card-float + + +.md .link-card + div.left,div.right + pointer-events: none + div.left + width: 54px + height: 54px + margin: 12px + overflow: hidden + flex-shrink: 0 + position: relative + i + font-size: 32px + line-height: 48px + margin-left: 4px + img + display: block + position: absolute + border-radius: $border-card / 4 + top: 50% + left: 50% + transform: translate(-50%, -50%) + div.right + overflow: hidden + margin-right: 16px + p + margin: 0 + txt-ellipsis() + p.text + font-weight: bold + p.url + flex-shrink: 0 + color: var(--color-meta) + font-size: $fontsize-code + +.md .link-group + display: grid + grid-template-columns: 1fr 1fr + @media screen and (max-width: $device-mobile-l * 2) + grid-template-columns: 1fr + grid-gap: $gap + .tag.link + margin: 0 + .link-card + width: 100% diff --git a/themes/volantis/source/css/_style/_tag-plugins/media.styl b/themes/volantis/source/css/_style/_tag-plugins/media.styl new file mode 100755 index 0000000..b3b17df --- /dev/null +++ b/themes/volantis/source/css/_style/_tag-plugins/media.styl @@ -0,0 +1,50 @@ +$sp = 4px + +audio,video + border-radius: $border-codeblock + max-width: 100% +video + z-index: 1 + trans() + &:hover + box-shadow: 0 4px 8px 0px rgba(0, 0, 0, 0.24), 0 8px 16px 0px rgba(0, 0, 0, 0.24) + +div.video + line-height: 0 + text-align: center + +div.videos + max-width: "calc(100% + 2 * %s)" % $sp + display: flex + flex-wrap: wrap + justify-content: flex-start + align-items: flex-end + margin: $gap-p 0 - $sp + .video,iframe + width: 100% + margin: $sp + + iframe + border-radius: $border-codeblock + width: 100% + min-height: 300px + &.left + justify-content: flex-start + &.center + justify-content: center + &.right + justify-content: flex-end + &.stretch + align-items: stretch + &[col='1'] + .video,iframe + width: 100% + &[col='2'] + .video,iframe + width: "calc(50% - 2 * %s)" % $sp + &[col='3'] + .video,iframe + width: "calc(33.33% - 2 * %s)" % $sp + &[col='4'] + .video,iframe + width: "calc(25% - 2 * %s)" % $sp diff --git a/themes/volantis/source/css/_style/_tag-plugins/note.styl b/themes/volantis/source/css/_style/_tag-plugins/note.styl new file mode 100755 index 0000000..03666ce --- /dev/null +++ b/themes/volantis/source/css/_style/_tag-plugins/note.styl @@ -0,0 +1,162 @@ +div.note + $border-codeblock = 4px + bg($c) + return mix($c, $color-card, 10) + border($c) + return mix($c, $color-card, 100) + position: relative + margin-top: $gap-p + margin-bottom: $gap-p + padding: $gap + padding-left: "calc(16px + %s)" % $gap + border-radius: $border-codeblock + font-size: $fontsize-list + h2, + h3, + h4, + h5, + h6 + if $note-icons + margin-top: 3px + else + margin-top: 0 + + margin-bottom: 0 + padding-top: 0 !important + border-bottom: initial + + p, + ul, + ol, + blockquote, + img + margin-top: $gap-p * 0.5 + margin-bottom: $gap-p * 0.5 + .link-card + background: var(--color-card) + &::before + position: absolute + top: "calc(50% - %s * 0.5)" % (24px) + left 4px + width: 24px + height: 24px + text-align: center + font-weight: 600 + line-height: 24px + vertical-align: middle + font-family: hexo-config('tag_plugins.note.iconfont') + + background: var(--color-block) + border-left: $border-codeblock solid $color-theme + &::before + color: $color-theme + content: '\f054' + if hexo-config('tag_plugins.note') && hexo-config('tag_plugins.note.icon') + &::before + content: hexo-config('tag_plugins.note.icon') || '\f054' + if hexo-config('tag_plugins.note.color') + $c = convert(hexo-config('tag_plugins.note.color')) || mix($color-text, $color-card, 80) + background: bg($c) + border-color: border($c) + &::before + color: border($c) + + &.quote + background: bg($color-md-blue) + border-color: border($color-md-blue) + &::before + color: border($color-md-blue) + content: '\f10d' + &.info + background: bg($color-theme) + border-color: border($color-theme) + &::before + color: border($color-theme) + content: '\f129' + &.success,&.done + background: bg($color-mac-green) + border-color: border($color-mac-green) + &::before + color: border($color-mac-green) + content: '\f00c' + &.warning + background: bg($color-mac-yellow) + border-color: border($color-mac-yellow) + &::before + color: border($color-mac-yellow) + content: '\f12a' + &.danger,&.error + background: bg($color-mac-red) + border-color: border($color-mac-red) + &::before + color: border($color-mac-red) + content: '\f00d' + &.radiation::before + content: '\f7b9' + &.bug::before + content: '\f188' + &.idea::before + content: '\f0eb' + &.link::before + content: '\f0c1' + &.paperclip::before + content: '\f0c6' + &.todo::before + content: '\f0ae' + &.message::before + content: '\f4ad' + &.guide::before + content: '\f277' + &.download::before + content: '\f019' + &.up::before + content: '\f102' + &.undo::before + content: '\f2ea' + &.play::before + content: '\f144' + + + &.clear + background: none + border-color: none + &.light + background: mix($color-text, $color-card, 5) + border-color: mix($color-text, $color-card, 50) + &::before + color: mix($color-text, $color-card, 50) + &.gray + background: mix($color-text, $color-card, 5) + border-color: mix($color-text, $color-card, 80) + &::before + color: mix($color-text, $color-card, 80) + &.theme + background: bg($color-theme) + border-color: border($color-theme) + &::before + color: border($color-theme) + &.red + background: bg($color-mac-red) + border-color: border($color-mac-red) + &::before + color: border($color-mac-red) + &.yellow + background: bg($color-mac-yellow) + border-color: border($color-mac-yellow) + &::before + color: border($color-mac-yellow) + &.green + background: bg($color-mac-green) + border-color: border($color-mac-green) + &::before + color: border($color-mac-green) + &.cyan + background: bg($color-mac-cyan) + border-color: border($color-mac-cyan) + &::before + color: border($color-mac-cyan) + &.blue + background: bg($color-md-blue) + border-color: border($color-md-blue) + &::before + color: border($color-md-blue) diff --git a/themes/volantis/source/css/_style/_tag-plugins/sites.styl b/themes/volantis/source/css/_style/_tag-plugins/sites.styl new file mode 100755 index 0000000..66e7750 --- /dev/null +++ b/themes/volantis/source/css/_style/_tag-plugins/sites.styl @@ -0,0 +1,87 @@ +.sites-wrap + .group-header + margin: 0 0 1rem + p + margin: 0 + font-size: $fs-14 + &:first-child + font-size: 1.25rem + font-weight: 500 + .group-body + width: 100% + margin-bottom: 2rem + .sitesjs-wrap + display: block + .loading-wrap + min-height: 50px + margin: 2rem 0 + text-align: center + +.sites-wrap .group-body + display: grid + grid-gap: 1rem 1rem + grid-template-columns: repeat(auto-fill, "calc((100% - 3 * %s) / 4)" % 1rem) + @media screen and (max-width: $device-laptop) + grid-template-columns: repeat(auto-fill, "calc((100% - 2 * %s) / 3)" % 1rem) + @media screen and (max-width: 900px) + grid-template-columns: repeat(auto-fill, "calc((100% - 1 * %s) / 2)" % 1rem) + @media screen and (max-width: $device-tablet) + grid-template-columns: repeat(auto-fill, "calc((100% - 2 * %s) / 3)" % 1rem) + @media screen and (max-width: $device-mobile) + grid-template-columns: repeat(auto-fill, "calc((100% - 1 * %s) / 2)" % 1rem) + margin-bottom: 2rem + +.sites-wrap .group-body .site-card .card-link + width: 100% + display: flex + flex-direction: column + >img + width: 100% + height 120px + border-radius: 4px + @media screen and (max-width: $device-laptop) + height: 150px + @media screen and (max-width: 900px) + height: 180px + @media screen and (max-width: $device-tablet) + height: 150px + object-fit: cover + box-shadow: 0 1px 2px 0px rgba(0, 0, 0, 0.2) + .info + margin-top: 0.5rem + line-height: 1.2 + >img + width: 28px + height: @width + border-radius: @width + float: left + margin-right: 8px + margin-top: 2px + span + display: block + .title + font-weight: 500 + color: var(--text-p1) + font-size: $fs-14 + margin-top: 1px + display: -webkit-box + -webkit-box-orient: vertical + overflow: hidden + -webkit-line-clamp: 1 + .desc + font-size: 10px + margin-top: 2px + word-wrap: break-word + color: var(--text-p3) + display: -webkit-box + -webkit-box-orient: vertical + overflow: hidden + -webkit-line-clamp: 2 + +// transform +.sites-wrap .site-card .card-link + >img + trans() + &:hover + >img + box-shadow: $boxshadow-float, $boxshadow-card-float diff --git a/themes/volantis/source/css/_style/_tag-plugins/span.styl b/themes/volantis/source/css/_style/_tag-plugins/span.styl new file mode 100755 index 0000000..93539ed --- /dev/null +++ b/themes/volantis/source/css/_style/_tag-plugins/span.styl @@ -0,0 +1,80 @@ +p.p.subtitle + font-weight: bold + color: mix($color-theme, $color-text, 75) + font-size: 1.25rem !important + padding-top: 1.5rem + &:first-child + padding-top: 1rem + +span.p,p.p + &.logo + font-family: $fontfamily-logo + &.code + font-family: $fontfamily-code + &.left + display: block + text-align: left + &.center + display: block + text-align: center + &.right + display: block + text-align: right + +span.p,p.p + &.small + font-size: $fontsize-meta + &.large + font-size: $fontsize-large + line-height: 1.4 + &.huge + font-size: $fontsize-huge + line-height: 1.4 + &.ultra + font-size: $fontsize-ultra + line-height: 1.4 + &.small,&.large,&.huge,&.ultra + margin: 0 + padding: 0 + &.bold + font-weight: bold + &.h1,&.h2 + padding-bottom: .2rem + font-weight: 500 + &.h1 + font-size: $fontsize-h1 + color: var(--color-h1) + padding-top: $gap-p * 2 + &.h2 + font-size: $fontsize-h2 + color: var(--color-h2) + padding-top: $gap-p * 2 + border-bottom: 1px solid alpha($color-text, .1) + &.h3 + font-size: $fontsize-h3 + color: var(--color-h3) + padding-top: $gap-p * 2 + &.h4 + font-size: $fontsize-h4 + color: var(--color-h4) + padding-top: $gap-p * 2 + &.h5 + font-size: $fontsize-h5 + color: var(--color-h5) + padding-top: $gap-p * 1.5 + +span.p,p.p + &.red + color: $color-mac-red + &.yellow + color: $color-mac-yellow + &.green + color: $color-mac-green + &.cyan + color: $color-mac-cyan + &.blue + color: $color-md-blue + &.purple + color: $color-md-purple + &.gray + color: #999 diff --git a/themes/volantis/source/css/_style/_tag-plugins/swiper.styl b/themes/volantis/source/css/_style/_tag-plugins/swiper.styl new file mode 100755 index 0000000..400ae86 --- /dev/null +++ b/themes/volantis/source/css/_style/_tag-plugins/swiper.styl @@ -0,0 +1,44 @@ +.swiper-container + width: 100% + border-radius: 4px + --gap-p: 2rem +.swiper-container:not(.swiper-container-initialized) + display: none +div.swiper-slide + text-align: center + display: -webkit-box + display: -ms-flexbox + display: -webkit-flex + display: flex + align-self: center + -webkit-box-pack: center + -ms-flex-pack: center + -webkit-justify-content: center + justify-content: center + -webkit-box-align: center + -ms-flex-align: center + -webkit-align-items: center + align-items: center + width: 50% + img + border-radius: 4px + +.swiper-container[width='max'] div.swiper-slide + width: 100% + +.swiper-container[width='min'] div.swiper-slide + width: 25% + +.swiper-button-prev,.swiper-button-next + padding: 1rem 0.5rem + margin-top: -2rem !important + border-radius: 4px + background: alpha(white, 0.25) + trans1 background + --swiper-theme-color: black !important + &:after + font-size: 1.2rem !important + font-weight: 700 !important + &:hover + background: white !important + --swiper-theme-color: $color-hover !important \ No newline at end of file diff --git a/themes/volantis/source/css/_style/_tag-plugins/table.styl b/themes/volantis/source/css/_style/_tag-plugins/table.styl new file mode 100755 index 0000000..b2205e6 --- /dev/null +++ b/themes/volantis/source/css/_style/_tag-plugins/table.styl @@ -0,0 +1,8 @@ +.md + .table + overflow: auto + margin-top: $gap-p + margin-bottom: $gap-p + table + display: table + width: 100% diff --git a/themes/volantis/source/css/_style/_tag-plugins/tabs.styl b/themes/volantis/source/css/_style/_tag-plugins/tabs.styl new file mode 100755 index 0000000..3b16ae6 --- /dev/null +++ b/themes/volantis/source/css/_style/_tag-plugins/tabs.styl @@ -0,0 +1,70 @@ +$border-color = alpha($color-p, .2) +$tbr = 4px + +div.tabs + display: block + position: relative + margin-top: $gap-p + margin-bottom: $gap-p + border-radius: $tbr + background: var(--color-card) + border: 1px solid $border-color + font-size: $fontsize-list + .highlight,p,ul,ol,div.note,details + margin-top: $gap-p + margin-bottom: $gap-p + +div.tabs + ul.nav-tabs + display: flex + overflow-x: auto + white-space: nowrap + justify-content: flex-start + margin: 0 !important + padding: 8px 8px 0 8px + background: var(--color-block) + border-radius: $tbr $tbr 0 0 + line-height: 1.5 + li.tab + list-style-type: none + margin-top: 0 + margin-bottom: 0 + &:last-child + padding-right: $gap + a + display: block + cursor: pointer + border-radius: $tbr $tbr 0 0 + padding: $gap * 0.5 + text-align: center + font-size: $fontsize-meta + line-height: inherit + font-weight: bold + color: var(--color-meta) + border: 1px solid transparent + &:hover + color: var(--color-p) + i + pointer-events: none + &.active a + cursor: default + color: var(--color-p) + background: $color-card + border: 1px solid $border-color + border-bottom: 1px solid var(--color-card) + + .tab-content + border-top: 1px solid $border-color + margin-top: -1px + .tab-pane + padding: $gap + &:not(.active) + display: none + &.active + display: block + > + p,.tabs,ul,ol,.highlight,.note + &:first-child + margin-top: 0 + &:last-child + margin-bottom: 0 diff --git a/themes/volantis/source/css/_style/_tag-plugins/tag.json b/themes/volantis/source/css/_style/_tag-plugins/tag.json new file mode 100755 index 0000000..a4bb31a --- /dev/null +++ b/themes/volantis/source/css/_style/_tag-plugins/tag.json @@ -0,0 +1,35 @@ +{ + "note": ["note.styl"], + "tabs": ["tabs.styl"], + "u": ["text.styl"], + "emp": ["text.styl"], + "wavy": ["text.styl"], + "del": ["text.styl"], + "kbd": ["text.styl"], + "psw": ["text.styl"], + "span": ["span.styl"], + "p": ["span.styl"], + "noteblock": ["note.styl"], + "folding": ["folding.styl"], + "checkbox": ["checkbox.styl"], + "radio": ["checkbox.styl"], + "timeline": ["timeline.styl"], + "timenode": ["timeline.styl"], + "link": ["link.styl"], + "btn": ["btns.styl"], + "btns": ["btns.styl"], + "table": ["table.styl"], + "ghcard": ["ghcard.styl"], + "sites": ["sites.styl"], + "menu": ["dropmenu.styl"], + "inlineimage": ["image.styl"], + "image": ["image.styl"], + "gallery": ["fancybox.styl"], + "audio": ["media.styl"], + "video": ["media.styl"], + "videos": ["media.styl"], + "frame": ["frame.styl"], + "contributors": ["friends.styl"], + "friends": ["friends.styl"], + "swiper": ["swiper.styl"] +} \ No newline at end of file diff --git a/themes/volantis/source/css/_style/_tag-plugins/text.styl b/themes/volantis/source/css/_style/_tag-plugins/text.styl new file mode 100755 index 0000000..7767d8d --- /dev/null +++ b/themes/volantis/source/css/_style/_tag-plugins/text.styl @@ -0,0 +1,31 @@ +.article + del + color: mix($color-p, $color-card, 60) + text-decoration-color: @color + u + color: var(--color-text) + text-decoration: none + border-bottom: 1px solid $color-mac-red + emp + color: var(--color-text) + border-bottom: 4px dotted $color-mac-red + wavy + color: var(--color-text) + text-decoration-style: wavy + text-decoration-line: underline + text-decoration-color: $color-mac-red + psw + color: transparent + background: mix($color-text, $color-card, 50) + border-radius: 2px + trans() + &:hover + color: var(--color-p) + background: none + kbd + border-radius: 4px + border: 1px solid mix($color-block, $color-text, 80) + border-bottom-width: 2px + background: mix($color-block, $color-card, 50) + padding-left: 4px + padding-right: 4px \ No newline at end of file diff --git a/themes/volantis/source/css/_style/_tag-plugins/timeline.styl b/themes/volantis/source/css/_style/_tag-plugins/timeline.styl new file mode 100755 index 0000000..da7d15c --- /dev/null +++ b/themes/volantis/source/css/_style/_tag-plugins/timeline.styl @@ -0,0 +1,75 @@ +div.timenode + position: relative + &:before, &:after + content: '' + z-index: 1 + position: absolute + background: alpha($color-theme, .5) + width: 2px + left: 7px + &:before + top: 0px + height: 6px + &:after + top: 26px + height: "calc(100% - %s)" % 26px + &:last-child + &:after + height: "calc(100% - 26px - %s)" % $gap + border-bottom-left-radius: 2px + border-bottom-right-radius: 2px + .meta,.body + max-width: "calc(100% - %s)" % (16px + 8px) + .meta + position: relative + color: var(--color-meta) + font-size: $fontsize-meta + line-height: 32px + height: 32px + &:before, &:after + content: '' + position: absolute + top: 8px + z-index: 2 + &:before + background: alpha($color-theme, .5) + width: 16px + height: 16px + border-radius: 8px + &:after + background: $color-theme + margin-left: 2px + margin-top: 2px + width: 12px + height: 12px + border-radius: 6px + transform: scale(0.5) + trans() + p + font-weight: bold + margin: 0 0 0 16px + 8px + .body + margin: 4px 0 $gap 16px + 8px + padding: $gap + border-radius: $border-card + background: var(--color-block) + display: inline-block + &:empty + display: none + >* + &:first-child + margin-top: $gap-p * 0.25 + &:last-child + margin-bottom: $gap-p * 0.25 + .highlight + border: 1px solid mix($color-block, $color-text, 90) + + +div.timenode:hover + .meta + color: var(--color-text) + &:before + background: alpha($color-hover, .5) + &:after + background: $color-hover + transform: scale(1) diff --git a/themes/volantis/source/css/_style/index.styl b/themes/volantis/source/css/_style/index.styl new file mode 100755 index 0000000..c6babc8 --- /dev/null +++ b/themes/volantis/source/css/_style/index.styl @@ -0,0 +1,8 @@ +@import '_base/*' + +@import '_layout/*' + +@import '_tag-plugins/*' + +// 暗黑模式样式放到最后加载 +@import '_plugins/index' \ No newline at end of file diff --git a/themes/volantis/source/css/first.styl b/themes/volantis/source/css/first.styl new file mode 100755 index 0000000..7a94af6 --- /dev/null +++ b/themes/volantis/source/css/first.styl @@ -0,0 +1,25 @@ +#safearea { + display: none +} + +if hexo-config('content_visibility') + // https://web.dev/content-visibility/ + // https://www.caniuse.com/?search=content-visibility + /* + * Workaround for Chrome bug, part 1 + * Chunk rendering for all but the first article. + * /layout/_partial/scripts/content-visibility-scroll-fix.ejs + */ + .post-story + .post-story{ + content-visibility: auto; + contain-intrinsic-size: 10px 500px; + } + +@import '_defines/*' + +// Project +@import '_first/*' + +// Custom Files +for $injects_first in hexo-config('injects.first') + @import $injects_first; \ No newline at end of file diff --git a/themes/volantis/source/css/style.styl b/themes/volantis/source/css/style.styl new file mode 100755 index 0000000..ca99975 --- /dev/null +++ b/themes/volantis/source/css/style.styl @@ -0,0 +1,13 @@ +#safearea{ + display: block +} + +@import '_defines/*' + +// Project +@import '_style' + +// Custom Files +for $injects_style in hexo-config('injects.style') + @import $injects_style; + diff --git a/themes/volantis/source/js/app.js b/themes/volantis/source/js/app.js new file mode 100755 index 0000000..21c2d90 --- /dev/null +++ b/themes/volantis/source/js/app.js @@ -0,0 +1,1152 @@ +document.addEventListener("DOMContentLoaded", function () { + volantis.requestAnimationFrame(() => { + VolantisApp.init(); + VolantisApp.subscribe(); + VolantisFancyBox.init(); + highlightKeyWords.startFromURL(); + locationHash(); + }); +}); + +/* 锚点定位 */ +const locationHash = () => { + if (window.location.hash) { + let locationID = decodeURI(window.location.hash.split('#')[1]).replace(/\ /g, '-'); + let target = document.getElementById(locationID); + if (target) { + setTimeout(() => { + if (window.location.hash.startsWith('#fn')) { // hexo-reference https://github.com/volantis-x/hexo-theme-volantis/issues/647 + volantis.scroll.to(target, { addTop: - volantis.dom.header.offsetHeight - 5, behavior: 'instant', observer: true }) + } else { + // 锚点中上半部有大片空白 高度大概是 volantis.dom.header.offsetHeight + volantis.scroll.to(target, { addTop: 5, behavior: 'instant', observer: true }) + } + }, 1000) + } + } +} +Object.freeze(locationHash); + +/* Main */ +const VolantisApp = (() => { + const fn = {}, + COPYHTML = ''; + let scrollCorrection = 80; + + fn.init = () => { + if (volantis.dom.header) { + scrollCorrection = volantis.dom.header.clientHeight + 16; + } + + window.onresize = () => { + if (document.documentElement.clientWidth < 500) { + volantis.isMobile = 1; + } else { + volantis.isMobile = 0; + } + if (volantis.isMobile != volantis.isMobileOld) { + fn.setGlobalHeaderMenuEvent(); + fn.setHeader(); + fn.setHeaderSearch(); + } + } + volantis.scroll.push(fn.scrollEventCallBack, "scrollEventCallBack") + } + + fn.event = () => { + volantis.dom.$(document.getElementById("scroll-down"))?.on('click', function () { + fn.scrolltoElement(volantis.dom.bodyAnchor); + }); + + // 如果 sidebar 为空,隐藏 sidebar。 + const sidebar = document.querySelector("#l_side") + if (sidebar) { + const sectionList = sidebar.querySelectorAll("section") + if (!sectionList.length) { + document.querySelector("#l_main").classList.add("no_sidebar") + } + } + + // 站点信息 最后活动日期 + if (volantis.GLOBAL_CONFIG.sidebar.for_page.includes('webinfo') || volantis.GLOBAL_CONFIG.sidebar.for_post.includes('webinfo')) { + const lastupd = volantis.GLOBAL_CONFIG.sidebar.webinfo.lastupd; + if (!!document.getElementById('last-update-show') && lastupd.enable && lastupd.friendlyShow) { + document.getElementById('last-update-show').innerHTML = fn.utilTimeAgo(volantis.GLOBAL_CONFIG.lastupdate); + } + } + + // 站点信息 运行时间 + if (!!document.getElementById('webinfo-runtime-count')) { + let BirthDay = new Date(volantis.GLOBAL_CONFIG.sidebar.webinfo.runtime.data); + let timeold = (new Date().getTime() - BirthDay.getTime()); + let daysold = Math.floor(timeold / (24 * 60 * 60 * 1000)); + document.getElementById('webinfo-runtime-count').innerHTML = `${daysold} ${volantis.GLOBAL_CONFIG.sidebar.webinfo.runtime.unit}`; + } + + // 消息提示 复制时弹出 + document.body.oncopy = function () { + fn.messageCopyright() + }; + } + + fn.restData = () => { + scrollCorrection = volantis.dom.header ? volantis.dom.header.clientHeight + 16 : 80; + } + + fn.setIsMobile = () => { + if (document.documentElement.clientWidth < 500) { + volantis.isMobile = 1; + volantis.isMobileOld = 1; + } else { + volantis.isMobile = 0; + volantis.isMobileOld = 0; + } + } + + // 校正页面定位(被导航栏挡住的区域) + fn.scrolltoElement = (elem, correction = scrollCorrection) => { + volantis.scroll.to(elem, { + top: elem.getBoundingClientRect().top + document.documentElement.scrollTop - correction + }) + } + + // 滚动事件回调们 + fn.scrollEventCallBack = () => { + // 【移动端 PC】////////////////////////////////////////////////////////////////////// + + // 显示/隐藏 Header导航 topBtn 【移动端 PC】 + const showHeaderPoint = volantis.dom.bodyAnchor.offsetTop - scrollCorrection; + const scrollTop = volantis.scroll.getScrollTop(); // 滚动条距离顶部的距离 + + // topBtn + if (volantis.dom.topBtn) { + if (scrollTop > volantis.dom.bodyAnchor.offsetTop) { + volantis.dom.topBtn.addClass('show'); + // 向上滚动高亮 topBtn + if (volantis.scroll.del > 0) { + volantis.dom.topBtn.removeClass('hl'); + } else { + volantis.dom.topBtn.addClass('hl'); + } + } else { + volantis.dom.topBtn.removeClass('show').removeClass('hl'); + } + } + + // Header导航 + if (volantis.dom.header) { + if (scrollTop - showHeaderPoint > -1) { + volantis.dom.header.addClass('show'); + } else { + volantis.dom.header.removeClass('show'); + } + } + + // 决定一二级导航栏的切换 【向上滚动切换为一级导航栏;向下滚动切换为二级导航栏】 【移动端 PC】 + if (pdata.ispage && volantis.dom.wrapper) { + if (volantis.scroll.del > 0 && scrollTop > 100) { // 向下滚动 + volantis.dom.wrapper.addClass('sub'); // <---- 二级导航显示 + } else if (volantis.scroll.del < 0) { // 向上滚动 + volantis.dom.wrapper.removeClass('sub'); // <---- 取消二级导航显示 一级导航显示 + } + } + + // 【移动端】////////////////////////////////////////////////////////////////////// + if (volantis.isMobile) { + // 【移动端】 页面滚动 隐藏 移动端toc目录按钮 + if (pdata.ispage && volantis.dom.tocTarget && volantis.dom.toc) { + volantis.dom.tocTarget.removeClass('active'); + volantis.dom.toc.removeClass('active'); + } + // 【移动端】 滚动时隐藏子菜单 + if (volantis.dom.mPhoneList) { + volantis.dom.mPhoneList.forEach(function (e) { + volantis.dom.$(e).hide(); + }) + } + } + } + + // 设置滚动锚点 + fn.setScrollAnchor = () => { + // click topBtn 滚动至bodyAnchor 【移动端 PC】 + if (volantis.dom.topBtn && volantis.dom.bodyAnchor) { + volantis.dom.topBtn.click(e => { + e.preventDefault(); + e.stopPropagation(); + fn.scrolltoElement(volantis.dom.bodyAnchor); + e.stopImmediatePropagation(); + }); + } + + } + + // 设置导航栏 + fn.setHeader = () => { + // !!! 此处的Dom对象需要重载 !!! + if (!pdata.ispage) return; + + // 填充二级导航文章标题 【移动端 PC】 + volantis.dom.wrapper.find('.nav-sub .title').html(document.title.split(" - ")[0]); + + // ====== bind events to every btn ========= + // 评论按钮 【移动端 PC】 + volantis.dom.comment = volantis.dom.$(document.getElementById("s-comment")); // 评论按钮 桌面端 移动端 + volantis.dom.commentTarget = volantis.dom.$(document.querySelector('#l_main article#comments')); // 评论区域 + if (volantis.dom.commentTarget) { + volantis.dom.comment.click(e => { // 评论按钮点击后 跳转到评论区域 + e.preventDefault(); + e.stopPropagation(); + volantis.cleanContentVisibility(); + fn.scrolltoElement(volantis.dom.commentTarget); + e.stopImmediatePropagation(); + }); + } else volantis.dom.comment.style.display = 'none'; // 关闭了评论,则隐藏评论按钮 + + // 移动端toc目录按钮 【移动端】 + if (volantis.isMobile) { + volantis.dom.toc = volantis.dom.$(document.getElementById("s-toc")); // 目录按钮 仅移动端 + volantis.dom.tocTarget = volantis.dom.$(document.querySelector('#l_side .toc-wrapper')); // 侧边栏的目录列表 + if (volantis.dom.tocTarget) { + // 点击移动端目录按钮 激活目录按钮 显示侧边栏的目录列表 + volantis.dom.toc.click((e) => { + e.stopPropagation(); + volantis.dom.tocTarget.toggleClass('active'); + volantis.dom.toc.toggleClass('active'); + }); + // 点击空白 隐藏 + volantis.dom.$(document).click(function (e) { + e.stopPropagation(); + if (volantis.dom.tocTarget) { + volantis.dom.tocTarget.removeClass('active'); + } + volantis.dom.toc.removeClass('active'); + }); + } else if (volantis.dom.toc) volantis.dom.toc.style.display = 'none'; // 隐藏toc目录按钮 + } + } + + // 设置导航栏菜单选中状态 【移动端 PC】 + fn.setHeaderMenuSelection = () => { + // !!! 此处的Dom对象需要重载 !!! + volantis.dom.headerMenu = volantis.dom.$(document.querySelectorAll('#l_header .navigation,#l_cover .navigation,#l_side .navigation')); // 导航列表 + + // 先把已经激活的取消激活 + volantis.dom.headerMenu.forEach(element => { + let li = volantis.dom.$(element).find('li a.active') + if (li) + li.removeClass('active') + let div = volantis.dom.$(element).find('div a.active') + if (div) + div.removeClass('active') + }); + + // replace '%' '/' '.' + var idname = location.pathname.replace(/\/|%|\./g, ''); + if (idname.length == 0) { + idname = 'home'; + } + var page = idname.match(/page\d{0,}$/g); + if (page) { + page = page[0]; + idname = idname.split(page)[0]; + } + var index = idname.match(/index.html/); + if (index) { + index = index[0]; + idname = idname.split(index)[0]; + } + // 转义字符如 [, ], ~, #, @ + idname = idname.replace(/(\[|\]|~|#|@)/g, '\\$1'); + if (idname && volantis.dom.headerMenu) { + volantis.dom.headerMenu.forEach(element => { + // idname 不能为数字开头, 加一个 action- 前缀 + let id = element.querySelector("[active-action=action-" + idname + "]") + if (id) { + volantis.dom.$(id).addClass('active') + } + }); + } + } + + // 设置全局事件 + fn.setGlobalHeaderMenuEvent = () => { + if (volantis.isMobile) { + // 【移动端】 关闭已经展开的子菜单 点击展开子菜单 + document.querySelectorAll('#l_header .m-phone li').forEach(function (e) { + if (e.querySelector(".list-v")) { + // 点击菜单 + volantis.dom.$(e).click(function (e) { + e.stopPropagation(); + // 关闭已经展开的子菜单 + e.currentTarget.parentElement.childNodes.forEach(function (e) { + if (Object.prototype.toString.call(e) == '[object HTMLLIElement]') { + e.childNodes.forEach(function (e) { + if (Object.prototype.toString.call(e) == '[object HTMLUListElement]') { + volantis.dom.$(e).hide() + } + }) + } + }) + // 点击展开子菜单 + let array = e.currentTarget.children + for (let index = 0; index < array.length; index++) { + const element = array[index]; + if (volantis.dom.$(element).title === 'menu') { // 移动端菜单栏异常 + volantis.dom.$(element).display = "flex" // https://github.com/volantis-x/hexo-theme-volantis/issues/706 + } else { + volantis.dom.$(element).show() + } + } + }, 0); + } + }) + } else { + // 【PC端】 hover时展开子菜单,点击时[target.baseURI==origin时]隐藏子菜单? 现有逻辑大部分情况不隐藏子菜单 + document.querySelectorAll('#wrapper .m-pc li > a[href]').forEach(function (e) { + volantis.dom.$(e.parentElement).click(function (e) { + e.stopPropagation(); + if (e.target.origin == e.target.baseURI) { + document.querySelectorAll('#wrapper .m-pc .list-v').forEach(function (e) { + volantis.dom.$(e).hide(); // 大概率不会执行 + }) + } + }, 0); + }) + } + fn.setPageHeaderMenuEvent(); + } + + // 【移动端】隐藏子菜单 + fn.setPageHeaderMenuEvent = () => { + if (!volantis.isMobile) return + // 【移动端】 点击空白处隐藏子菜单 + volantis.dom.$(document).click(function (e) { + volantis.dom.mPhoneList.forEach(function (e) { + volantis.dom.$(e).hide(); + }) + }); + } + + // 设置导航栏搜索框 【移动端】 + fn.setHeaderSearch = () => { + if (!volantis.isMobile) return; + if (!volantis.dom.switcher) return; + // 点击移动端搜索按钮 + volantis.dom.switcher.click(function (e) { + e.stopPropagation(); + volantis.dom.header.toggleClass('z_search-open'); // 激活移动端搜索框 + volantis.dom.switcher.toggleClass('active'); // 移动端搜索按钮 + }); + // 点击空白取消激活 + volantis.dom.$(document).click(function (e) { + volantis.dom.header.removeClass('z_search-open'); + volantis.dom.switcher.removeClass('active'); + }); + // 移动端点击搜索框 停止事件传播 + volantis.dom.search.click(function (e) { + e.stopPropagation(); + }); + } + + // 设置 tabs 标签 【移动端 PC】 + fn.setTabs = () => { + let tabs = document.querySelectorAll('#l_main .tabs .nav-tabs') + if (!tabs) return + tabs.forEach(function (e) { + e.querySelectorAll('a').forEach(function (e) { + volantis.dom.$(e).on('click', (e) => { + e.preventDefault(); + e.stopPropagation(); + const $tab = volantis.dom.$(e.target.parentElement.parentElement.parentElement); + $tab.find('.nav-tabs .active').removeClass('active'); + volantis.dom.$(e.target.parentElement).addClass('active'); + $tab.find('.tab-content .active').removeClass('active'); + $tab.find(e.target.className).addClass('active'); + return false; + }); + }) + }) + } + + // hexo-reference 页脚跳转 https://github.com/volantis-x/hexo-theme-volantis/issues/647 + fn.footnotes = () => { + let ref = document.querySelectorAll('#l_main .footnote-backref, #l_main .footnote-ref > a'); + ref.forEach(function (e, i) { + ref[i].click = () => { }; // 强制清空原 click 事件 + volantis.dom.$(e).on('click', (e) => { + e.stopPropagation(); + e.preventDefault(); + let targetID = decodeURI(e.target.hash.split('#')[1]).replace(/\ /g, '-'); + let target = document.getElementById(targetID); + if (target) { + volantis.scroll.to(target, { addTop: - volantis.dom.header.offsetHeight - 5, behavior: 'instant' }) + } + }); + }) + } + + // 工具类:代码块复制 + fn.utilCopyCode = (Selector) => { + document.querySelectorAll(Selector).forEach(node => { + const test = node.insertAdjacentHTML("beforebegin", COPYHTML); + const _BtnCopy = node.previousSibling; + _BtnCopy.onclick = e => { + e.stopPropagation(); + const _icon = _BtnCopy.querySelector('i'); + const _span = _BtnCopy.querySelector('span'); + + node.focus(); + const range = new Range(); + range.selectNodeContents(node); + document.getSelection().removeAllRanges(); + document.getSelection().addRange(range); + + const str = document.getSelection().toString(); + fn.utilWriteClipText(str).then(() => { + fn.messageCopyright(); + _BtnCopy.classList.add('copied'); + _icon.classList.remove('fa-copy'); + _icon.classList.add('fa-check-circle'); + _span.innerText = "COPIED"; + setTimeout(() => { + _icon.classList.remove('fa-check-circle'); + _icon.classList.add('fa-copy'); + _span.innerText = "COPY"; + }, 2000) + }).catch(e => { + VolantisApp.message('系统提示', e, { + icon: 'fa fa-exclamation-circle red' + }); + _BtnCopy.classList.add('copied-failed'); + _icon.classList.remove('fa-copy'); + _icon.classList.add('fa-exclamation-circle'); + _span.innerText = "COPY FAILED"; + setTimeout(() => { + _icon.classList.remove('fa-exclamation-circle'); + _icon.classList.add('fa-copy'); + _span.innerText = "COPY"; + }) + }) + } + }); + } + + // 工具类:复制字符串到剪切板 + fn.utilWriteClipText = (str) => { + return navigator.clipboard + .writeText(str) + .then(() => { + return Promise.resolve() + }) + .catch(e => { + const input = document.createElement('textarea'); + input.setAttribute('readonly', 'readonly'); + document.body.appendChild(input); + input.innerHTML = str; + input.select(); + try { + let result = document.execCommand('copy') + document.body.removeChild(input); + if (!result || result === 'unsuccessful') { + return Promise.reject('复制文本失败!') + } else { + return Promise.resolve() + } + } catch (e) { + document.body.removeChild(input); + return Promise.reject( + '当前浏览器不支持复制功能,请检查更新或更换其他浏览器操作!' + ) + } + }) + } + + // 工具类:返回时间间隔 + fn.utilTimeAgo = (dateTimeStamp) => { + const minute = 1e3 * 60, hour = minute * 60, day = hour * 24, week = day * 7, month = day * 30; + const now = new Date().getTime(); + const diffValue = now - dateTimeStamp; + const minC = diffValue / minute, + hourC = diffValue / hour, + dayC = diffValue / day, + weekC = diffValue / week, + monthC = diffValue / month; + if (diffValue < 0) { + result = "" + } else if (monthC >= 1 && monthC < 7) { + result = " " + parseInt(monthC) + " 月前" + } else if (weekC >= 1 && weekC < 4) { + result = " " + parseInt(weekC) + " 周前" + } else if (dayC >= 1 && dayC < 7) { + result = " " + parseInt(dayC) + " 天前" + } else if (hourC >= 1 && hourC < 24) { + result = " " + parseInt(hourC) + " 小时前" + } else if (minC >= 1 && minC < 60) { + result = " " + parseInt(minC) + " 分钟前" + } else if (diffValue >= 0 && diffValue <= minute) { + result = "刚刚" + } else { + const datetime = new Date(); + datetime.setTime(dateTimeStamp); + const Nyear = datetime.getFullYear(); + const Nmonth = datetime.getMonth() + 1 < 10 ? "0" + (datetime.getMonth() + 1) : datetime.getMonth() + 1; + const Ndate = datetime.getDate() < 10 ? "0" + datetime.getDate() : datetime.getDate(); + const Nhour = datetime.getHours() < 10 ? "0" + datetime.getHours() : datetime.getHours(); + const Nminute = datetime.getMinutes() < 10 ? "0" + datetime.getMinutes() : datetime.getMinutes(); + const Nsecond = datetime.getSeconds() < 10 ? "0" + datetime.getSeconds() : datetime.getSeconds(); + result = Nyear + "-" + Nmonth + "-" + Ndate + } + return result; + } + + // 消息提示:标准 + fn.message = (title, message, option = {}, done = null) => { + if (typeof iziToast === "undefined") { + volantis.css(volantis.GLOBAL_CONFIG.cdn.izitoast_css) + volantis.js(volantis.GLOBAL_CONFIG.cdn.izitoast_js, () => { + tozashMessage(title, message, option, done); + }); + } else { + tozashMessage(title, message, option, done); + } + function tozashMessage(title, message, option, done) { + const { + icon, + time, + position, + transitionIn, + transitionOut, + messageColor, + titleColor, + backgroundColor, + zindex, + displayMode + } = option; + iziToast.show({ + layout: '2', + icon: 'Fontawesome', + closeOnEscape: 'true', + displayMode: displayMode || 'replace', + transitionIn: transitionIn || volantis.GLOBAL_CONFIG.plugins.message.transitionIn, + transitionOut: transitionOut || volantis.GLOBAL_CONFIG.plugins.message.transitionOut, + messageColor: messageColor || volantis.GLOBAL_CONFIG.plugins.message.messageColor, + titleColor: titleColor || volantis.GLOBAL_CONFIG.plugins.message.titleColor, + backgroundColor: backgroundColor || volantis.GLOBAL_CONFIG.plugins.message.backgroundColor, + zindex: zindex || volantis.GLOBAL_CONFIG.plugins.message.zindex, + icon: icon || volantis.GLOBAL_CONFIG.plugins.message.icon.default, + timeout: time || volantis.GLOBAL_CONFIG.plugins.message.time.default, + position: position || volantis.GLOBAL_CONFIG.plugins.message.position, + title: title, + message: message, + onClosed: () => { + if (done) done(); + }, + }); + } + } + + // 消息提示:询问 + fn.question = (title, message, option = {}, success = null, cancel = null, done = null) => { + if (typeof iziToast === "undefined") { + volantis.css(volantis.GLOBAL_CONFIG.cdn.izitoast_css) + volantis.js(volantis.GLOBAL_CONFIG.cdn.izitoast_js, () => { + tozashQuestion(title, message, option, success, cancel, done); + }); + } else { + tozashQuestion(title, message, option, success, cancel, done); + } + + function tozashQuestion(title, message, option, success, cancel, done) { + const { + icon, + time, + position, + transitionIn, + transitionOut, + messageColor, + titleColor, + backgroundColor, + zindex + } = option; + iziToast.question({ + id: 'question', + icon: 'Fontawesome', + close: false, + overlay: true, + displayMode: 'once', + position: 'center', + messageColor: messageColor || volantis.GLOBAL_CONFIG.plugins.message.messageColor, + titleColor: titleColor || volantis.GLOBAL_CONFIG.plugins.message.titleColor, + backgroundColor: backgroundColor || volantis.GLOBAL_CONFIG.plugins.message.backgroundColor, + zindex: zindex || volantis.GLOBAL_CONFIG.plugins.message.zindex, + icon: icon || volantis.GLOBAL_CONFIG.plugins.message.icon.quection, + timeout: time || volantis.GLOBAL_CONFIG.plugins.message.time.quection, + title: title, + message: message, + buttons: [ + ['', (instance, toast) => { + instance.hide({ transitionOut: transitionOut || 'fadeOut' }, toast, 'button'); + if (success) success(instance, toast) + }], + ['', (instance, toast) => { + instance.hide({ transitionOut: transitionOut || 'fadeOut' }, toast, 'button'); + if (cancel) cancel(instance, toast) + }] + ], + onClosed: (instance, toast, closedBy) => { + if (done) done(instance, toast, closedBy); + } + }); + } + } + + // 消息提示:隐藏 + fn.hideMessage = (done = null) => { + const toast = document.querySelector('.iziToast'); + if (!toast) { + if (done) done() + return; + } + + if (typeof iziToast === "undefined") { + volantis.css(volantis.GLOBAL_CONFIG.cdn.izitoast_css) + volantis.js(volantis.GLOBAL_CONFIG.cdn.izitoast_js, () => { + hideMessage(done); + }); + } else { + hideMessage(done); + } + + function hideMessage(done) { + iziToast.hide({}, toast); + if (done) done(); + } + } + + // 消息提示:复制 + let messageCopyrightShow = 0; + fn.messageCopyright = () => { + // 消息提示 复制时弹出 + if (volantis.GLOBAL_CONFIG.plugins.message.enable + && volantis.GLOBAL_CONFIG.plugins.message.copyright.enable + && messageCopyrightShow < 1) { + messageCopyrightShow++; + VolantisApp.message(volantis.GLOBAL_CONFIG.plugins.message.copyright.title, + volantis.GLOBAL_CONFIG.plugins.message.copyright.message, { + icon: volantis.GLOBAL_CONFIG.plugins.message.copyright.icon, + transitionIn: 'flipInX', + transitionOut: 'flipOutX', + displayMode: 1 + }); + } + } + + return { + init: () => { + fn.init(); + fn.event(); + }, + subscribe: () => { + fn.setIsMobile(); + fn.setHeader(); + fn.setHeaderMenuSelection(); + fn.setGlobalHeaderMenuEvent(); + fn.setHeaderSearch(); + fn.setScrollAnchor(); + fn.setTabs(); + fn.footnotes(); + }, + utilCopyCode: fn.utilCopyCode, + utilWriteClipText: fn.utilWriteClipText, + utilTimeAgo: fn.utilTimeAgo, + message: fn.message, + question: fn.question, + hideMessage: fn.hideMessage, + messageCopyright: fn.messageCopyright, + scrolltoElement: fn.scrolltoElement + } +})() +Object.freeze(VolantisApp); + +/* FancyBox */ +const VolantisFancyBox = (() => { + const fn = {}; + + fn.loadFancyBox = (done) => { + volantis.css(volantis.GLOBAL_CONFIG.cdn.fancybox_css); + volantis.js(volantis.GLOBAL_CONFIG.cdn.fancybox_js).then(() => { + if (done) done(); + }) + } + + /** + * 加载及处理 + * + * @param {*} checkMain 是否只处理文章区域的文章 + * @param {*} done FancyBox 加载完成后的动作,默认执行分组绑定 + * @returns + */ + fn.init = (checkMain = true, done = fn.groupBind) => { + if (!document.querySelector(".md .gallery img, .fancybox") && checkMain) return; + if (typeof Fancybox === "undefined") { + fn.loadFancyBox(done); + } else { + done(); + } + } + + /** + * 图片元素预处理 + * + * @param {*} selectors 选择器 + * @param {*} name 分组 + */ + fn.elementHandling = (selectors, name) => { + const nodeList = document.querySelectorAll(selectors); + nodeList.forEach($item => { + if ($item.hasAttribute('fancybox')) return; + $item.setAttribute('fancybox', ''); + const $link = document.createElement('a'); + $link.setAttribute('href', $item.src); + $link.setAttribute('data-caption', $item.alt); + $link.setAttribute('data-fancybox', name); + $link.classList.add('fancybox'); + $link.append($item.cloneNode()); + $item.replaceWith($link); + }) + } + + /** + * 原生绑定 + * + * @param {*} selectors 选择器 + */ + fn.bind = (selectors) => { + fn.init(false, () => { + Fancybox.bind(selectors, { + groupAll: true, + Hash: false, + hideScrollbar: false, + Thumbs: { + autoStart: false, + }, + caption: function (fancybox, slide) { + return slide.thumbEl?.alt || ""; + } + }); + }); + } + + /** + * 分组绑定 + * + * @param {*} groupName 分组名称 + */ + fn.groupBind = (groupName = null) => { + const group = new Set(); + + document.querySelectorAll(".gallery").forEach(ele => { + if (ele.querySelector("img")) { + group.add(ele.getAttribute('data-group') || 'default'); + } + }) + + if (!!groupName) group.add(groupName); + + for (const iterator of group) { + Fancybox.unbind('[data-fancybox="' + iterator + '"]'); + Fancybox.bind('[data-fancybox="' + iterator + '"]', { + Hash: false, + hideScrollbar: false, + Thumbs: { + autoStart: false, + } + }); + } + } + + return { + init: fn.init, + bind: fn.bind, + groupBind: (selectors, groupName = 'default') => { + try { + fn.elementHandling(selectors, groupName); + fn.init(false, () => { + fn.groupBind(groupName) + }); + } catch (error) { + console.error(error) + } + } + } +})() +Object.freeze(VolantisFancyBox); + +// highlightKeyWords 与 搜索功能搭配 https://github.com/next-theme/hexo-theme-next/blob/eb194a7258058302baf59f02d4b80b6655338b01/source/js/third-party/search/local-search.js +// Question: 锚点稳定性未知 +// ToDo: 查找模式 +// 0. (/////////要知道浏览器自带全页面查找功能 CTRL + F) +// 1. 右键开启查找模式 / 导航栏菜单开启?? / CTRL + F ??? +// 2. 查找模式面板 (可拖动? or 固定?) +// 3. keyword mark id 从 0 开始编号 查找下一处 highlightKeyWords.scrollToNextHighlightKeywordMark() 查找上一处 scrollToPrevHighlightKeywordMark() 循环查找(取模%) +// 4. 可输入修改 查找关键词 keywords(type:list) +// 5. 区分大小写 caseSensitive (/ 全字匹配?? / 正则匹配??) +// 6. 在选定区域中查找 querySelector ?? +// 7. 关闭查找模式 +// 8. 搜索跳转 (URL 入口) 自动开启查找模式 调用 scrollToNextHighlightKeywordMark() +const highlightKeyWords = (() => { + let fn = {} + fn.markNum = 0 + fn.markNextId = -1 + fn.startFromURL = () => { + const params = decodeURI(new URL(location.href).searchParams.get('keyword')); + const keywords = params ? params.split(' ') : []; + const post = document.querySelector('#l_main'); + if (keywords.length == 1 && keywords[0] == "null") { + return; + } + fn.start(keywords, post); // 渲染耗时较长 + fn.scrollToFirstHighlightKeywordMark() + } + fn.scrollToFirstHighlightKeywordMark = () => { + volantis.cleanContentVisibility(); + let target = fn.scrollToNextHighlightKeywordMark("0"); + if (!target) { + volantis.requestAnimationFrame(fn.scrollToFirstHighlightKeywordMark) + } + } + fn.scrollToNextHighlightKeywordMark = (id) => { + // Next Id + let input = id || (fn.markNextId + 1) % fn.markNum; + fn.markNextId = parseInt(input) + let target = document.getElementById("keyword-mark-" + fn.markNextId); + if (!target) { + fn.markNextId = (fn.markNextId + 1) % fn.markNum; + target = document.getElementById("keyword-mark-" + fn.markNextId); + } + if (target) { + volantis.scroll.to(target, { addTop: - volantis.dom.header.offsetHeight - 5, behavior: 'instant' }) + } + // Current target + return target + } + fn.scrollToPrevHighlightKeywordMark = (id) => { + // Prev Id + let input = id || (fn.markNextId - 1 + fn.markNum) % fn.markNum; + fn.markNextId = parseInt(input) + let target = document.getElementById("keyword-mark-" + fn.markNextId); + if (!target) { + fn.markNextId = (fn.markNextId - 1 + fn.markNum) % fn.markNum; + target = document.getElementById("keyword-mark-" + fn.markNextId); + } + if (target) { + volantis.scroll.to(target, { addTop: - volantis.dom.header.offsetHeight - 5, behavior: 'instant' }) + } + // Current target + return target + } + fn.start = (keywords, querySelector) => { + fn.markNum = 0 + if (!keywords.length || !querySelector || (keywords.length == 1 && keywords[0] == "null")) return; + console.log(keywords); + const walk = document.createTreeWalker(querySelector, NodeFilter.SHOW_TEXT, null); + const allNodes = []; + while (walk.nextNode()) { + if (!walk.currentNode.parentNode.matches('button, select, textarea')) allNodes.push(walk.currentNode); + } + allNodes.forEach(node => { + const [indexOfNode] = fn.getIndexByWord(keywords, node.nodeValue); + if (!indexOfNode.length) return; + const slice = fn.mergeIntoSlice(0, node.nodeValue.length, indexOfNode); + fn.highlightText(node, slice, 'keyword'); + fn.highlightStyle() + }); + } + fn.getIndexByWord = (words, text, caseSensitive = false) => { + const index = []; + const included = new Set(); + words.forEach(word => { + const div = document.createElement('div'); + div.innerText = word; + word = div.innerHTML; + + const wordLen = word.length; + if (wordLen === 0) return; + let startPosition = 0; + let position = -1; + if (!caseSensitive) { + text = text.toLowerCase(); + word = word.toLowerCase(); + } + while ((position = text.indexOf(word, startPosition)) > -1) { + index.push({ position, word }); + included.add(word); + startPosition = position + wordLen; + } + }); + index.sort((left, right) => { + if (left.position !== right.position) { + return left.position - right.position; + } + return right.word.length - left.word.length; + }); + return [index, included]; + }; + fn.mergeIntoSlice = (start, end, index) => { + let item = index[0]; + let { position, word } = item; + const hits = []; + const count = new Set(); + while (position + word.length <= end && index.length !== 0) { + count.add(word); + hits.push({ + position, + length: word.length + }); + const wordEnd = position + word.length; + + index.shift(); + while (index.length !== 0) { + item = index[0]; + position = item.position; + word = item.word; + if (wordEnd > position) { + index.shift(); + } else { + break; + } + } + } + return { + hits, + start, + end, + count: count.size + }; + }; + fn.highlightText = (node, slice, className) => { + const val = node.nodeValue; + let index = slice.start; + const children = []; + for (const { position, length } of slice.hits) { + const text = document.createTextNode(val.substring(index, position)); + index = position + length; + let mark = document.createElement('mark'); + mark.className = className; + mark = fn.highlightStyle(mark) + mark.appendChild(document.createTextNode(val.substr(position, length))); + children.push(text, mark); + } + node.nodeValue = val.substring(index, slice.end); + children.forEach(element => { + node.parentNode.insertBefore(element, node); + }); + } + fn.highlightStyle = (mark) => { + if (!mark) return; + mark.id = "keyword-mark-" + fn.markNum; + fn.markNum++; + mark.style.background = "transparent"; + mark.style["border-bottom"] = "1px dashed #ff2a2a"; + mark.style["color"] = "#ff2a2a"; + mark.style["font-weight"] = "bold"; + return mark + } + fn.cleanHighlightStyle = () => { + document.querySelectorAll(".keyword").forEach(mark => { + mark.style.background = "transparent"; + mark.style["border-bottom"] = null; + mark.style["color"] = null; + mark.style["font-weight"] = null; + }) + } + return { + start: (keywords, querySelector) => { + fn.start(keywords, querySelector) + }, + startFromURL: () => { + fn.startFromURL() + }, + scrollToNextHighlightKeywordMark: (id) => { + fn.scrollToNextHighlightKeywordMark(id) + }, + scrollToPrevHighlightKeywordMark: (id) => { + fn.scrollToPrevHighlightKeywordMark(id) + }, + cleanHighlightStyle: () => { + fn.cleanHighlightStyle() + }, + } +})() +Object.freeze(highlightKeyWords); + +/* DOM 控制 */ +const DOMController = { + /** + * 控制元素显隐 + */ + visible: (ele, type = true) => { + if (ele) ele.style.display = type === true ? 'block' : 'none'; + }, + + /** + * 移除元素 + */ + remove: (param) => { + const node = document.querySelectorAll(param); + node.forEach(ele => { + ele.remove(); + }) + }, + + removeList: (list) => { + list.forEach(param => { + DOMController.remove(param) + }) + }, + + /** + * 设置属性 + */ + setAttribute: (param, attrName, attrValue) => { + const node = document.querySelectorAll(param); + node.forEach(ele => { + ele.setAttribute(attrName, attrValue) + }) + }, + + setAttributeList: (list) => { + list.forEach(item => { + DOMController.setAttribute(item[0], item[1], item[2]) + }) + }, + + /** + * 设置样式 + */ + setStyle: (param, styleName, styleValue) => { + const node = document.querySelectorAll(param); + node.forEach(ele => { + ele.style[styleName] = styleValue; + }) + }, + + setStyleList: (list) => { + list.forEach(item => { + DOMController.setStyle(item[0], item[1], item[2]) + }) + }, + + fadeIn: (e) => { + if (!e) return; + e.style.visibility = "visible"; + e.style.opacity = 1; + e.style.display = "block"; + e.style.transition = "all 0.5s linear"; + return e + }, + + fadeOut: (e) => { + if (!e) return; + e.style.visibility = "hidden"; + e.style.opacity = 0; + e.style.display = "none"; + e.style.transition = "all 0.5s linear"; + return e + }, + + fadeToggle: (e) => { + if (!e) return; + if (e.style.visibility == "hidden") { + e = DOMController.fadeIn(e) + } else { + e = DOMController.fadeOut(e) + } + return e + }, + + fadeToggleList: (list) => { + list.forEach(param => { + DOMController.fadeToggle(param) + }) + }, + + hasClass: (e, c) => { + if (!e) return; + return e.className.match(new RegExp('(\\s|^)' + c + '(\\s|$)')); + }, + + addClass: (e, c) => { + if (!e) return; + e.classList.add(c); + return e + }, + + removeClass: (e, c) => { + if (!e) return; + e.classList.remove(c); + return e + }, + + toggleClass: (e, c) => { + if (!e) return; + if (DOMController.hasClass(e, c)) { + DOMController.removeClass(e, c) + } else { + DOMController.addClass(e, c) + } + return e + }, + + toggleClassList: (list) => { + list.forEach(item => { + DOMController.toggleClass(item[0], item[1]) + }) + } +} +Object.freeze(DOMController); + +const VolantisRequest = { + timeoutFetch: (url, ms, requestInit) => { + const controller = new AbortController() + requestInit.signal?.addEventListener('abort', () => controller.abort()) + let promise = fetch(url, { ...requestInit, signal: controller.signal }) + if (ms > 0) { + const timer = setTimeout(() => controller.abort(), ms) + promise.finally(() => { clearTimeout(timer) }) + } + promise = promise.catch((err) => { + throw ((err || {}).name === 'AbortError') ? new Error(`Fetch timeout: ${url}`) : err + }) + return promise + }, + + Fetch: async (url, requestInit, timeout = 15000) => { + const resp = await VolantisRequest.timeoutFetch(url, timeout, requestInit); + if (!resp.ok) throw new Error(`Fetch error: ${url} | ${resp.status}`); + let json = await resp.json() + if (!json.success) throw json + return json + }, + + POST: async (url, data) => { + const requestInit = { + method: 'POST', + } + if (data) { + const formData = new FormData(); + Object.keys(data).forEach(key => formData.append(key, String(data[key]))) + requestInit.body = formData; + } + const json = await VolantisRequest.Fetch(url, requestInit) + return json.data; + }, + + Get: async (url, data) => { + const json = await VolantisRequest.Fetch(url + (data ? (`?${new URLSearchParams(data)}`) : ''), { + method: 'GET' + }) + } +} +Object.freeze(VolantisRequest); diff --git a/themes/volantis/source/js/meting-plus.js b/themes/volantis/source/js/meting-plus.js new file mode 100755 index 0000000..f955976 --- /dev/null +++ b/themes/volantis/source/js/meting-plus.js @@ -0,0 +1,151 @@ +class MetingJSElement extends HTMLElement { + + connectedCallback() { + if (window.APlayer && window.fetch) { + this._init() + this._parse() + } + } + + disconnectedCallback() { + if (!this.lock) { + this.aplayer.destroy() + } + } + + _camelize(str) { + return str + .replace(/^[_.\- ]+/, '') + .toLowerCase() + .replace(/[_.\- ]+(\w|$)/g, (m, p1) => p1.toUpperCase()) + } + + _init() { + let config = {} + for (let i = 0; i < this.attributes.length; i += 1) { + config[this._camelize(this.attributes[i].name)] = this.attributes[i].value + } + let keys = [ + 'server', 'type', 'id', 'api', 'auth', + 'auto', 'lock', + 'name', 'title', 'artist', 'author', 'url', 'cover', 'pic', 'lyric', 'lrc', + 'audio', + ] + this.meta = {} + for (let key of keys) { + this.meta[key] = config[key] + delete config[key] + } + this.config = config + + this.api = this.meta.api || window.meting_api || 'https://api.i-meto.com/meting/api?server=:server&type=:type&id=:id&r=:r' + if (this.meta.auto) this._parse_link() + } + + _parse_link() { + let rules = [ + ['music.163.com.*song.*id=(\\d+)', 'netease', 'song'], + ['music.163.com.*album.*id=(\\d+)', 'netease', 'album'], + ['music.163.com.*artist.*id=(\\d+)', 'netease', 'artist'], + ['music.163.com.*playlist.*id=(\\d+)', 'netease', 'playlist'], + ['music.163.com.*discover/toplist.*id=(\\d+)', 'netease', 'playlist'], + ['y.qq.com.*song/(\\w+).html', 'tencent', 'song'], + ['y.qq.com.*album/(\\w+).html', 'tencent', 'album'], + ['y.qq.com.*singer/(\\w+).html', 'tencent', 'artist'], + ['y.qq.com.*playsquare/(\\w+).html', 'tencent', 'playlist'], + ['y.qq.com.*playlist/(\\w+).html', 'tencent', 'playlist'], + ['xiami.com.*song/(\\w+)', 'xiami', 'song'], + ['xiami.com.*album/(\\w+)', 'xiami', 'album'], + ['xiami.com.*artist/(\\w+)', 'xiami', 'artist'], + ['xiami.com.*collect/(\\w+)', 'xiami', 'playlist'], + ] + + for (let rule of rules) { + let patt = new RegExp(rule[0]) + let res = patt.exec(this.meta.auto) + if (res !== null) { + this.meta.server = rule[1] + this.meta.type = rule[2] + this.meta.id = res[1] + return + } + } + } + + _parse() { + if (this.meta.audio) { + let audioList + if(this.meta.audio.trim().startsWith("%5B")){ // 以中括号开头,认为是数组 + audioList = JSON.parse(decodeURI(this.meta.audio)) + }else{ + audioList = eval(this.meta.audio) + } + this._loadPlayer(audioList) + return + } + if (this.meta.url) { + let result = { + name: this.meta.name || this.meta.title || 'Audio name', + artist: this.meta.artist || this.meta.author || 'Audio artist', + url: this.meta.url, + cover: this.meta.cover || this.meta.pic, + lrc: this.meta.lrc || this.meta.lyric || '', + type: this.meta.type || 'auto', + } + if (!result.lrc) { + this.meta.lrcType = 0 + } + if (this.innerText) { + result.lrc = this.innerText + this.meta.lrcType = 2 + } + this._loadPlayer([result]) + return + } + + let url = this.api + .replace(':server', this.meta.server) + .replace(':type', this.meta.type) + .replace(':id', this.meta.id) + .replace(':auth', this.meta.auth) + .replace(':r', Math.random()) + + fetch(url) + .then(res => res.json()) + .then(result => this._loadPlayer(result)) + } + + _loadPlayer(data) { + + let defaultOption = { + audio: data, + mutex: true, + lrcType: this.meta.lrcType || 3, + storageName: 'metingjs' + } + + if (!data.length) return + + let options = { + ...defaultOption, + ...this.config, + } + for (let optkey in options) { + if (options[optkey] === 'true' || options[optkey] === 'false') { + options[optkey] = (options[optkey] === 'true') + } + } + + let div = document.createElement('div') + options.container = div + this.appendChild(div) + + this.aplayer = new APlayer(options) + } + + } + + if (window.customElements && !window.customElements.get('meting-js')) { + window.MetingJSElement = MetingJSElement + window.customElements.define('meting-js', MetingJSElement) + } \ No newline at end of file diff --git a/themes/volantis/source/js/plugins/aplayer.js b/themes/volantis/source/js/plugins/aplayer.js new file mode 100755 index 0000000..fc041a3 --- /dev/null +++ b/themes/volantis/source/js/plugins/aplayer.js @@ -0,0 +1,186 @@ +/** + * 右键音乐 + * */ +const RightMenuAplayer = (() => { + let playStatus; // 播放器状态 + const APlayer = {}; // 右键音乐所控制的播放器 + const fn = {}; + + fn.checkAPlayer = () => { + if (playStatus === undefined || APlayer.player === undefined) { + fn.setAPlayerObject(); + } else if (APlayer.observer === undefined) { + fn.setAPlayerObserver(); + } + } + + // 设置全局播放器所对应的 aplyer 对象 + fn.setAPlayerObject = () => { + let meting = document.querySelectorAll('.footer meting-js'); + if (meting.length == 0) { + meting = document.querySelectorAll('meting-js'); + } + APlayer.player = undefined; + meting.forEach((item, index) => { + if (item.meta.id == volantis.GLOBAL_CONFIG.plugins.aplayer.id && item.aplayer && APlayer.player === undefined) { + APlayer.player = item.aplayer; + fn.setAPlayerObserver(); + fn.updateTitle(); + } + }); + } + + // 事件监听 + fn.setAPlayerObserver = () => { + try { + APlayer.player.on('play', function (e) { + fn.updateAPlayerControllerStatus(e); + APlayer.status = 'play'; + }); + APlayer.player.on('pause', function (e) { + fn.updateAPlayerControllerStatus(e); + APlayer.status = 'pause'; + }); + APlayer.player.on('volumechange', function (e) { + fn.onUpdateAPlayerVolume(e); + }); + APlayer.player.on('loadstart', function (e) { + fn.updateTitle(e); + }); + + // 监听音量手势 + APlayer.volumeBarWrap = document.getElementsByClassName('nav volume')[0].children[0]; + APlayer.volumeBar = APlayer.volumeBarWrap.children[0]; + + const thumbMove = (e) => { + fn.updateAPlayerVolume(e); + }; + + const thumbUp = (e) => { + APlayer.volumeBarWrap.classList.remove('aplayer-volume-bar-wrap-active'); + document.removeEventListener('mouseup', thumbUp); + document.removeEventListener('mousemove', thumbMove); + fn.updateAPlayerVolume(e); + }; + + APlayer.volumeBarWrap.addEventListener('mousedown', (event) => { + event.stopPropagation(); + APlayer.volumeBarWrap.classList.add('aplayer-volume-bar-wrap-active'); + document.addEventListener('mousemove', thumbMove); + document.addEventListener('mouseup', thumbUp); + }); + + APlayer.volumeBarWrap.addEventListener('click', (event) => { + event.stopPropagation(); + }); + + fn.updateAPlayerControllerStatus(); + fn.onUpdateAPlayerVolume(); + APlayer.observer = true; + } catch (error) { + console.log(error); + APlayer.observer = undefined; + } + } + + fn.updateAPlayerVolume = (e) => { + let percentage = ((e.clientX || e.changedTouches[0].clientX) - + APlayer.volumeBar.getBoundingClientRect().left) / APlayer.volumeBar.clientWidth; + percentage = Math.max(percentage, 0); + percentage = Math.min(percentage, 1); + APlayer.player.volume(percentage); + } + + fn.onUpdateAPlayerVolume = () => { + try { + APlayer.volumeBar.children[0].style.width = APlayer.player.audio.volume * 100 + '%'; + } catch (error) { + console.log(error); + } + } + + // 更新控制器状态 + fn.updateAPlayerControllerStatus = () => { + try { + if (APlayer.player.audio.paused) { + playStatus = 'pause'; + document.getElementsByClassName('nav toggle')[0].children[0].classList.add('fa-play'); + document.getElementsByClassName('nav toggle')[0].children[0].classList.remove('fa-pause'); + } else { + playStatus = 'play'; + document.getElementsByClassName('nav toggle')[0].children[0].classList.remove('fa-play'); + document.getElementsByClassName('nav toggle')[0].children[0].classList.add('fa-pause'); + } + } catch (error) { + console.log(error); + } + } + + // 播放/暂停 + fn.aplayerToggle = () => { + fn.checkAPlayer(); + try { + APlayer.player.toggle(); + } catch (error) { + console.log(error); + } + } + + // 上一曲 + fn.aplayerBackward = () => { + fn.checkAPlayer(); + try { + APlayer.player.skipBack(); + APlayer.player.play(); + } catch (error) { + console.log(error); + } + } + + // 下一曲 + fn.aplayerForward = () => { + fn.checkAPlayer(); + try { + APlayer.player.skipForward(); + APlayer.player.play(); + } catch (error) { + console.log(error); + } + } + + // 调节音量 + fn.aplayerVolume = (percent) => { + fn.checkAPlayer(); + try { + APlayer.player.volume(percent); + } catch (error) { + console.log(error); + } + } + + // 更新音乐标题 + fn.updateTitle = () => { + fn.checkAPlayer(); + try { + const index = APlayer.player.list.index; + const obj = APlayer.player.list.audios[index]; + document.getElementsByClassName('nav music-title')[0].innerHTML = obj.title; + } catch (error) { + //console.log(error); + } + } + + return { + checkAPlayer: fn.checkAPlayer, + aplayerBackward: fn.aplayerBackward, + aplayerToggle: fn.aplayerToggle, + aplayerForward: fn.aplayerForward, + APlayer: APlayer + } +})() + +Object.freeze(RightMenuAplayer); + +volantis.requestAnimationFrame(() => { + RightMenuAplayer.checkAPlayer(); +}); diff --git a/themes/volantis/source/js/plugins/parallax.js b/themes/volantis/source/js/plugins/parallax.js new file mode 100755 index 0000000..7393934 --- /dev/null +++ b/themes/volantis/source/js/plugins/parallax.js @@ -0,0 +1,191 @@ +let Parallax = {}; +Parallax.options = {}; +Parallax.options.speed = 0.25; +Parallax.options.zIndex = -100; +Parallax.options.fade = 1500; +Parallax.slidein = () => { + let slider = Parallax.mirrors[0].slider; + if (Parallax.mirrors.length >= 2) { + slider = Parallax.mirrors[1].slider; + } + var opac = parseFloat(slider.style.opacity); + if (opac !== 1) { + if (Parallax.mirrors.length >= 2) { + opac = opac + 0.1; + slider.style.opacity = opac; + setTimeout(Parallax.slidein, Parallax.options.fade / 10); + }else{ + slider.style.opacity = 1; + } + } else { + if (Parallax.mirrors.length >= 2) { + Parallax.mirrors[0].mirror.remove(); + Parallax.mirrors.shift(); + } + } +}; +Parallax.start = () => { + let mirror = document.createElement("div"); + mirror.classList.add("parallax-mirror"); + mirror.style.visibility = "hidden"; + mirror.style.zIndex = Parallax.options.zIndex; + mirror.style.position = "fixed"; + mirror.style.top = 0; + mirror.style.left = 0; + mirror.style.overflow = "hidden"; + Parallax.window.appendChild(mirror); + let slider = document.createElement("img"); + slider.src = Parallax.options.src; + slider.alt = "parallax"; + slider.classList.add("parallax-slider"); + slider.style.opacity = 0; + mirror.appendChild(slider); + if (!Parallax.mirrors) { + Parallax.mirrors = []; + } + let mirrorItem = {}; + mirrorItem.mirror = mirror; + mirrorItem.slider = slider; + Parallax.mirrors.push(mirrorItem); + Parallax.slidein(); + slider.addEventListener( + "load", + function () { + Parallax.update(); + }, + false + ); +}; +Parallax.init = () => { + function loadDimensions() { + Parallax.wH = document.documentElement.clientHeight; + Parallax.wW = document.documentElement.clientWidth; + } + function getScrollTop() { + var scrollPos; + if (window.pageYOffset) { + scrollPos = window.pageYOffset; + } else if (document.compatMode && document.compatMode != "BackCompat") { + scrollPos = document.documentElement.scrollTop; + } else if (document.body) { + scrollPos = document.body.scrollTop; + } + return scrollPos; + } + function loadScrollPosition() { + const winScrollTop = getScrollTop(); + Parallax.sT = Math.max(0, winScrollTop); + Parallax.sL = Math.max(0, document.body.scrollLeft); + Parallax.overScroll = Math.min(winScrollTop, 0); + } + window.addEventListener( + "resize", + function () { + loadDimensions(); + Parallax.update(); + }, + false + ); + loadDimensions(); + let lastPosition = -1; + (function loop() { + const yoffset = getScrollTop(); + if (lastPosition !== yoffset) { + lastPosition = yoffset; + loadScrollPosition(); + Parallax.update(); + } + window.requestAnimationFrame = + window.requestAnimationFrame || + window.mozRequestAnimationFrame || + window.webkitRequestAnimationFrame; + window.requestAnimationFrame(loop); + })(); +}; + +Parallax.refreshItem = (slider) => { + Parallax.options.aspectRatio = + slider.naturalWidth / (slider.naturalHeight || 1); + const aspect = Parallax.options.aspectRatio || 1; + Parallax.options.boxWidth = Parallax.window.clientWidth; + Parallax.options.boxHeight = Parallax.window.clientHeight; + Parallax.options.boxOffsetTop = Parallax.window.scrollTop; + Parallax.options.boxOffsetLeft = Parallax.window.scrollLeft; + Parallax.options.boxOffsetBottom = + Parallax.options.boxOffsetTop + Parallax.options.boxHeight; + const winHeight = Parallax.wH; + const maxOffset = Parallax.options.boxOffsetTop; + const minOffset = Math.max( + Parallax.options.boxOffsetTop + Parallax.options.boxHeight - winHeight, + 0 + ); + const imageHeightMin = + (Parallax.options.boxHeight + + (maxOffset - minOffset) * (1 - Parallax.options.speed)) | + 0; + const imageOffsetMin = + ((Parallax.options.boxOffsetTop - maxOffset) * + (1 - Parallax.options.speed)) | + 0; + let margin; + if (Parallax.options.boxWidth < imageHeightMin * aspect) { + Parallax.options.imageWidth = (imageHeightMin * aspect) | 0; + Parallax.options.imageHeight = imageHeightMin; + Parallax.options.offsetBaseTop = imageOffsetMin; + margin = Parallax.options.imageWidth - Parallax.options.boxWidth; + Parallax.options.offsetLeft = (-margin / 2) | 0; + } else { + Parallax.options.imageWidth = Parallax.options.boxWidth; + Parallax.options.imageHeight = (Parallax.options.boxWidth / aspect) | 0; + Parallax.options.offsetLeft = 0; + margin = Parallax.options.imageHeight - imageHeightMin; + Parallax.options.offsetBaseTop = (imageOffsetMin - margin / 2) | 0; + } +}; +Parallax.renderItem = (mirror, slider) => { + const scrollTop = Parallax.sT; + const scrollLeft = Parallax.sL; + const scrollBottom = scrollTop + Parallax.wH; + if ( + Parallax.options.boxOffsetBottom > scrollTop && + Parallax.options.boxOffsetTop <= scrollBottom + ) { + Parallax.options.visibility = "visible"; + Parallax.options.mirrorTop = Parallax.options.boxOffsetTop - scrollTop; + Parallax.options.mirrorLeft = Parallax.options.boxOffsetLeft - scrollLeft; + Parallax.options.offsetTop = + Parallax.options.offsetBaseTop - + Parallax.options.mirrorTop * (1 - Parallax.options.speed); + } else { + Parallax.options.visibility = "hidden"; + } + mirror.style.transform = + "translate3d(" + + Parallax.options.mirrorLeft + + "px, " + + Parallax.options.mirrorTop + + "px, 0px)"; + mirror.style.visibility = Parallax.options.visibility; + mirror.style.height = Parallax.options.boxHeight + "px"; + mirror.style.width = Parallax.options.boxWidth + "px"; + + slider.style.transform = + "translate3d(" + + Parallax.options.offsetLeft + + "px, " + + Parallax.options.offsetTop + + "px, 0px)"; + slider.style.position = "absolute"; + slider.style.height = Parallax.options.imageHeight + "px"; + slider.style.width = Parallax.options.imageWidth + "px"; + slider.style.maxWidth = "none"; +}; +Parallax.update = () => { + if (!Parallax.mirrors) { + return + } + Parallax.mirrors.forEach((e) => { + Parallax.refreshItem(e.slider); + Parallax.renderItem(e.mirror, e.slider); + }); +}; diff --git a/themes/volantis/source/js/plugins/rightMenus.js b/themes/volantis/source/js/plugins/rightMenus.js new file mode 100755 index 0000000..3389c3f --- /dev/null +++ b/themes/volantis/source/js/plugins/rightMenus.js @@ -0,0 +1,618 @@ + +const RightMenus = { + defaultEvent: ['copyText', 'copyLink', 'copyPaste', 'copyAll', 'copyCut', 'copyImg', 'printMode', 'readMode'], + defaultGroup: ['navigation', 'inputBox', 'seletctText', 'elementCheck', 'elementImage', 'articlePage'], + messageRightMenu: volantis.GLOBAL_CONFIG.plugins.message.enable && volantis.GLOBAL_CONFIG.plugins.message.rightmenu.enable, + corsAnywhere: volantis.GLOBAL_CONFIG.plugins.rightmenus.options.corsAnywhere, + urlRegx: /^((https|http)?:\/\/)+[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/, + imgRegx: /\.(jpe?g|png|webp|svg|gif|jifi)(-|_|!|\?|\/)?.*$/, + + /** + * 加载右键菜单 + */ + initialMenu: () => { + RightMenus.fun.init(); + }, + + /** + * 读取剪切板 + * @returns text + */ + readClipboard: async () => { + let clipboardText; + const result = await navigator.permissions.query({ name: 'clipboard-read' }); + switch (result.state) { + case 'granted': + case 'prompt': + clipboardText = await navigator.clipboard.readText() + break; + default: + window.clipboardRead = false; + break; + } + return clipboardText; + }, + + /** + * 写入文本到剪切板 + * @param {String} text + */ + writeClipText: text => { + return navigator.clipboard + .writeText(text) + .then(() => { + return Promise.resolve() + }) + .catch(err => { + return Promise.reject(err) + }) + }, + + /** + * 写入图片到剪切板 + * @param {*} link + * @param {*} success + * @param {*} error + */ + writeClipImg: async (link, success, error) => { + const image = new Image; + image.crossOrigin = "Anonymous"; + image.addEventListener('load', () => { + let canvas = document.createElement("canvas"); + let context = canvas.getContext("2d"); + canvas.width = image.width; + canvas.height = image.height; + context.drawImage(image, 0, 0); + canvas.toBlob(blob => { + navigator.clipboard.write([ + new ClipboardItem({ 'image/png': blob }) + ]).then(e => { + success(e) + }).catch(e => { + error(e) + }) + }, 'image/png') + }, false) + image.src = `${link}?(lll¬ω¬)`; + }, + + /** + * 粘贴文本到剪切板 + * @param {*} elemt + * @param {*} value + */ + insertAtCaret: (elemt, value) => { + const startPos = elemt.selectionStart, + endPos = elemt.selectionEnd; + if (document.selection) { + elemt.focus(); + var sel = document.selection.createRange(); + sel.text = value; + elemt.focus(); + } else { + if (startPos || startPos == '0') { + var scrollTop = elemt.scrollTop; + elemt.value = elemt.value.substring(0, startPos) + value + elemt.value.substring(endPos, elemt.value.length); + elemt.focus(); + elemt.selectionStart = startPos + value.length; + elemt.selectionEnd = startPos + value.length; + elemt.scrollTop = scrollTop; + } else { + elemt.value += value; + elemt.focus(); + } + } + } +} + +/** + * 事件处理区域 + */ +RightMenus.fun = (() => { + const rightMenuConfig = volantis.GLOBAL_CONFIG.plugins.rightmenus; + + const + fn = {}, + _rightMenuWrapper = document.getElementById('rightmenu-wrapper'), + _rightMenuContent = document.getElementById('rightmenu-content'), + _rightMenuList = document.querySelectorAll('#rightmenu-content li.menuLoad-Content'), + _rightMenuListWithHr = document.querySelectorAll('#rightmenu-content li, #rightmenu-content hr, #menuMusic'), + _readBkg = document.getElementById('read_bkg'), + _menuMusic = document.getElementById('menuMusic'), + _backward = document.querySelector('#menuMusic .backward'), + _toggle = document.querySelector('#menuMusic .toggle'), + _forward = document.querySelector('#menuMusic .forward'); + + // 公共数据 + let globalData = { + mouseEvent: null, + isInputBox: false, + selectText: '', + inputValue: '', + isLink: false, + linkUrl: '', + isMediaLink: false, + mediaLinkUrl: '', + isImage: false, + isArticle: false, + pathName: '', + isReadClipboard: true, + isShowMusic: false, + statusCheck: false + } + const globalDataBackup = Object.assign({}, globalData); + + /** + * 初始化监听事件处理 + */ + fn.initEvent = () => { + fn.elementAppend(); + fn.contextmenu(); + fn.menuEvent(); + } + + /** + * 预置元素设定 + */ + fn.elementAppend = () => { + // 阅读模式 + if (_readBkg) _readBkg.parentNode.removeChild(_readBkg); + const readBkg = document.createElement("div"); + readBkg.className = "common_read_bkg common_read_hide"; + readBkg.id = "read_bkg"; + window.document.body.appendChild(readBkg); + } + + /** + * 右键菜单位置设定 + * @param {*} event + */ + fn.menuPosition = (event) => { + try { + let mouseClientX = event.clientX; + let mouseClientY = event.clientY; + let screenWidth = document.documentElement.clientWidth || document.body.clientWidth; + let screenHeight = document.documentElement.clientHeight || document.body.clientHeight; + + _rightMenuWrapper.style.display = 'block'; + fn.menuControl(event); + + let menuWidth = _rightMenuContent.offsetWidth; + let menuHeight = _rightMenuContent.offsetHeight; + let showLeft = mouseClientX + menuWidth > screenWidth ? mouseClientX - menuWidth + 10 : mouseClientX; + let showTop = mouseClientY + menuHeight > screenHeight ? mouseClientY - menuHeight + 10 : mouseClientY; + showTop = mouseClientY + menuHeight > screenHeight && showTop < menuHeight && mouseClientY < menuHeight ? + showTop + (screenHeight - menuHeight - showTop - 10) : showTop; + _rightMenuWrapper.style.left = `${showLeft}px`; + _rightMenuWrapper.style.top = `${showTop}px`; + if (volantis.GLOBAL_CONFIG.plugins.message.rightmenu.notice) fn.menuNotic(); + } catch (error) { + console.error(error); + fn.hideMenu(); + return true; + } + return false; + } + + /** + * 菜单项控制 + * @param {*} event + */ + fn.menuControl = (event) => { + fn.globalDataSet(event); + if (!!_menuMusic) _menuMusic.style.display = globalData.isShowMusic ? 'block' : 'none'; + _rightMenuList.forEach(item => { + item.style.display = 'none'; + const nodeName = item.firstElementChild.nodeName; + const groupName = item.firstElementChild.getAttribute('data-group'); + const itemEvent = item.firstElementChild.getAttribute('data-event'); + if (globalData.statusCheck || globalData.isArticle) { + switch (groupName) { + case 'inputBox': + if (globalData.isInputBox) { + item.style.display = 'block'; + if (itemEvent === 'copyCut' && !globalData.selectText) item.style.display = 'none'; + if (itemEvent === 'copyAll' && !globalData.inputValue) item.style.display = 'none'; + if (itemEvent === 'copyPaste' && !globalData.isReadClipboard) item.style.display = 'none'; + } + break; + case 'seletctText': + if (!!globalData.selectText) item.style.display = 'block'; + break; + case 'elementCheck': + if (globalData.isLink || globalData.isMediaLink) item.style.display = 'block'; + break; + case 'elementImage': + if (globalData.isImage) item.style.display = 'block'; + break; + case 'articlePage': + if (globalData.isArticle) item.style.display = 'block'; + break; + default: + item.style.display = nodeName === 'A' + ? globalData.isArticle && !globalData.statusCheck && rightMenuConfig.options.articleShowLink + ? 'block' + : 'none' + : 'block'; + break; + } + } else if (nodeName === 'A' || RightMenus.defaultGroup.every(item => { return groupName !== item })) { + item.style.display = 'block'; + } + }) + + // 执行外部事件 + volantis.mouseEvent = event; + volantis.rightmenu.method.handle.start() + + // 过滤 HR 元素 + let elementHrItem = { item: null, hide: true }; + _rightMenuListWithHr.forEach((item) => { + if (item.nodeName === "HR") { + item.style.display = 'block'; + if (!elementHrItem.item) { + elementHrItem.item = item; + return; + } + if (elementHrItem.hide || elementHrItem.item.nextElementSibling.nodeName === "hr") { + elementHrItem.item.style.display = 'none'; + } + elementHrItem.item = item; + elementHrItem.hide = true; + } else { + if (item.style.display === 'block' && elementHrItem.hide) { + elementHrItem.hide = false; + } + } + }) + if (!!elementHrItem.item && elementHrItem.hide) elementHrItem.item.style.display = 'none'; + } + + /** + * 元素状态判断/全局数据设置 + * @param {*} event + */ + fn.globalDataSet = (event) => { + globalData = Object.assign({}, globalDataBackup); + globalData.mouseEvent = event; + globalData.selectText = window.getSelection().toString(); + + // 判断是否为输入框 + if (event.target.tagName.toLowerCase() === 'input' || event.target.tagName.toLowerCase() === 'textarea') { + globalData.isInputBox = true; + globalData.inputValue = event.target.value; + } + + // 判断是否允许读取剪切板 + if (globalData.isInputBox && window.clipboardRead === false) { + globalData.isReadClipboard = false; + } + + // 判断是否包含链接 + if (!!event.target.href && RightMenus.urlRegx.test(event.target.href)) { + globalData.isLink = true; + globalData.linkUrl = event.target.href; + } + + // 判断是否包含媒体链接 + if (!!event.target.currentSrc && RightMenus.urlRegx.test(event.target.currentSrc)) { + globalData.isMediaLink = true; + globalData.mediaLinkUrl = event.target.currentSrc; + } + + // 判断是否为图片地址 + if (globalData.isMediaLink && RightMenus.imgRegx.test(globalData.mediaLinkUrl)) { + globalData.isImage = true; + } + + // 判断是否为文章页面 + if (!!(document.querySelector('#post.article') || null)) { + globalData.isArticle = true; + globalData.pathName = window.location.pathname; + } + + // 判断是否显示音乐控制器 + if (volantis.GLOBAL_CONFIG.plugins.aplayer?.enable + && typeof RightMenuAplayer !== 'undefined' + && RightMenuAplayer.APlayer.player !== undefined) { + if (rightMenuConfig.options.musicAlwaysShow + || RightMenuAplayer.APlayer.status === 'play' + || RightMenuAplayer.APlayer.status === 'undefined') { + globalData.isShowMusic = true; + } + } + + // 设定校验状态 + if (!!globalData.selectText || globalData.isInputBox || globalData.isLink || globalData.isMediaLink) { + globalData.statusCheck = true; + } + } + + /** + * 全局右键监听函数 + */ + fn.contextmenu = () => { + window.document.oncontextmenu = (event) => { + if (event.ctrlKey || document.body.offsetWidth <= 500) { + fn.hideMenu(); + return true; + } + return fn.menuPosition(event); + } + + _rightMenuWrapper.oncontextmenu = (event) => { + event.stopPropagation(); + event.preventDefault(); + return false; + } + + window.removeEventListener('blur', fn.hideMenu); + window.addEventListener('blur', fn.hideMenu); + document.body.removeEventListener('click', fn.hideMenu); + document.body.addEventListener('click', fn.hideMenu); + } + + /** + * 菜单项事件处理函数 + */ + fn.menuEvent = () => { + _rightMenuList.forEach(item => { + let eventName = item.firstElementChild.getAttribute('data-event'); + const id = item.firstElementChild.getAttribute('id'); + const groupName = item.firstElementChild.getAttribute('data-group'); + if (item.firstElementChild.nodeName === "A") return; + item.addEventListener('click', () => { + try { + if (RightMenus.defaultEvent.every(item => { return eventName !== item })) { + if (groupName === 'seletctText') { + RightMenusFunction[id](globalData.selectText) + } else if (groupName === 'elementCheck') { + RightMenusFunction[id](globalData.isLink ? globalData.linkUrl : globalData.mediaLinkUrl) + } else if (groupName === 'elementImage') { + RightMenusFunction[id](globalData.mediaLinkUrl) + } else { + RightMenusFunction[id]() + } + } else { + fn[eventName]() + } + } catch (error) { + if (volantis.GLOBAL_CONFIG.debug === "rightMenus") { + console.error({ + id: id, + error: error, + globalData: globalData, + groupName: groupName, + eventName: eventName + }); + } + if (RightMenus.messageRightMenu) { + VolantisApp.message('错误提示', error, { + icon: rightMenuConfig.options.iconPrefix + ' fa-exclamation-square red', + time: '15000' + }); + } + } + }) + }) + + if (_forward && _toggle && _forward) { + _backward.onclick = (e) => { + e.preventDefault(); + e.stopPropagation(); + RightMenuAplayer.aplayerBackward(); + } + _toggle.onclick = (e) => { + e.preventDefault(); + e.stopPropagation(); + RightMenuAplayer.aplayerToggle(); + } + _forward.onclick = (e) => { + e.preventDefault(); + e.stopPropagation(); + RightMenuAplayer.aplayerForward(); + } + } + } + + /** + * 隐藏菜单显示 + */ + fn.hideMenu = () => { + _rightMenuWrapper.style.display = null; + _rightMenuWrapper.style.left = null; + _rightMenuWrapper.style.top = null; + } + + /** + * 右键菜单覆盖提示 + */ + fn.menuNotic = () => { + const NoticeRightMenu = localStorage.getItem('NoticeRightMenu') === 'true'; + if (RightMenus.messageRightMenu && !NoticeRightMenu) + VolantisApp.message('右键菜单', '唤醒原系统菜单请使用:Ctrl + 右键', { + icon: rightMenuConfig.options.iconPrefix + ' fa-exclamation-square red', + displayMode: 1, + time: 9000 + }, () => { + localStorage.setItem('NoticeRightMenu', 'true') + }); + } + + fn.copyText = () => { + VolantisApp.utilWriteClipText(globalData.selectText) + .then(() => { + if (RightMenus.messageRightMenu) { + VolantisApp.messageCopyright(); + } + }).catch(e => { + if (RightMenus.messageRightMenu) { + VolantisApp.message('系统提示', e, { + icon: rightMenuConfig.options.iconPrefix + ' fa-exclamation-square red', + displayMode: 1, + time: 9000 + }); + } + }) + } + + fn.copyLink = () => { + VolantisApp.utilWriteClipText(globalData.linkUrl || globalData.mediaLinkUrl) + .then(() => { + if (RightMenus.messageRightMenu) { + VolantisApp.messageCopyright(); + } + }).catch(e => { + if (RightMenus.messageRightMenu) { + VolantisApp.message('系统提示', e, { + icon: rightMenuConfig.options.iconPrefix + ' fa-exclamation-square red', + displayMode: 1, + time: 9000 + }); + } + }) + } + + fn.copyAll = () => { + globalData.mouseEvent.target.select(); + } + + fn.copyPaste = async () => { + const result = await RightMenus.readClipboard() || ''; + if (RightMenus.messageRightMenu && window.clipboardRead === false) { + VolantisApp.message('系统提示', '未授予剪切板读取权限!'); + } else if (RightMenus.messageRightMenu && result === '') { + VolantisApp.message('系统提示', '仅支持复制文本内容!'); + } else { + RightMenus.insertAtCaret(globalData.mouseEvent.target, result); + } + } + + fn.copyCut = () => { + const statrPos = globalData.mouseEvent.target.selectionStart; + const endPos = globalData.mouseEvent.target.selectionEnd; + const inputStr = globalData.inputValue; + fn.copyText(globalData.selectText); + globalData.mouseEvent.target.value = inputStr.substring(0, statrPos) + inputStr.substring(endPos, inputStr.length); + globalData.mouseEvent.target.selectionStart = statrPos; + globalData.mouseEvent.target.selectionEnd = statrPos; + globalData.mouseEvent.target.focus(); + } + + fn.copyImg = () => { + if (volantis.GLOBAL_CONFIG.plugins.message.rightmenu.notice) { + VolantisApp.message('系统提示', '复制中,请等待。', { + icon: rightMenuConfig.options.iconPrefix + ' fa-images' + }) + } + RightMenus.writeClipImg(globalData.mediaLinkUrl, e => { + if (RightMenus.messageRightMenu) { + VolantisApp.hideMessage(); + VolantisApp.message('系统提示', '图片复制成功!', { + icon: rightMenuConfig.options.iconPrefix + ' fa-images' + }); + } + }, (e) => { + console.error(e); + if (RightMenus.messageRightMenu) { + VolantisApp.hideMessage(); + VolantisApp.message('系统提示', '复制失败:' + e, { + icon: rightMenuConfig.options.iconPrefix + ' fa-exclamation-square red', + time: 9000 + }); + } + }) + } + + fn.printMode = () => { + if (window.location.pathname === globalData.pathName) { + if (RightMenus.messageRightMenu) { + const message = '是否打印当前页面?
              建议打印时勾选背景图形
              ' + VolantisApp.question('', message, { time: 9000 }, () => { fn.printHtml() }) + } else { + fn.printHtml() + } + } + } + + fn.printHtml = () => { + if (volantis.isReadModel) fn.readMode(); + DOMController.setAttribute('details', 'open', 'true'); + DOMController.removeList([ + '.cus-article-bkg', '.iziToast-overlay', '.iziToast-wrapper', '.prev-next', + 'footer', '#l_header', '#l_cover', '#l_side', '#comments', '#s-top', '#BKG', + '#rightmenu-wrapper', '.nav-tabs', '.parallax-mirror', '.new-meta-item.share', + '.new-meta-box', 'button.btn-copy', 'iframe' + ]); + DOMController.setStyleList([ + ['body', 'backgroundColor', 'unset'], ['#l_main, .copyright.license', 'width', '100%'], + ['#post', 'boxShadow', 'none'], ['#post', 'background', 'none'], ['#post', 'padding', '0'], + ['h1', 'textAlign', 'center'], ['h1', 'fontWeight', '600'], ['h1', 'fontSize', '2rem'], ['h1', 'marginBottom', '20px'], + ['.tab-pane', 'display', 'block'], ['.tab-content', 'borderTop', 'none'], ['.highlight>table pre', 'whiteSpace', 'pre-wrap'], + ['.highlight>table pre', 'wordBreak', 'break-all'], ['.fancybox img', 'height', 'auto'], ['.fancybox img', 'weight', 'auto'], + ['.copyright.license', 'margin', '0'], ['.copyright.license', 'padding', '1.25em 20px'], + ['figure.highlight, .copyright.license', 'display', 'inline-block'], + ]); + setTimeout(() => { + window.print(); + document.body.innerHTML = ''; + window.location.reload(); + }, 50); + } + + fn.readMode = () => { + if (typeof ScrollReveal === 'function') ScrollReveal().clean('#comments'); + DOMController.setStyle('#l_header', 'opacity', 0); + DOMController.fadeToggleList([ + document.querySelector('#l_cover'), document.querySelector('footer'), + document.querySelector('#s-top'), document.querySelector('.article-meta#bottom'), + document.querySelector('.prev-next'), document.querySelector('#l_side'), + document.querySelector('#comments'), + ]); + DOMController.toggleClassList([ + [document.querySelector('#l_main'), 'common_read'], [document.querySelector('#l_main'), 'common_read_main'], + [document.querySelector('#l_body'), 'common_read'], [document.querySelector('#safearea'), 'common_read'], + [document.querySelector('#read_bkg'), 'common_read_hide'], + [document.querySelector('h1'), 'common_read_h1'], [document.querySelector('#post'), 'post_read'], + [document.querySelector('#l_cover'), 'read_cover'], [document.querySelector('.widget.toc-wrapper'), 'post_read'] + ]); + DOMController.setStyle('.copyright.license', 'margin', '15px 0'); + volantis.isReadModel = volantis.isReadModel === undefined ? true : !volantis.isReadModel; + if (volantis.isReadModel) { + if (RightMenus.messageRightMenu) VolantisApp.message('系统提示', '阅读模式已开启,您可以点击屏幕空白处退出。', { + backgroundColor: 'var(--color-read-post)', + icon: rightMenuConfig.options.iconPrefix + ' fa-book-reader', + displayMode: 1, + time: 5000 + }); + document.querySelector('#l_body').removeEventListener('click', fn.readMode); + document.querySelector('#l_body').addEventListener('click', (event) => { + if (DOMController.hasClass(event.target, 'common_read')) { + fn.readMode(); + } + }); + } else { + document.querySelector('#l_body').removeEventListener('click', fn.readMode); + document.querySelector('#post').removeEventListener('click', fn.readMode); + DOMController.setStyle('.prev-next', 'display', 'flex'); + DOMController.setStyle('.copyright.license', 'margin', '15px -40px'); + } + } + + return { + init: fn.initEvent, + hideMenu: fn.hideMenu, + readMode: fn.readMode + } +})() + +Object.freeze(RightMenus); +volantis.requestAnimationFrame(() => { + if (document.readyState !== 'loading') { + RightMenus.initialMenu(); + } else { + document.addEventListener("DOMContentLoaded", function () { + RightMenus.initialMenu(); + }) + } +}); diff --git a/themes/volantis/source/js/plugins/tags/contributors.js b/themes/volantis/source/js/plugins/tags/contributors.js new file mode 100755 index 0000000..1d2ae32 --- /dev/null +++ b/themes/volantis/source/js/plugins/tags/contributors.js @@ -0,0 +1,89 @@ +const ContributorsJS = { + requestAPI: (url, callback, timeout) => { + let retryTimes = 5; + + function request() { + return new Promise((resolve, reject) => { + let status = 0; // 0 等待 1 完成 2 超时 + let timer = setTimeout(() => { + if (status === 0) { + status = 2; + timer = null; + reject('请求超时'); + if (retryTimes == 0) { + timeout(); + } + } + }, 5000); + fetch(url).then(function (response) { + if (status !== 2) { + clearTimeout(timer); + resolve(response); + timer = null; + status = 1; + } + if (response.ok) { + return response.json(); + } + throw new Error('Network response was not ok.'); + }).then(function (data) { + retryTimes = 0; + callback(data); + }).catch(function (error) { + if (retryTimes > 0) { + retryTimes -= 1; + setTimeout(() => { + request(); + }, 5000); + } else { + timeout(); + } + }); + }); + } + request(); + }, + layout: (cfg) => { + const el = cfg.el; + ContributorsJS.requestAPI(cfg.api, function (data) { + el.querySelector('.loading-wrap').remove(); + var cellALL = ""; + (data || []).forEach((item, i) => { + var user = ''; + cellALL += user; + }); + el.querySelector('.group-body').innerHTML = cellALL; + }, function () { + try { + el.querySelector('.loading-wrap svg').remove(); + el.querySelector('.loading-wrap p').innerText('加载失败,请稍后重试。'); + } catch (e) { } + }); + }, + start: () => { + const els = document.getElementsByClassName('contributorsjs-wrap'); + for (var i = 0; i < els.length; i++) { + const el = els[i]; + const api = el.getAttribute('api'); + if (api == null) { + continue; + } + var cfg = new Object(); + cfg.el = el; + cfg.api = api; + cfg.class = el.getAttribute('class'); + cfg.avatar = volantis.GLOBAL_CONFIG.default.avatar; + ContributorsJS.layout(cfg); + } + } +} + + + +ContributorsJS.start(); \ No newline at end of file diff --git a/themes/volantis/source/js/plugins/tags/friends.js b/themes/volantis/source/js/plugins/tags/friends.js new file mode 100755 index 0000000..41870dd --- /dev/null +++ b/themes/volantis/source/js/plugins/tags/friends.js @@ -0,0 +1,90 @@ +const FriendsJS = { + requestAPI: (url, callback, timeout) => { + let retryTimes = 5; + + function request() { + return new Promise((resolve, reject) => { + let status = 0; // 0 等待 1 完成 2 超时 + let timer = setTimeout(() => { + if (status === 0) { + status = 2; + timer = null; + reject('请求超时'); + if (retryTimes == 0) { + timeout(); + } + } + }, 5000); + fetch(url).then(function (response) { + if (status !== 2) { + clearTimeout(timer); + resolve(response); + timer = null; + status = 1; + } + if (response.ok) { + return response.json(); + } + throw new Error('Network response was not ok.'); + }).then(function (data) { + retryTimes = 0; + callback(data); + }).catch(function (error) { + if (retryTimes > 0) { + retryTimes -= 1; + setTimeout(() => { + request(); + }, 5000); + } else { + timeout(); + } + }); + }); + } + request(); + }, + layout: (cfg) => { + const el = cfg.el; + FriendsJS.requestAPI(cfg.api, function (data) { + el.querySelector('.loading-wrap').remove(); + const arr = data.content; + var cellALL = ""; + arr.forEach((item, i) => { + var user = ''; + cellALL += user; + }); + el.querySelector('.group-body').innerHTML = cellALL; + }, function () { + try { + el.querySelector('.loading-wrap svg').remove(); + el.querySelector('.loading-wrap p').innerText('加载失败,请稍后重试。'); + } catch (e) { } + }); + }, + start: () => { + const els = document.getElementsByClassName('friendsjs-wrap'); + for (var i = 0; i < els.length; i++) { + const el = els[i]; + const api = el.getAttribute('api'); + if (api == null) { + continue; + } + var cfg = new Object(); + cfg.el = el; + cfg.api = api; + cfg.class = el.getAttribute('class'); + cfg.avatar = volantis.GLOBAL_CONFIG.default.avatar; + FriendsJS.layout(cfg); + } + } +} + + + +FriendsJS.start(); \ No newline at end of file diff --git a/themes/volantis/source/js/plugins/tags/sites.js b/themes/volantis/source/js/plugins/tags/sites.js new file mode 100755 index 0000000..1a95ee9 --- /dev/null +++ b/themes/volantis/source/js/plugins/tags/sites.js @@ -0,0 +1,93 @@ +const SitesJS = { + requestAPI: (url, callback, timeout) => { + let retryTimes = 5; + + function request() { + return new Promise((resolve, reject) => { + let status = 0; // 0 等待 1 完成 2 超时 + let timer = setTimeout(() => { + if (status === 0) { + status = 2; + timer = null; + reject('请求超时'); + if (retryTimes == 0) { + timeout(); + } + } + }, 5000); + fetch(url).then(function (response) { + if (status !== 2) { + clearTimeout(timer); + resolve(response); + timer = null; + status = 1; + } + if (response.ok) { + return response.json(); + } + throw new Error('Network response was not ok.'); + }).then(function (data) { + retryTimes = 0; + callback(data); + }).catch(function (error) { + if (retryTimes > 0) { + retryTimes -= 1; + setTimeout(() => { + request(); + }, 5000); + } else { + timeout(); + } + }); + }); + } + request(); + }, + layout: (cfg) => { + const el = cfg.el; + SitesJS.requestAPI(cfg.api, function (data) { + el.querySelector('.loading-wrap').remove(); + const arr = data.content; + var cellALL = ""; + arr.forEach((item, i) => { + var cell = ''; + cellALL += cell; + }); + el.querySelector('.group-body').innerHTML = cellALL; + }, function () { + try { + el.querySelector('.loading-wrap svg').remove(); + el.querySelector('.loading-wrap p').innerText('加载失败,请稍后重试。'); + } catch (e) { } + }); + }, + start: (cfg) => { + const els = document.getElementsByClassName('sitesjs-wrap'); + for (var i = 0; i < els.length; i++) { + const el = els[i]; + const api = el.getAttribute('api'); + if (api == null) { + continue; + } + var cfg = new Object(); + cfg.class = el.getAttribute('class'); + cfg.el = el; + cfg.api = api; + cfg.avatar = volantis.GLOBAL_CONFIG.default.link; + cfg.screenshot = volantis.GLOBAL_CONFIG.default.cover; + SitesJS.layout(cfg); + } + } +} + + +SitesJS.start(); \ No newline at end of file diff --git a/themes/volantis/source/js/search/algolia.js b/themes/volantis/source/js/search/algolia.js new file mode 100755 index 0000000..19408e7 --- /dev/null +++ b/themes/volantis/source/js/search/algolia.js @@ -0,0 +1,235 @@ +let SearchService = (() => { + const fn = {}; + let search, algolia, timerId; + fn.queryText = null; + fn.template = ` + `; + + fn.init = () => { + let div = document.createElement("div"); + div.innerHTML += fn.template; + document.body.append(div); + + algolia = volantis.GLOBAL_CONFIG.search; + if (algolia.appId && algolia.apiKey && algolia.indexName) { + fn.event(); + fn.setAlgolia(); + } else { + document.querySelector('#u-search main.modal-body').innerHTML = 'Algolia setting is invalid!'; + document.querySelector('#u-search main.modal-body').style.textAlign = 'center'; + document.querySelector('#u-search .modal').style.maxHeight = '128px'; + } + } + + fn.event = () => { + document + .querySelector("#u-search-btn-close") + .addEventListener("click", fn.close, false); + document + .querySelector("#modal-overlay") + .addEventListener("click", fn.close, false); + document.querySelectorAll(".u-search-form").forEach((e) => { + e.addEventListener("submit", fn.onSubmit, false); + }); + document.querySelector("#algolia-search-input").addEventListener("input", event => { + let input = event.target.querySelector(".ais-SearchBox-input"); + if (input) { + fn.queryText = input.value; + } else { + fn.queryText = event.target.value; + } + }) + } + + fn.setAlgolia = () => { + search = instantsearch({ + indexName: algolia.indexName, + searchClient: algoliasearch(algolia.appId, algolia.apiKey), + searchFunction(helper) { + helper.state.query && helper.search() + }, + }) + + const configure = instantsearch.widgets.configure({ + hitsPerPage: algolia.hitsPerPage + }) + + const searchBox = instantsearch.widgets.searchBox({ + container: '#algolia-search-input', + autofocus: true, + showReset: false, + showSubmit: false, + showLoadingIndicator: false, + searchAsYouType: algolia.searchAsYouType, + placeholder: algolia.placeholder, + templates: { + input: 'algolia-input' + }, + queryHook(query, refine) { + clearTimeout(timerId) + timerId = setTimeout(() => refine(query), 500) + } + }) + + const hits = instantsearch.widgets.hits({ + container: '#algolia-hits', + templates: { + item(data) { + const keyword = !!fn.queryText ? `?keyword=${fn.queryText}` : '' + const link = data.permalink ? data.permalink : `${volantis.GLOBAL_CONFIG.root}${data.path}` + const result = data._highlightResult + const content = result.contentStripTruncate + ? fn.cutContent(result.contentStripTruncate.value) + : result.contentStrip + ? fn.cutContent(result.contentStrip.value) + : result.content + ? fn.cutContent(result.content.value) + : '' + return ` + + ${result.title.value || 'no-title'} + ${content} + ` + }, + empty: function (data) { + return ( + `

              ${volantis.GLOBAL_CONFIG.languages.search.hits_empty.replace(/\$\{query}/, data.query)}

              ` + ) + } + } + }) + + const stats = instantsearch.widgets.stats({ + container: '#algolia-info > .algolia-stats', + templates: { + text: function (data) { + const stats = volantis.GLOBAL_CONFIG.languages.search.hits_stats + .replace(/\$\{hits}/, data.nbHits) + .replace(/\$\{time}/, data.processingTimeMS) + return ( + `${stats}` + ) + } + } + }) + + const powerBy = instantsearch.widgets.poweredBy({ + container: '#algolia-info > .algolia-poweredBy', + theme: volantis.dark?.mode === 'dark' ? 'dark' : 'light' + }) + + const pagination = instantsearch.widgets.pagination({ + container: '#algolia-pagination', + totalPages: 5, + templates: { + first: '', + last: '', + previous: '', + next: '' + } + }) + + search.addWidgets([configure, searchBox, hits, stats, powerBy, pagination]) + + search.start() + + } + + fn.setQueryText = queryText => { + fn.queryText = queryText; + if (!search) { + fn.init() + } + search?.setUiState({ + [algolia.indexName]: { + query: queryText + } + }) + } + + fn.search = () => { + document.querySelector("#u-search").style.display = "block"; + document.addEventListener("keydown", event => { + if (event.code === "Escape") { + fn.close(); + } + }, { once: true }) + } + + fn.onSubmit = (event) => { + event.preventDefault(); + let input = event.target.querySelector(".u-search-input"); + fn.setQueryText(input?.value ? input.value : event.target.value) + fn.search(); + }; + + fn.cutContent = content => { + if (content === '') return '' + + const firstOccur = content.indexOf('') + + let start = firstOccur - 30 + let end = firstOccur + 120 + let pre = '' + let post = '' + + if (start <= 0) { + start = 0 + end = 140 + } else { + pre = '...' + } + + if (end > content.length) { + end = content.length + } else { + post = '...' + } + + let matchContent = pre + content.substring(start, end) + post + return matchContent + } + + fn.close = () => { + document.querySelector("#u-search").style.display = "none"; + }; + + return { + init: fn.init, + setQueryText: queryText => { + fn.setQueryText(queryText); + }, + search: fn.search, + close: fn.close + } +})() + +Object.freeze(SearchService); + +SearchService.init(); diff --git a/themes/volantis/source/js/search/hexo.js b/themes/volantis/source/js/search/hexo.js new file mode 100755 index 0000000..4e80d61 --- /dev/null +++ b/themes/volantis/source/js/search/hexo.js @@ -0,0 +1,193 @@ +let SearchService = (() => { + const fn = {}; + fn.queryText = null; + fn.data = null; + fn.template = ` +`; + fn.init = async () => { + let div = document.createElement("div"); + div.innerHTML += fn.template; + document.body.append(div); + document.querySelectorAll(".u-search-form").forEach((e) => { + e.addEventListener("submit", fn.onSubmit, false); + }); + let uSearchModalInput = document.querySelector("#u-search-modal-input"); + uSearchModalInput.addEventListener("input", fn.onSubmit); + document + .querySelector("#u-search-btn-close") + .addEventListener("click", fn.close, false); + document + .querySelector("#modal-overlay") + .addEventListener("click", fn.close, false); + if (!fn.data) { + fn.data = await fn.fetchData(); + } + }; + fn.onSubmit = (event) => { + event.preventDefault(); + let input = event.target.querySelector(".u-search-input"); + if (input) { + fn.queryText = input.value; + } else { + fn.queryText = event.target.value; + } + + if (fn.queryText) { + fn.search(); + } + }; + fn.search = async () => { + document.querySelectorAll(".u-search-input").forEach((e) => { + e.value = fn.queryText; + }); + document.querySelector("#u-search").style.display = "block"; + if (!fn.data) { + fn.data = await fn.fetchData(); + } + let results = ""; + results += fn.buildResultList(fn.data.pages); + results += fn.buildResultList(fn.data.posts); + if (results === "") { + results = `

              ${volantis.GLOBAL_CONFIG.languages.search.hits_empty.replace(/\$\{query}/, fn.queryText)}

              ` + } + document.querySelector("#u-search .modal-results").innerHTML = results; + document.addEventListener("keydown", function f(event) { + if (event.code === "Escape") { + fn.close(); + document.removeEventListener("keydown", f); + } + }); + }; + fn.close = () => { + document.querySelector("#u-search").style.display = "none"; + }; + fn.fetchData = () => { + return fetch(volantis.GLOBAL_CONFIG.search.dataPath) + .then((response) => response.text()) + .then((res) => { + const data = JSON.parse(res); + // console.log(data); + return data; + }); + }; + fn.buildResultList = (data) => { + let html = ""; + data.forEach((post) => { + if (post.text) { + post.text = post.text.replace(/12345\d*/g, "") // 简易移除代码行号 + } + if (!post.title && post.text) { + post.title = post.text.trim().slice(0, 15) + } + if (fn.contentSearch(post)) { + html += fn.buildResult(post.permalink, post.title, post.digest); + } + }); + return html; + }; + fn.contentSearch = (post) => { + let post_title = post.title.trim().toLowerCase(); + let post_content = post.text.trim().toLowerCase(); + let keywords = fn.queryText + .trim() + .toLowerCase() + .split(/[-\s]+/); + let foundMatch = false; + let index_title = -1; + let index_content = -1; + let first_occur = -1; + if (post_title && post_content) { + keywords.forEach((word, index) => { + index_title = post_title.indexOf(word); + index_content = post_content.indexOf(word); + if (index_title < 0 && index_content < 0) { + foundMatch = false; + } else { + foundMatch = true; + if (index_content < 0) { + index_content = 0; + } + if (index === 0) { + first_occur = index_content; + } + } + if (foundMatch) { + post_content = post.text.trim(); + let start = 0; + let end = 0; + if (first_occur >= 0) { + start = Math.max(first_occur - 40, 0); + end = + start === 0 + ? Math.min(200, post_content.length) + : Math.min(first_occur + 120, post_content.length); + let match_content = post_content.substring(start, end); + keywords.forEach(function (keyword) { + let regS = new RegExp(keyword, "gi"); + match_content = match_content.replace( + regS, + "" + keyword + "" + ); + }); + post.digest = match_content + "......"; + } else { + end = Math.min(200, post_content.length); + post.digest = post_content.trim().substring(0, end); + } + } + }); + } + return foundMatch; + }; + fn.buildResult = (url, title, digest) => { + let result = fn.getUrlRelativePath(url); + let html = ""; + html += "
            • "; + html += + ""; + html += "" + title + ""; + if (digest !== "") html += "" + digest + ""; + html += ""; + html += "
            • "; + return html; + }; + fn.getUrlRelativePath = function (url) { + let arrUrl = url.split("//"); + let start = arrUrl[1].indexOf("/"); + let relUrl = arrUrl[1].substring(start); + if (relUrl.indexOf("?") != -1) { + relUrl = relUrl.split("?")[0]; + } + return relUrl; + }; + return { + init: () => { + fn.init(); + }, + setQueryText: (queryText) => { + fn.queryText = queryText; + }, + search: () => { + fn.search(); + }, + }; +})(); +Object.freeze(SearchService); + +SearchService.init(); diff --git a/themes/volantis/source/js/search/meilisearch.js b/themes/volantis/source/js/search/meilisearch.js new file mode 100755 index 0000000..a0cfb05 --- /dev/null +++ b/themes/volantis/source/js/search/meilisearch.js @@ -0,0 +1,216 @@ +let SearchService = (() => { + const fn = {}; + let search, meilisearch, timerId; + fn.queryText = null; + fn.template = ` + `; + + fn.init = () => { + let div = document.createElement("div"); + div.innerHTML += fn.template; + document.body.append(div); + + meilisearch = volantis.GLOBAL_CONFIG.search; + if (meilisearch.appId && meilisearch.apiKey && meilisearch.indexName) { + fn.event(); + fn.setAlgolia(); + } else { + document.querySelector('#u-search main.modal-body').innerHTML = 'Algolia setting is invalid!'; + document.querySelector('#u-search main.modal-body').style.textAlign = 'center'; + document.querySelector('#u-search .modal').style.maxHeight = '128px'; + } + } + + fn.event = () => { + document + .querySelector("#u-search-btn-close") + .addEventListener("click", fn.close, false); + document + .querySelector("#modal-overlay") + .addEventListener("click", fn.close, false); + document.querySelectorAll(".u-search-form").forEach((e) => { + e.addEventListener("submit", fn.onSubmit, false); + }); + document.querySelector("#meilisearch-search-input").addEventListener("input", event => { + let input = event.target.querySelector(".ais-SearchBox-input"); + if (input) { + fn.queryText = input.value; + } else { + fn.queryText = event.target.value; + } + }) + } + + fn.setAlgolia = () => { + search = instantsearch({ + indexName: meilisearch.indexName, + searchClient: instantMeiliSearch(meilisearch.appId, meilisearch.apiKey), + searchFunction(helper) { + helper.state.query && helper.search() + }, + }) + + const configure = instantsearch.widgets.configure({ + hitsPerPage: meilisearch.hitsPerPage + }) + + const searchBox = instantsearch.widgets.searchBox({ + container: '#meilisearch-search-input', + autofocus: true, + showReset: false, + showSubmit: false, + showLoadingIndicator: false, + searchAsYouType: meilisearch.searchAsYouType, + placeholder: meilisearch.placeholder, + templates: { + input: 'meilisearch-input' + }, + queryHook(query, refine) { + clearTimeout(timerId) + timerId = setTimeout(() => refine(query), 500) + } + }) + + const hits = instantsearch.widgets.hits({ + container: '#meilisearch-hits', + templates: { + item(data) { + const keyword = !!fn.queryText ? `?keyword=${fn.queryText}` : '' + const link = data.permalink ? data.permalink : `${volantis.GLOBAL_CONFIG.root}${data.path}` + const result = data._highlightResult + const content = fn.cutContent(result.text.value) + return ` + + ${result.title.value || 'no-title'} + ${content} + ` + }, + empty: function (data) { + return ( + `

              ${volantis.GLOBAL_CONFIG.languages.search.hits_empty.replace(/\$\{query}/, data.query)}

              ` + ) + } + } + }) + + const stats = instantsearch.widgets.stats({ + container: '#meilisearch-info > .meilisearch-stats', + templates: { + text: function (data) { + const stats = volantis.GLOBAL_CONFIG.languages.search.hits_stats + .replace(/\$\{hits}/, data.nbHits) + .replace(/\$\{time}/, data.processingTimeMS) + return ( + `${stats}` + ) + } + } + }) + + search.addWidgets([searchBox, hits, stats]) + + search.start() + + } + + fn.setQueryText = queryText => { + fn.queryText = queryText; + if (!search) { + fn.init() + } + search?.setUiState({ + [meilisearch.indexName]: { + query: queryText + } + }) + } + + fn.search = () => { + document.querySelector("#u-search").style.display = "block"; + document.addEventListener("keydown", event => { + if (event.code === "Escape") { + fn.close(); + } + }, { once: true }) + } + + fn.onSubmit = (event) => { + event.preventDefault(); + let input = event.target.querySelector(".u-search-input"); + fn.setQueryText(input?.value ? input.value : event.target.value) + fn.search(); + }; + + fn.cutContent = content => { + if (content === '') return '' + + const firstOccur = content.indexOf('') + + let start = firstOccur - 30 + let end = firstOccur + 120 + let pre = '' + let post = '' + + if (start <= 0) { + start = 0 + end = 140 + } else { + pre = '...' + } + + if (end > content.length) { + end = content.length + } else { + post = '...' + } + + let matchContent = pre + content.substring(start, end) + post + return matchContent + } + + fn.close = () => { + document.querySelector("#u-search").style.display = "none"; + }; + + return { + init: fn.init, + setQueryText: queryText => { + fn.setQueryText(queryText); + }, + search: fn.search, + close: fn.close + } +})() + +Object.freeze(SearchService); + +SearchService.init(); diff --git a/yarn.lock b/yarn.lock new file mode 100755 index 0000000..847778b --- /dev/null +++ b/yarn.lock @@ -0,0 +1,1503 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@adobe/css-tools@~4.3.1": + version "4.3.3" + resolved "https://registry.npmmirror.com/@adobe/css-tools/-/css-tools-4.3.3.tgz#90749bde8b89cd41764224f5aac29cd4138f75ff" + integrity sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ== + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.npmmirror.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@types/trusted-types@^2.0.7": + version "2.0.7" + resolved "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" + integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== + +a-sync-waterfall@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz#75b6b6aa72598b497a125e7a2770f14f4c8a1fa7" + integrity sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA== + +abab@^2.0.6: + version "2.0.6" + resolved "https://registry.npmmirror.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +abbrev@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" + integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== + +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.npmmirror.com/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" + integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== + dependencies: + acorn "^8.1.0" + acorn-walk "^8.0.2" + +acorn-walk@^8.0.2: + version "8.3.4" + resolved "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== + dependencies: + acorn "^8.11.0" + +acorn@^8.1.0, acorn@^8.11.0, acorn@^8.8.1: + version "8.14.0" + resolved "https://registry.npmmirror.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== + +agent-base@6: + version "6.0.2" + resolved "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +asap@^2.0.3: + version "2.0.6" + resolved "https://registry.npmmirror.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +async@^3.2.3: + version "3.2.6" + resolved "https://registry.npmmirror.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +basic-auth@~2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" + integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== + dependencies: + safe-buffer "5.1.2" + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +bluebird@^3.5.5, bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.npmmirror.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +chalk@^4.0.2: + version "4.1.2" + resolved "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +command-exists@^1.2.9: + version "1.2.9" + resolved "https://registry.npmmirror.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== + +commander@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +compressible@~2.0.18: + version "2.0.18" + resolved "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.5" + resolved "https://registry.npmmirror.com/compression/-/compression-1.7.5.tgz#fdd256c0a642e39e314c478f6c2cd654edd74c93" + integrity sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q== + dependencies: + bytes "3.1.2" + compressible "~2.0.18" + debug "2.6.9" + negotiator "~0.6.4" + on-headers "~1.0.2" + safe-buffer "5.2.1" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +connect@^3.7.0: + version "3.7.0" + resolved "https://registry.npmmirror.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +cross-spawn@^7.0.3: + version "7.0.6" + resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.npmmirror.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.npmmirror.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +cuid@^2.1.8: + version "2.1.8" + resolved "https://registry.npmmirror.com/cuid/-/cuid-2.1.8.tgz#cbb88f954171e0d5747606c0139fb65c5101eac0" + integrity sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg== + +data-urls@^3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" + integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.3.2: + version "4.4.0" + resolved "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + dependencies: + ms "^2.1.3" + +decimal.js@^10.4.2: + version "10.4.3" + resolved "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@2.0.0, depd@~2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== + dependencies: + webidl-conversions "^7.0.0" + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.npmmirror.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +dompurify@^3.0.3: + version "3.2.3" + resolved "https://registry.npmmirror.com/dompurify/-/dompurify-3.2.3.tgz#05dd2175225324daabfca6603055a09b2382a4cd" + integrity sha512-U1U5Hzc2MO0oW3DF+G9qYN0aT7atAou4AgI0XjWz061nyBPbdxkfdhfy5uMgGn6+oLFCfn44ZGbdDqCzVmlOWA== + optionalDependencies: + "@types/trusted-types" "^2.0.7" + +domutils@^3.1.0: + version "3.2.2" + resolved "https://registry.npmmirror.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" + integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +ejs@^3.1.6: + version "3.1.10" + resolved "https://registry.npmmirror.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" + integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== + dependencies: + jake "^10.8.5" + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + +entities@^4.2.0, entities@^4.5.0: + version "4.5.0" + resolved "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escodegen@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + +esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +fast-equals@^3.0.1: + version "3.0.3" + resolved "https://registry.npmmirror.com/fast-equals/-/fast-equals-3.0.3.tgz#8e6cb4e51ca1018d87dd41982ef92758b3e4197f" + integrity sha512-NCe8qxnZFARSHGztGMZOO/PC1qa5MIFB5Hp66WdzbCRAz8U8US3bx1UTgLS49efBQPcUtO9gf5oVEY8o7y/7Kg== + +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +form-data@^4.0.0: + version "4.0.1" + resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48" + integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@^7.1.6: + version "7.2.3" + resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +graceful-fs@^4.2.10: + version "4.2.11" + resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +hexo-cli@^4.3.2: + version "4.3.2" + resolved "https://registry.npmmirror.com/hexo-cli/-/hexo-cli-4.3.2.tgz#7e7d02da137d9fa461a4356964793c56e92b29e6" + integrity sha512-druJeBgLpG9ncDS5AhBHdAXk0G4CFj8Qes09pApyZ6bR+nJW1JYiDMuilhudaKDdq+1l49jWXVTidkcb7p0Jbw== + dependencies: + abbrev "^2.0.0" + bluebird "^3.7.2" + command-exists "^1.2.9" + hexo-fs "^4.1.1" + hexo-log "^4.0.1" + hexo-util "^3.3.0" + minimist "^1.2.5" + picocolors "^1.0.0" + resolve "^1.20.0" + tildify "^2.0.0" + +hexo-front-matter@^4.2.1: + version "4.2.1" + resolved "https://registry.npmmirror.com/hexo-front-matter/-/hexo-front-matter-4.2.1.tgz#c28ee74f66ab76c98fa73877b5ff7a9cc14161cc" + integrity sha512-sJJI0GNmejYiwBvgnGRKn5V3sbODB4dNPr8jyw2Qp0PRHr4Uuyv8iyxw6WfK3+T7yvzYvJOh+tZ7jnwr2BYARA== + dependencies: + js-yaml "^4.1.0" + +hexo-fs@^4.1.1, hexo-fs@^4.1.3: + version "4.1.3" + resolved "https://registry.npmmirror.com/hexo-fs/-/hexo-fs-4.1.3.tgz#c64c66e230dad4ec08ca21244327aa0aba69218a" + integrity sha512-Q92zQ5PlVDouvSWFLXQoFSTLIUIODikUJs2BfAXQglyOEjN1dOQn1Z5Nimk/7GHof17R5h/uObCQLnZAjzI2tg== + dependencies: + bluebird "^3.7.2" + chokidar "^3.5.3" + graceful-fs "^4.2.10" + hexo-util "^3.0.1" + +hexo-generator-archive@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/hexo-generator-archive/-/hexo-generator-archive-2.0.0.tgz#bd93f17848843bb5bface81103d81f5be1a8b2c9" + integrity sha512-KikJk7dGFbtNHOgqtLFGf5T/S8n1paGp+Gy0KfVDz+HKYhGbXOouyiZkmc3O9KrYt6ja14rmkMhq7KKGtvfehw== + dependencies: + hexo-pagination "3.0.0" + +hexo-generator-category@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/hexo-generator-category/-/hexo-generator-category-2.0.0.tgz#55473d5fafaec1cab7a5d9c0da7b159c0133d65c" + integrity sha512-9OduRBf3WeRDa4BR0kAfRjOVHur7v3fm0NKAwbjUiqULigAdNZVZPO3cHKW2MlBbl/lI5PuWdhQ9zZ99CCCAgQ== + dependencies: + hexo-pagination "3.0.0" + +hexo-generator-index@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/hexo-generator-index/-/hexo-generator-index-3.0.0.tgz#4c9233731e027a6af6491886a4aafe08ffdaffe0" + integrity sha512-83AuNN4cWdLVi//3ugR8E3kR6rrOwhXZt+hOCm1IjtIGj353/GlrtpMHpqZHU5kqipzj4miy9dweVdukXglVWw== + dependencies: + hexo-pagination "3.0.0" + +hexo-generator-tag@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/hexo-generator-tag/-/hexo-generator-tag-2.0.0.tgz#f5a18c92b2f28063a76008b4090a7cea81fbbcc0" + integrity sha512-1px/hF3veEohWDN8jjzchQhaiz+uOStUvvMaBJC9vWOlALh30UFcapL8IrvAwwJZjFRVA+WqGgDRqoQ8+yaaFw== + dependencies: + hexo-pagination "3.0.0" + +hexo-i18n@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/hexo-i18n/-/hexo-i18n-2.0.0.tgz#ec7abc160ffef202524f3ff8076b85d5701c447b" + integrity sha512-dkUXecEtChaQMdTHN4WR13c8GwKqjbSOZPJS9qDqV6Ebnb77Wa/nQzWFckhP0dCps3a9lUQBd8hYGOMbOosiQQ== + dependencies: + sprintf-js "^1.1.2" + +hexo-log@^4.0.1: + version "4.1.0" + resolved "https://registry.npmmirror.com/hexo-log/-/hexo-log-4.1.0.tgz#54b42c250335067b5c60b4137f501607454efda0" + integrity sha512-i2Sgxk8Cgx5viSjq5qW5N/rBFfwoCKQcH8qnnW1fawCapcdEAhIsq+Y3vbrs9bssyDlyU6Vqm4oQmosREaNI7Q== + dependencies: + picocolors "^1.0.0" + +hexo-pagination@3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/hexo-pagination/-/hexo-pagination-3.0.0.tgz#b98b050bbddff25ae646e3d00ad607ac6ae77ea7" + integrity sha512-8oo1iozloZo7TojPVYg4IxL3SJKCBdSJ908fTlIxIK7TWJIKdYnQlW31+12DBJ0NhVZA/lZisPObGF08wT8fKw== + +hexo-renderer-ejs@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/hexo-renderer-ejs/-/hexo-renderer-ejs-2.0.0.tgz#56e0c3de5f6b0e1e68b923c65a7c8bfe9ff715eb" + integrity sha512-qCjE1IdwgDgv65qyb0KMVCwCdSVAkH0vwAe9XihjvaKWkmb9dtt8DgErOdqCXn0HReSyWiEVP2BrLRj3gyHwOQ== + dependencies: + ejs "^3.1.6" + +hexo-renderer-marked@^6.0.0: + version "6.3.0" + resolved "https://registry.npmmirror.com/hexo-renderer-marked/-/hexo-renderer-marked-6.3.0.tgz#be8680ecad9633964a0c26a5f99859247d996aca" + integrity sha512-V/ATcJ+tZHkTJSbScPzzHKmrwVMohU8i9MfuX9jp07Un/NpPtaTP821unP3JPu+O1nNLWMi+3xRbFRdm+8vajw== + dependencies: + dompurify "^3.0.3" + hexo-util "^3.1.0" + jsdom "^20.0.1" + marked "^4.3.0" + +hexo-renderer-stylus@^3.0.0: + version "3.0.1" + resolved "https://registry.npmmirror.com/hexo-renderer-stylus/-/hexo-renderer-stylus-3.0.1.tgz#7ff6f3101fa86ba25de415257be7fa7032e910bc" + integrity sha512-cFm8ZwShBBeFcQwOXc8EK7lIZnSYVD6OJykdL4GBw99hxc4eD5Hlsi32nRzE8sgKv00jhX1s9Da3GVVFMPAVQg== + dependencies: + nib "^1.2.0" + stylus "^0.62.0" + +hexo-server@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/hexo-server/-/hexo-server-3.0.0.tgz#fcc597b29b72ee1f035824c5ebd3d92f7e1adb1c" + integrity sha512-u4s0ty9Aew6jV+a9oMrXBwhrRpUQ0U8PWM/88a5aHgDru58VY81mVrxOFxs788NAsWQ8OvsJtF5m7mnXoRnSIA== + dependencies: + bluebird "^3.5.5" + compression "^1.7.4" + connect "^3.7.0" + mime "^3.0.0" + morgan "^1.9.1" + open "^8.0.9" + picocolors "^1.0.0" + serve-static "^1.14.1" + +hexo-theme-landscape@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/hexo-theme-landscape/-/hexo-theme-landscape-1.0.0.tgz#43a549ebb2bea73196200ee4397feb764131a481" + integrity sha512-bWQJWMqQI78wWiJPQZq5pJBH20TM442ShCaHGRetuEgMraxH0OKxB3NTupJzNEkzEk8DV2yrdizkXdKN6i501A== + +hexo-util@^3.0.1, hexo-util@^3.1.0, hexo-util@^3.3.0: + version "3.3.0" + resolved "https://registry.npmmirror.com/hexo-util/-/hexo-util-3.3.0.tgz#448927fb22e167f2159306666cc2c7e82c777513" + integrity sha512-YvGngXijE2muEh5L/VI4Fmjqb+/yAkmY+VuyhWVoRwQu1X7bmWodsfYRXX7CUYhi5LqsvH8FAe/yBW1+f6ZX4Q== + dependencies: + camel-case "^4.1.2" + cross-spawn "^7.0.3" + deepmerge "^4.2.2" + highlight.js "^11.6.0" + htmlparser2 "^9.0.0" + prismjs "^1.29.0" + strip-indent "^3.0.0" + +hexo@^7.0.0: + version "7.3.0" + resolved "https://registry.npmmirror.com/hexo/-/hexo-7.3.0.tgz#a9a487874c5ed71c22e91e32dd5d825709a1474f" + integrity sha512-dOe8mzBKrvjubW5oBmyhcnQDpC+M2xmAMLae5K+o+SkHxyvAhShkS2VQZoTsOLIJKY6xilv7dzCjCvE7ol/NHQ== + dependencies: + abbrev "^2.0.0" + archy "^1.0.0" + bluebird "^3.7.2" + hexo-cli "^4.3.2" + hexo-front-matter "^4.2.1" + hexo-fs "^4.1.3" + hexo-i18n "^2.0.0" + hexo-log "^4.0.1" + hexo-util "^3.3.0" + js-yaml "^4.1.0" + js-yaml-js-types "^1.0.0" + micromatch "^4.0.4" + moize "^6.1.6" + moment "^2.29.1" + moment-timezone "^0.5.34" + nunjucks "^3.2.3" + picocolors "^1.0.0" + pretty-hrtime "^1.0.3" + resolve "^1.22.0" + strip-ansi "^6.0.0" + text-table "^0.2.0" + tildify "^2.0.0" + titlecase "^1.1.3" + warehouse "^5.0.1" + +highlight.js@^11.6.0: + version "11.11.1" + resolved "https://registry.npmmirror.com/highlight.js/-/highlight.js-11.11.1.tgz#fca06fa0e5aeecf6c4d437239135fabc15213585" + integrity sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w== + +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== + dependencies: + whatwg-encoding "^2.0.0" + +htmlparser2@^9.0.0: + version "9.1.0" + resolved "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-9.1.0.tgz#cdb498d8a75a51f739b61d3f718136c369bc8c23" + integrity sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.1.0" + entities "^4.5.0" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +iconv-lite@0.6.3: + version "0.6.3" + resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.3: + version "2.0.4" + resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.16.0: + version "2.16.1" + resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== + dependencies: + hasown "^2.0.2" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +jake@^10.8.5: + version "10.9.2" + resolved "https://registry.npmmirror.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" + integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +js-yaml-js-types@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/js-yaml-js-types/-/js-yaml-js-types-1.0.1.tgz#fa57135b99d67b3612718426af2d9b314e5c6808" + integrity sha512-5tpfyORs8OQ43alNERbWfYRCtWgykvzYgY46fUhrQi2+kS7N0NuuFYLZ/IrfmVm5muLTndeMublgraXiFRjEPw== + dependencies: + esprima "^4.0.1" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsdom@^20.0.1: + version "20.0.3" + resolved "https://registry.npmmirror.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" + integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== + dependencies: + abab "^2.0.6" + acorn "^8.8.1" + acorn-globals "^7.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.4.2" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.11.0" + xml-name-validator "^4.0.0" + +jsonparse@^1.3.1: + version "1.3.1" + resolved "https://registry.npmmirror.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +marked@^4.3.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" + integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== + +micro-memoize@^4.1.2: + version "4.1.3" + resolved "https://registry.npmmirror.com/micro-memoize/-/micro-memoize-4.1.3.tgz#17d5df0702acf575503cbf09df90fe691c12825f" + integrity sha512-DzRMi8smUZXT7rCGikRwldEh6eO6qzKiPPopcr1+2EY3AYKpy5fu159PKWwIS9A6IWnrvPKDMcuFtyrroZa8Bw== + +micromatch@^4.0.4: + version "4.0.8" + resolved "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +"mime-db@>= 1.43.0 < 2": + version "1.53.0" + resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.53.0.tgz#3cb63cd820fc29896d9d4e8c32ab4fcd74ccb447" + integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" + integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.5: + version "1.2.8" + resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +moize@^6.1.6: + version "6.1.6" + resolved "https://registry.npmmirror.com/moize/-/moize-6.1.6.tgz#ac2e723e74b951875fe2c0c3433405c2b098c3e6" + integrity sha512-vSKdIUO61iCmTqhdoIDrqyrtp87nWZUmBPniNjO0fX49wEYmyDO4lvlnFXiGcaH1JLE/s/9HbiK4LSHsbiUY6Q== + dependencies: + fast-equals "^3.0.1" + micro-memoize "^4.1.2" + +moment-timezone@^0.5.34: + version "0.5.46" + resolved "https://registry.npmmirror.com/moment-timezone/-/moment-timezone-0.5.46.tgz#a21aa6392b3c6b3ed916cd5e95858a28d893704a" + integrity sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw== + dependencies: + moment "^2.29.4" + +moment@^2.29.1, moment@^2.29.4: + version "2.30.1" + resolved "https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" + integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== + +morgan@^1.9.1: + version "1.10.0" + resolved "https://registry.npmmirror.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" + integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== + dependencies: + basic-auth "~2.0.1" + debug "2.6.9" + depd "~2.0.0" + on-finished "~2.3.0" + on-headers "~1.0.2" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.3, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +negotiator@~0.6.4: + version "0.6.4" + resolved "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== + +nib@^1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/nib/-/nib-1.2.0.tgz#cf650a975307edaa8683470430f82ba132bf9f7b" + integrity sha512-7HgrnMl/3yOmWykueO8/D0q+0iWwe7Z+CK2Eaq/xQV8w1hK80WN1oReRQkfkrztbAAnp/nTHkUSl5EcVkor6JQ== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmmirror.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +nunjucks@^3.2.3: + version "3.2.4" + resolved "https://registry.npmmirror.com/nunjucks/-/nunjucks-3.2.4.tgz#f0878eef528ce7b0aa35d67cc6898635fd74649e" + integrity sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ== + dependencies: + a-sync-waterfall "^1.0.0" + asap "^2.0.3" + commander "^5.1.0" + +nwsapi@^2.2.2: + version "2.2.16" + resolved "https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.16.tgz#177760bba02c351df1d2644e220c31dfec8cdb43" + integrity sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmmirror.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +open@^8.0.9: + version "8.4.2" + resolved "https://registry.npmmirror.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +parse5@^7.1.1: + version "7.2.1" + resolved "https://registry.npmmirror.com/parse5/-/parse5-7.2.1.tgz#8928f55915e6125f430cc44309765bf17556a33a" + integrity sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ== + dependencies: + entities "^4.5.0" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.npmmirror.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +picocolors@^1.0.0: + version "1.1.1" + resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pretty-hrtime@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + integrity sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A== + +prismjs@^1.29.0: + version "1.29.0" + resolved "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" + integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== + +psl@^1.1.33: + version "1.15.0" + resolved "https://registry.npmmirror.com/psl/-/psl-1.15.0.tgz#bdace31896f1d97cec6a79e8224898ce93d974c6" + integrity sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w== + dependencies: + punycode "^2.3.1" + +punycode@^2.1.1, punycode@^2.3.1: + version "2.3.1" + resolved "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +readable-stream@3: + version "3.6.2" + resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve@^1.20.0, resolve@^1.22.0: + version "1.22.10" + resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== + dependencies: + is-core-module "^2.16.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +rfdc@^1.3.0: + version "1.4.1" + resolved "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== + +safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@~1.3.0: + version "1.3.0" + resolved "https://registry.npmmirror.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" + integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== + +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + +send@0.19.0: + version "0.19.0" + resolved "https://registry.npmmirror.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serve-static@^1.14.1: + version "1.16.2" + resolved "https://registry.npmmirror.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== + dependencies: + encodeurl "~2.0.0" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.19.0" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +source-map@^0.7.3: + version "0.7.4" + resolved "https://registry.npmmirror.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sprintf-js@^1.1.2: + version "1.1.3" + resolved "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^6.0.0: + version "6.0.1" + resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +stylus@^0.62.0: + version "0.62.0" + resolved "https://registry.npmmirror.com/stylus/-/stylus-0.62.0.tgz#648a020e2bf90ed87587ab9c2f012757e977bb5d" + integrity sha512-v3YCf31atbwJQIMtPNX8hcQ+okD4NQaTuKGUWfII8eaqn+3otrbttGL1zSMZAAtiPsBztQnujVBugg/cXFUpyg== + dependencies: + "@adobe/css-tools" "~4.3.1" + debug "^4.3.2" + glob "^7.1.6" + sax "~1.3.0" + source-map "^0.7.3" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +through2@^4.0.2: + version "4.0.2" + resolved "https://registry.npmmirror.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" + integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== + dependencies: + readable-stream "3" + +tildify@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/tildify/-/tildify-2.0.0.tgz#f205f3674d677ce698b7067a99e949ce03b4754a" + integrity sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw== + +titlecase@^1.1.3: + version "1.1.3" + resolved "https://registry.npmmirror.com/titlecase/-/titlecase-1.1.3.tgz#fc6d65ff582b0602410768ef1a09b70506313dc3" + integrity sha512-pQX4oiemzjBEELPqgK4WE+q0yhAqjp/yzusGtlSJsOuiDys0RQxggepYmo0BuegIDppYS3b3cpdegRwkpyN3hw== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tough-cookie@^4.1.2: + version "4.1.4" + resolved "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== + dependencies: + punycode "^2.1.1" + +tslib@^2.0.3: + version "2.8.1" + resolved "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.npmmirror.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== + dependencies: + xml-name-validator "^4.0.0" + +warehouse@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/warehouse/-/warehouse-5.0.1.tgz#4062c9c5d6c84f245532923a23ecb4b5441024a5" + integrity sha512-5BQEQP56bPY+cqocTho4syazuGgSoyKd0y3PsS2j8tGN10HH+CEfJSIY+KUw9D0k4jaVEFMXLz0KqCiUzTYb8A== + dependencies: + bluebird "^3.7.2" + cuid "^2.1.8" + graceful-fs "^4.2.10" + hexo-log "^4.0.1" + is-plain-object "^5.0.0" + jsonparse "^1.3.1" + rfdc "^1.3.0" + through2 "^4.0.2" + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== + dependencies: + iconv-lite "0.6.3" + +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmmirror.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@^8.11.0: + version "8.18.0" + resolved "https://registry.npmmirror.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== + +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== diff --git a/yhehe.rar b/yhehe.rar new file mode 100755 index 0000000..3f40b79 Binary files /dev/null and b/yhehe.rar differ diff --git a/好的.yml b/好的.yml new file mode 100755 index 0000000..bf5ceca --- /dev/null +++ b/好的.yml @@ -0,0 +1,1530 @@ + +# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +# 这里是 6.0.0-alpha 分支 +# Breaking Change 会放到这个分支 +# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +############################### Volantis ############################### +info: + theme_name: Volantis # This is theme's name. + theme_docs: https://volantis.js.org/ # This is theme's URL. + theme_repo: https://github.com/volantis-x/hexo-theme-volantis +# Debug 调试模式 +debug: false # false: 关闭调试模式, env:环境配置检查, rightMenus: 调试右键, cdn: 调试 CDN System +############################### 默认占位图 ############################### +default: + avatar: volantis-static/media/placeholder/avatar/round/3442075.svg # https://cdn.jsdelivr.net/gh/cdn-x/placeholder@1.0.1/avatar/round/3442075.svg + link: volantis-static/media/placeholder/link/8f277b4ee0ecd.svg # https://cdn.jsdelivr.net/gh/cdn-x/placeholder@1.0.1/link/8f277b4ee0ecd.svg + cover: volantis-static/media/placeholder/cover/76b86c0226ffd.svg # https://cdn.jsdelivr.net/gh/cdn-x/placeholder@1.0.1/cover/76b86c0226ffd.svg + image: volantis-static/media/placeholder/image/2659360.svg # https://cdn.jsdelivr.net/gh/cdn-x/placeholder@1.0.1/image/2659360.svg + + +############################### CDN System ############################### + +cdn_system: + # CDN 优先级 从高到低排序 写入 priority 列表即表示启用(enable) + priority: [custom, local, cdnjs, npm, static] + # ======================================================================== + # cdn数据配置文件见 "theme/_cdn.yml", 可以在 source/_data/cdn.yml 覆盖 theme/_cdn.yml + # 变量说明: + # 以下变量只能在 `prefix` 中使用。 + # ${site_root} 站点根目录 一般是 "/" + # 以下变量只能在 `format` 中使用。 + # ${prefix} CDN 链接前缀 + # ${name} package 名称 见 "theme/_cdn.yml" + # ${version} package 版本 见 "theme/_cdn.yml" + # ${file} 文件路径 见 "theme/_cdn.yml" + # ${min_file} 文件路径 ${file} 后添加 .min. (jsdelivr、cdnjs 官方自带压缩) + # ${timestamp} Hexo运行时的时间戳(eg:1661246702300), 可用于静态资源版本控制 format: ${prefix}${file}?v=${timestamp} + system_config: + # 自定义配置 使用 "theme/_cdn.yml" 中的名称作为配置项的键 + custom: + busuanzi: https://npm.elemecdn.com/penndu@1.0.0/bsz.js # 杜老师友情赞助 + artalk_js: https://artalk.dusays.com/dist/Artalk.js + artalk_css: https://artalk.dusays.com/dist/Artalk.css + #volantis_style: /css/style.css + #volantis_app: /js/app.js + + # 主题 /js与/css目录 (一般放在本地,可以在此处配置站点CDN),"theme/_cdn.yml" 中以 "volantis_" 开头的名称 + # Tip: 在本配置文件中 匹配以 "volantis-local" 开头的链接路径替换为该格式的前缀开头 prefix + local: + # CDN 链接前缀 + prefix: ${site_root} + # local CDN 格式 + format: ${prefix}${file} + # npm + # https://www.npmjs.com/ + # Tip: 在本配置文件中 匹配以 "volantis-npm" 开头的链接路径替换为该格式的前缀开头 prefix + npm: + # CDN 链接前缀 + prefix: https://unpkg.com + # npm CDN 格式 + format: ${prefix}/${name}@${version}/${file} + # volantis static 静态资源文件 npm 包 CDN 地址 + # https://github.com/volantis-x/volantis-static + # Tip: 在本配置文件中 匹配以 "volantis-static" 开头的链接路径替换为该格式的前缀开头 prefix + static: + # CDN 链接前缀 + prefix: https://unpkg.com/volantis-static@0.0.1660614606622 + # volantis-static CDN 格式 + format: ${prefix}/libs/${name}/${file} + # cdnjs + # https://cdnjs.com/ + # Tip: 在本配置文件中 匹配以 "volantis-cdnjs" 开头的链接路径替换为该格式的前缀开头 prefix + cdnjs: + # CDN 链接前缀 + prefix: https://e.dusays.com/ajax/libs + # cdnjs CDN 格式 + format: ${prefix}/${name}/${version}/${min_file} + # ======================================================================== + + + + + + +############################### CSP ############################### +# 内容安全策略( CSP ) meta 标签 http-equiv="Content-Security-Policy" +# https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP +# https://content-security-policy.com/ +# 也可以设为 false 在 HTTP 标头中设置 https://volantis.js.org/v5/advanced-settings/#设置-HTTP-响应标头 +csp: + enable: true + content: " + default-src 'self' https:; + block-all-mixed-content; + base-uri 'self' https:; + form-action 'self' https:; + worker-src 'self' https:; + connect-src 'self' https: *; + img-src 'self' data: https: *; + media-src 'self' https: *; + font-src 'self' data: https: *; + frame-src 'self' https: *; + manifest-src 'self' https: *; + child-src https:; + script-src 'self' https: 'unsafe-inline' *; + style-src 'self' https: 'unsafe-inline' *; + " + # 可以使用自动程序替换默认的 'unsafe-inline' 和 * 生成更严格的内容安全策略. + # 另可以参考官网之前的 gulp 方案.(CSP Level 3 :Safari 15.4+ Chrome 59+ Firefox 58+ Edge 79+) + # gulpfile.js https://gist.github.com/MHuiG/e50ce64fd94f641f679a0736fef925e4 + +######################################################################## +# https://web.dev/content-visibility/ +# https://www.caniuse.com/?search=content-visibility +content_visibility: true + +# 全局页面字符串替换 A => B (可用于临时修改错字等) +replace: + - https://cdn.jsdelivr.net/npm/ => https://unpkg.com/ + - https://cdn.jsdelivr.net/gh/ => https://gcore.jsdelivr.net/gh/ + - https://unpkg.com/ => https://e.dusays.com/npm/ + - https://gcore.jsdelivr.net/gh/ => https://e.dusays.com/gh/ + + +# dns-prefetch preconnect x-dns-prefetch-control +dns_prefetch: + - https://e.dusays.com + - https://npm.elemecdn.com + - https://f.dusays.com + - https://artalk.dusays.com + +# 平滑滚动效果 +scroll_smooth: true +############################### Navigation Bar ############################### > start +# 注意事项:建议规范全站路径 URL 最后带一个 "/" 例如 "about/" +navbar: + visiable: auto # always, auto + logo: # choose [img] or [icon + title] + img: https://cdn.dusays.com/logo.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/Logo-NavBar@3x.png + icon: + title: + menu: + - name: 分类 + icon: fa-solid fa-folder-open + url: categories/ + rows: + - name: 代码编程 + icon: fas fa-file-code + url: https://dusays.com/categories/%E4%BB%A3%E7%A0%81%E7%BC%96%E7%A8%8B/ + - name: 智慧生活 + icon: fas fa-couch + url: https://dusays.com/categories/%E6%99%BA%E6%85%A7%E7%94%9F%E6%B4%BB/ + - name: 求职面试 + icon: fas fa-business-time + url: https://dusays.com/categories/%E6%B1%82%E8%81%8C%E9%9D%A2%E8%AF%95/ + - name: 网站搭建 + icon: fas fa-ethernet + url: https://dusays.com/categories/%E7%BD%91%E7%AB%99%E6%90%AD%E5%BB%BA/ + - name: 网络安全 + icon: fas fa-ethernet + url: https://dusays.com/categories/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/ + - name: 网络教程 + icon: fas fa-network-wired + url: https://dusays.com/categories/%E7%BD%91%E7%BB%9C%E6%95%99%E7%A8%8B/ + - name: 老师说课 + icon: fas fa-chalkboard-teacher + url: https://dusays.com/categories/%E8%80%81%E5%B8%88%E8%AF%B4%E8%AF%BE/ + - name: 视频分享 + icon: fas fa-video + url: https://dusays.com/categories/%E8%A7%86%E9%A2%91%E5%88%86%E4%BA%AB/ + - name: 资源分享 + icon: fas fa-download + url: https://dusays.com/categories/%E8%B5%84%E6%BA%90%E5%88%86%E4%BA%AB/ + - name: 运维教程 + icon: fas fa-database + url: https://dusays.com/categories/%E8%BF%90%E7%BB%B4%E6%95%99%E7%A8%8B/ + - name: 归档 + icon: fa-solid fa-archive + url: archives/ + - name: 友链 + icon: fa-solid fa-external-link + url: https://dusays.com/friends/ + - name: 文坛 + icon: fa-solid fa-feed + url: https://dusays.com/fcircle/ + - name: 留言 + icon: fa-solid fa-info-circle + url: about/ + - name: 说说 + icon: fa-solid fa-comment + url: https://dusays.com/shuoshuo/ + - name: 图床 + icon: fa-solid fa-image + url: https://7bu.top + target: _blank + - name: 点我在线聊天 + icon: fa-solid fa-phone + url: https://chat.dusays.com/signup_user_complete/?id=pmsp46j6ji8xdpket1pohptpnr + target: _blank + search: 输关键词「回车」搜索 # Search bar placeholder +############################### Navigation Bar ############################### > end + + +############################### Cover ############################### > start +cover: + height_scheme: half # full, half + layout_scheme: blank # blank (留白), search (搜索), dock (坞), featured (精选), focus (焦点) + display: + home: false + archive: false + others: false # can be written in front-matter 'cover: true' + background: https://gcore.jsdelivr.net/gh/MHG-LAB/cron@gh-pages/bing/bing.jpg + # background: https://bing.ioliu.cn/v1/rand?w=1920&h=1200 + logo: # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/Logo-Cover@3x.png + title: '杜老师说' + subtitle: '师者,传道,授业,解惑!' + search: 输关键词「回车」搜索 # search bar placeholder + features: + - name: 文档 + icon: # + img: volantis-static/media/twemoji/assets/svg/1f5c3.svg # https://cdn.jsdelivr.net/gh/twitter/twemoji@13.0/assets/svg/1f5c3.svg + url: /v4/getting-started/ + - name: 帮助 + icon: # + img: volantis-static/media/twemoji/assets/svg/1f516.svg # https://cdn.jsdelivr.net/gh/twitter/twemoji@13.0/assets/svg/1f516.svg + url: faqs/ + - name: 示例 + icon: # + img: volantis-static/media/twemoji/assets/svg/1f396.svg # https://cdn.jsdelivr.net/gh/twitter/twemoji@13.0/assets/svg/1f396.svg + url: /examples/ + - name: 社区 + icon: # + img: volantis-static/media/twemoji/assets/svg/1f389.svg # https://cdn.jsdelivr.net/gh/twitter/twemoji@13.0/assets/svg/1f389.svg + url: /contributors/ + - name: 博客 + icon: # + img: volantis-static/media/twemoji/assets/svg/1f4f0.svg # https://cdn.jsdelivr.net/gh/twitter/twemoji@13.0/assets/svg/1f4f0.svg + url: /archives/ + - name: 源码 + icon: # + img: volantis-static/media/twemoji/assets/svg/1f9ec.svg # https://cdn.jsdelivr.net/gh/twitter/twemoji@13.0/assets/svg/1f9ec.svg + url: https://github.com/volantis-x/hexo-theme-volantis/ +############################### Cover ############################### > end + +pages: + # 友链页面配置 + friends: + layout_scheme: traditional # simple: 简单布局, traditional: 传统布局 + +############################### Article Layout ############################### > start +# 文章布局 +article: + # 文章列表页面的文章卡片布局方案 + preview: + scheme: landscape # landscape + # pin icon for post + pin_icon: https://npm.onmicrosoft.cn/dusays@3.0.0/pin.svg # https://cdn.jsdelivr.net/gh/twitter/twemoji@13.0/assets/svg/1f4cc.svg + # auto generate title if not exist + auto_title: true # false, true + # auto generate excerpt if not exist + auto_excerpt: true # false, true + # hide excerpt + hide_excerpt: false + # show split line or not + line_style: solid # hidden, solid, dashed, dotted + # show author + author: false # true, false + # show readmore button + readmore: auto # auto, always + # 文章详情页面的文章卡片本体布局方案 + body: + # 文章顶部信息 + # 从 meta_library 中取 + top_meta: [author, category, date, counter, artalkcount, wordcount] #启用评论数量需在此添加 + # 文章底部信息 + # 从 meta_library 中取 + bottom_meta: [标签, share] + # ---------------- + # 文章页脚组件 + footer_widget: + # ---------------- + # 参考资料、相关资料等 (for layout: post/docs) + references: + title: 参考资料 + icon: fa-solid fa-quote-left + # 在 front-matter 中: + # references: + # - title: 某篇文章 + # url: https:// + # 即可显示此组件。 + # ---------------- + # 文章推荐 (for layout: post/docs) + # 推荐算法需要依赖中文分词工具,nodejieba只支持中英文 npm i nodejieba -S + recommended_article: + enable: false + layout: ["post", "docs"] + title: 推荐阅读 + icon: fa-solid fa-bookmark + max_count: 6 + placeholder_img: https://gcore.jsdelivr.net/gh/MHG-LAB/cron@gh-pages/bing/bing.jpg + # 不展示文章推荐 + # front-matter 使用 skip_recommended_article: true 关闭 + # 不在以下文件夹文章中展示文章推荐 根目录是source/ + skip_dirs: + - wiki/ + # ---------------- + # 相关文章,需要安装插件 (for layout: post) + # npm i hexo-related-popular-posts + related_posts: + enable: false + title: 相关文章 + icon: fa-solid fa-bookmark + max_count: 5 + # 设为空则不使用文章头图 + placeholder_img: https://gcore.jsdelivr.net/gh/MHG-LAB/cron@gh-pages/bing/bing.jpg + # ---------------- + # 版权声明组件 (for layout: post) + copyright: + enable: true + permalink: '本文永久链接是:' + content: + - '博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议' + - permalink + # 自定义版权组件:精细到文章的版权声明 + custom: true # 开启后替代上方内容的版权显示 + customData: + default: type5 # 默认授权声明 + ############################# + # 你可以在文章的 front-matter 覆盖默认版权声明 + # 配置示例(均可选): + # copyright: + # type: type3 # 当前文章版权声明类型 + # author: 张三 # 本文作者 + # ref: # 原文出处 + # title: # 原文出处 - 标题 + # url: # 原文出处 - 链接 + ############################# + rules: + type1: + text: CC BY-NC-SA 4.0 + desc: 署名-非商业性使用-相同方式共享 4.0 国际。 + type2: + text: 禁止转载引用 + desc: 除非获得原作者的单独授权,任何第三方不得转载! + type3: + text: 原作许可协议 + desc: 本文转载自他站,转载或引用本文时,请遵守原作许可协议! + type4: + text: 来自互联网 + desc: 本文来自互联网,未知来源,侵权请联系删除。 + type5: + text: 允许规范转载 + desc: 转载请保留本文转载地址,著作权归作者所有! + type6: + text: 允许付费转载 + desc: 您可以联系作者通过付费方式获得授权。 + # 还能自行添加更多 + # ---------------- + # 打赏组件 (for layout: post) + donate: + enable: true + images: + - https://bu.dusays.com/2022/11/01/635fff2b852b5.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/qrcode/github@volantis.png + - https://bu.dusays.com/2022/11/01/6360e46adea70.jpg + - https://bu.dusays.com/2022/11/01/635fff2b845b9.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/qrcode/github@volantis.png + # meta library + meta_library: + # 默认文章作者(可在 _data/author.yaml 中增加其他作者,并在 front-matter 中设置) + # https://volantis.js.org/advanced-settings/#多人协同 + author: + avatar: https://cdn.dusays.com/avatar.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/favicon/apple-touch-icon.png + name: Teacher Du + url: https://dusays.com/about/ + # 文章创建日期 + date: + icon: https://photo.yhehe.com/tp/h.ico + title: '发布于:' + format: 'll' # 日期格式 http://momentjs.com/docs/ + # 文章更新日期 + updated: + icon: fa-solid fa-edit + title: '更新于:' + format: 'll' # 日期格式 http://momentjs.com/docs/ + # 文章分类 + category: + icon: fa-solid fa-folder-open + # 文章浏览计数 + counter: + icon: fa-solid fa-eye + unit: '次浏览' + # waline 文章评论数量 + walinecount: + icon: fa-solid fa-comment-dots + desc: '条评论' # 条评论 + # artalk 文章评论数量 + artalkcount: + icon: fa-solid fa-comment-dots + desc: '条评论' # 条评论 + # 文章字数和阅读时长 + wordcount: + icon_wordcount: fa-solid fa-keyboard + icon_duration: fa-solid fa-hourglass-half + # 文章标签 + tags: + icon: fa-solid fa-hashtag + # 分享 + share: + - id: qq + img: volantis-static/media/org.volantis/logo/128/qq.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/128/qq.png + - id: qzone + img: volantis-static/media/org.volantis/logo/128/qzone.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/128/qzone.png + - id: weibo + img: volantis-static/media/org.volantis/logo/128/weibo.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/128/weibo.png + - id: # qrcode # 当id为qrcode时需要安装插件 npm i hexo-helper-qrcode + img: # volantis-static/media/org.volantis/logo/128/wechat.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/128/wechat.png + - id: # telegram + img: # volantis-static/media/org.volantis/logo/128/telegram.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/128/telegram.png +############################### Article Layout ############################### > end + + +############################### Comments ############################### > start +comments: + title: 评论 + subtitle: + service: artalk + # 可选评论系统 # + + # artalk + # https://artalk.js.org/ + # https://github.com/ArtalkJS/Artalk + artalk: + server: https://artalk.dusays.com # 修改为自建的后端服务地址 + path: # 全局评论地址 + placeholder: 在评论框粘贴,自动传至图床。评论自动审核,未显示请稍等~ # 评论占位 + visitor: true # 是否显示文章阅读数 + latex: false # 启用 Latex 支持 + # artalk 有三类图片:1.上传至服务端 2.上传至服务端后利用upgit上传至图床 3.前端上传至图床(本配置为此类) + # 配置此项时将覆盖服务端上传能力 + imageUploader: + # 以兰空图床为例,下列填写内容为: + # url: 'https://xxxxxx/api/v1/upload' + # token: 'Bearer xxxxxxxxxxxxxx' + # resp: 'data.links.url' + api: 'https://7bu.top/api/v1/upload' # 图床地址 + token: 'Bearer 198|G3L9heu8LimK9YSaQzFwqGlfv6EhYTHVIOIcGzUX' # 图床验证 + resp: 'data.links.url' # 图片地址返回值的字段 + # 更多置项可在 Artalk 后端进行配置,详见 https://artalk.js.org/guide/backend/fe-control.html + # 也可以在此处继续参考上方例子进行配置,不建议重写配置的字段除上方所述外还有: + # [el, useBackendConf, pageKey, pageTitle, site, darkMode, pvEl, imgUploader] + + # giscus + # https://giscus.app + # https://github.com/laymonage/giscus + giscus: + # 以下配置按照 yml 格式增删填写即可 + # repo: xxx/xxx + # repo-id: xxx + # category: xxx + # category-id: xxx + # mapping: "pathname" + # reactions-enabled: "1" + # emit-metadata: "0" + # lang: "zh-CN" + # 以上配置按照 yml 格式增删填写即可 + theme: + light: "light" # https://cdn.jsdelivr.net/gh/volantis-x/cdn-volantis@master/css/giscus/light.css + dark: "dark" # https://cdn.jsdelivr.net/gh/volantis-x/cdn-volantis@master/css/giscus/dark.css + + # beaudar + # https://beaudar.lipk.org/ + beaudar: + repo: xxx/xxx + issue-term: pathname + issue-number: + branch: main + position: top + order: desc + theme: + light: github-light + dark: github-dark + label: ✨💬✨ + + # utterances + # https://utteranc.es/ + utterances: + repo: xxx/xxx + issue-term: pathname + issue-number: + theme: + light: github-light + dark: github-dark + label: ✨💬✨ + + # Disqus + # https://disqus.com + disqus: + shortname: + # optional + autoload: false + path: # 全局评论地址 + + # DisqusJS + # https://github.com/SukkaW/DisqusJS + disqusjs: + path: # 全局评论地址 + # 配置项按照yml格式继续填写即可 除了 [siteName url identifier] 选项 + #shortname: + #api: + #apikey: + #admin: + #nesting: + + # Gitalk + # https://gitalk.github.io/ + gitalk: + # 配置项按照yml格式继续填写即可 除了 [id distractionFreeMode] 选项 + clientID: + clientSecret: + repo: + owner: + admin: # [] + path: # 全局评论地址 + + # https://vssue.js.org/zh/ + vssue: + owner: + repo: + clientId: + clientSecret: + + # https://www.livere.com + livere: + uid: + + # Isso + # https://posativ.org/isso/ + isso: + url: https://example.com/(path/) + src: https://example.com/(path/)js/embed.min.js + css: + gravatar: + + # https://www.barkdull.org/software/hashover + hashover: + src: https://example.com/(path/)comments.php + + # Twikoo + # https://twikoo.js.org/ + twikoo: + path: # 全局评论地址 + # 其他配置项按照yml格式继续填写即可 除了 [el path] 选项 + envId: xxxxxxxxxxxxxxx # 腾讯云环境填 envId;Vercel 环境填地址(https://xxx.vercel.app) + placeholder: #全局评论占位,也可以在管理面板中的配置管理处设置(此处优先级更高) + visitor: true # 是否显示文章阅读数 + + # Waline + # https://waline.js.org/ + waline: + path: # 全局评论地址 目前设置全局评论地址后visitor失效,这是waline的问题 + placeholder: # 评论占位提示 + serverURL: # Waline 的服务端地址(必填) 测试用地址: https://waline.vercel.app + imageUploader: + # 适配了兰空图床V1、V2版本 + # 以兰空图床V1为例,下列填写内容为: + # fileName: file + # tokenName: Authorization + # api: https://xxxxxx/api/v1/upload + # token: Bearer xxxxxxxxxxxxxx + # resp: data.links.url + # 以兰空图床V2为例,下列填写内容为: + # fileName: image + # tokenName: token + # api: https://xxxxxx/api/upload + # token: xxxxxxxxxxxxxx + # resp: data.url + fileName: # 根据版本二选一 + tokenName: # 根据版本二选一 + api: # 图床 api 地址 + token: # 图床验证 + resp: # 图片地址返回值的字段 + pageview: true # 是否显示文章阅读数 + comment: true # 是否显示文章评论数 + # 其他配置项按照yml格式继续填写即可 除了 [el path imageUploader] 选项 + # 组件属性地址:https://waline.js.org/reference/component.html + # meta: ['nick', 'mail', 'link'] + + # Discuss + # https://discuss.js.org + discuss: + serverURLs: # Discuss server address url + visitStat: true # 是否显示文章阅读数 + # https://discuss.js.org/Quick-Start.html#path + + +############################### Comments ############################### > end + +############################### Sidebar ############################### > start +sidebar: + position: right # left right + # 主页、分类、归档等独立页面 + for_page: [heisi, blogger, memos_carousel, artalk, sffw, h5game, dao_hang, category, tagcloud, webinfo, tui_jian, dulaoshi, chat, bw] + # layout: docs/post 这类文章页面 + for_post: [heisi, blogger, toc, memos_carousel, artalk, sffw, h5game, dulaoshi, chat, bw, dao_hang, category, tagcloud, webinfo] + # 侧边栏组件库 + widget_library: + # --------------------------------------- + # blogger info widget + blogger: + class: blogger + display: [desktop, mobile] # [desktop, mobile] + avatar: https://cdn.dusays.com/avatar.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/Logo-NavBar@3x.png + shape: rectangle # circle, rectangle + url: /about/ + title: Teacher Du + subtitle: '师者,传道,授业,解惑!' + jinrishici: false # Poetry Today. You can set a string, and it will be displayed when loading fails. + social: + - icon: fa-solid fa-rss + url: /atom.xml + - icon: fa-solid fa-image + url: https://7bu.top/ + - icon: fa-solid fa-subway + url: https://www.travellings.cn/go.html + - icon: fa-solid fa-sitemap + url: https://dusays.com/baidusitemap.xml + # --------------------------------------- + # toc widget (valid only in articles) + toc: + class: toc + display: [desktop, mobile] # [desktop, mobile] + sticky: true + header: + icon: fa-solid fa-list + title: 本文目录 + list_number: false + min_depth: 2 + max_depth: 5 + # --------------------------------------- + # music + music: + class: music + display: [desktop, mobile] # [desktop, mobile] + # --------------------------------------- + # category widget + category: + class: category + display: [desktop] # [desktop, mobile] + header: + icon: fa-solid fa-folder-open + title: 文章分类 + url: /categories/ + # --------------------------------------- + # tagcloud widget + tagcloud: + class: tagcloud + display: [desktop, mobile] # [desktop, mobile] + header: + icon: fa-solid fa-tags + title: 热门标签 + url: /tags/ + min_font: 14 + max_font: 24 + color: true + start_color: '#999' + end_color: '#555' + # --------------------------------------- + # qrcode widget + qrcode: + class: qrcode + display: [desktop, mobile] # [desktop, mobile] + height: 64px # Automatic height if not set + images: + - volantis-static/media/org.volantis/blog/qrcode/github@volantis.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/qrcode/github@volantis.png + - volantis-static/media/org.volantis/blog/qrcode/github@volantis.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/qrcode/github@volantis.png + # --------------------------------------- + heisi: + class: text + display: [desktop, mobile] + header: + icon: fas fa-info + title: 随机图片 + url: https://dusays.com/530/ + content: + - '
              ' + sffw: + class: text + display: [desktop, mobile] + header: + icon: fas fa-dollar-sign + title: 收费服务 + url: https://dusays.com/sffw/ + content: + - '
              ' + h5game: + class: text + display: [desktop, mobile] + header: + icon: fas fa-cloud + title: 公益游戏 + url: https://echeverra.cn/h5game + content: + - '
              ' + dulaoshi: + class: text + display: [desktop, mobile] + sticky: true + header: + icon: fas fa-ad + title: 去不图床 + url: https://7bu.top/ + content: + - '
              ' + chat: + class: text + display: [desktop, mobile] + sticky: true + header: + icon: fas fa-ad + title: 聊天广场 + url: https://chat.dusays.com/ + content: + - '
              ' + bw: + class: text + display: [desktop, mobile] + sticky: true + header: + icon: fas fa-ad + title: 密码托管 + url: https://bw.dusays.com/ + content: + - '
              ' + dao_hang: + class: grid + display: [desktop, mobile] + header: + icon: fas fa-map-signs + title: 站内导航 + fixed: true # 固定宽度 + rows: + - name: 近期文章 + icon: fas fa-clock + url: / + - name: 文章归档 + icon: fas fa-archive + url: archives/ + - name: 我的友链 + icon: fas fa-link + url: friends/ + - name: 关于小站 + icon: fas fa-info-circle + url: about/ + - name: 文章分类 + icon: fas fa-book + url: categories/ + - name: 热门标签 + icon: fas fa-fire + url: tags/ + tui_jian: + class: list + sticky: true + display: [desktop, mobile] + header: + icon: fas fa-thumbs-up + title: 首页链接 + url: /friends/ + rows: + - name: 淇云博客 + url: https://www.pengqi.club + rel: external nofollow noopener noreferrer + target: _blank + - name: 二猫blog + url: https://jingxin18.cn + rel: external nofollow noopener noreferrer + target: _blank + - name: 陈冬冬博客 + url: https://www.chendd.cn + rel: external nofollow noopener noreferrer + target: _blank + - name: 揽星 + url: https://lanxing.net + rel: external nofollow noopener noreferrer + target: _blank + - name: 牛魔博客 + url: https://www.nmwbk.com + rel: external nofollow noopener noreferrer + target: _blank + # webinfo widget + webinfo: + class: webinfo + display: [desktop] + header: + icon: fa-solid fa-award + title: 站点信息 + type: + article: + enable: true + text: '文章数目:' + unit: '篇' + runtime: + enable: true + data: '2019/07/10' # 填写建站日期 + text: '已运行时间:' + unit: '天' + wordcount: + enable: true + text: '本站总字数:' # 需要启用 wordcount + unit: '字' + visitcounter: + enable: true + siteuv: + text: '本站访客数:' + unit: '人' + sitepv: + text: '本站总访问量:' + unit: '次' + lastupd: + enable: true + friendlyShow: true # 更友好的时间显示 + text: '最后活动时间:' + unit: '日' + # --------------------------------------- + # lastupdate widget + lastupdate: + class: lastupdate + display: [desktop, mobile] + header: + icon: fa-solid fa-clock WISTERIA + title: 最近更新 + # --------------------------------------- + # Artalk widget + artalk: + class: artalk + stickys: true + display: [desktop, mobile] + # --------------------------------------- + # Memos widget + memos_carousel: + class: memos_carousel + display: [desktop, mobile] + header: + icon: fa-solid fa-volume-high + title: 说说 + url: /shuoshuo/ # 说说页面的地址 + url: 'https://s.dusays.com/' # 替换城自己的域名,也可以用杜老师的平台托管 + limit: '10' # 展示数量限制 + creatorId: '1' # 替换成自己的用户的ID + tag: '' # 要展示的内容的标签 + image: 'fa-solid fa-image' # 图片替换成图标 + link: 'fa-solid fa-link' # 链接替换成图标 + placeholder: '说说加载中...' # 占位符 + +############################### Sidebar ############################### > end + + +############################### Tag Plugins ############################### > start +# 内置标签插件的配置 +tag_plugins: + # {% note text %} + note: # style for default note: + icon: '\f054' + color: '' + iconfont: 'Font Awesome 6 Free' + # {% checkbox %} + checkbox: + interactive: false # enable interactive for user + color: '' # color for default checkbox + # {% link title, url, img %} + link: + placeholder: volantis-static/media/org.volantis/logo/256/safari.png # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/logo/256/safari.png +############################### Tag Plugins ############################### > end + + +############################### Site Footer ############################### > start +site_footer: + # layout of footer: [aplayer, social, license, info, copyright] + layout: [aplayer, social, license, info, copyright, br, link1, link2] + social: + - img: https://npm.onmicrosoft.cn/dusays@3.0.0/020-rss.svg + url: atom.xml + - img: https://npm.onmicrosoft.cn/dusays@3.0.0/017-picasa.svg + url: https://7bu.top/ + - img: https://npm.onmicrosoft.cn/dusays@3.0.0/031-twitch.svg + url: https://status.dusays.com/status/a + - img: https://npm.onmicrosoft.cn/dusays@3.0.0/033-spotify.svg + url: https://dusays.com/baidusitemap.xml + # site source + source: https://github.com/volantis-x/volantis-docs/ + # analytics using busuanzi + analytics: > + 本站总访问量为 + 访客数为 + # site copyright + copyright: '[萌 ICP 备 20229624 号](https://icp.gov.moe/?keyword=20229624) | [异次元之旅](https://travel.moe/go.html?travel=on)
                 
                 ' + # You can add your own property here. (Support markdown, for example: br: '
              ') + br: '
              ' + link1: '[辛未羊的网络日志](https://panqiincs.me/) | [子夜松声](https://xyzbz.cn/) | [obaby@mars](https://h4ck.org.cn/) | [启涵的博客](https://blog.1id.top/) | [Ryan’s Blog](https://www.moezz.cn/) | [乙未博客](https://yvii.cn/) | [Dabenshi](https://dabenshi.cn/) | [晓雨杂记](https://lihaoyu.cn/) | [MatrixCore](https://matrixcore.top/)' + link2: '[龙鲲博客](https://lklog.cn/) | [SunoAPI AI音乐歌曲生成器](https://sunoapi.net/) | [小旭の破站](https://www.sicx.top/) | [joojenZhou个人网站](https://joojen.com/) | [晚夜的个人博客](https://www.iczrx.cn/) | [云晓晨CatchYXC](https://www.catchyxc.com/) | [杜老师说](https://dusays.com/) | [友链申请](https://dusays.com/friends/)' +############################### Site Footer ############################### > end + +############################### Plugins ############################### > start +plugins: + ################ required plugins ################ + # jquery + globalJquery: true # 全局引入 jquery + # fontawesome + fontawesome: true + ################ optional plugins ################ + # issues api + sitesjs: + enable: true + friendsjs: + enable: true + contributorsjs: + enable: true + + ######## Plugins to improve loading speed: + # 预加载 + preload: + enable: true + service: flying_pages # instant_page, flying_pages + + # 图片懒加载 + # https://www.npmjs.com/package/vanilla-lazyload + # tips: + # 这里是主题自带的图片懒加载, 实现方案位于 /scripts/filters/z-lazyload ; srcset 属性的的优先级比 src 属性要高, 注意 srcset 存放了懒加载占位图, src 存放了原图 + # 在支持 srcset 的浏览器或者 RSS 阅读器(还会有人使用老旧的阅读器?)上会优先读取 srcset 加载的图片(懒加载占位图), 对于 RSS 中图片丢失变成懒加载占位图的问题, 建议 自行使用脚本移除 srcset 属性 或 关闭图片懒加载 或 在 RSS 中插入 vanilla-lazyload + lazyload: + enable: true + onlypost: false + loadingImg: # https://cdn.jsdelivr.net/gh/volantis-x/cdn-volantis@3/img/placeholder/c617bfd2497fcea598e621413e315c368f8d8e.svg # 不建议使用占位图, 建议loadingImg为空, 当前占位图会产生布局偏移, loadingImg 为空占位图是一个 1X1 像素的图片 + blurIn: true # 模糊加载效果 (loadingImg为空时有效) + + ######## Plugins to optimize the experience: + # 代码高亮 + code_highlight: highlightjs # highlightjs or prismjs + # highlight.js + highlightjs: + copy_code: true + # 如果开启以下配置, hexo.config.highlight.enable 需要设置为 false ; hexo.config.highlight.enable 设置为 true, 则以下配置无效 + # # 不再支持 v11.1.0 以下版本 + js: https://unpkg.com/@highlightjs/cdn-assets@11.9.0/highlight.min.js # Please set hexo.config.highlight.enable = false !!! + css: https://unpkg.com/@highlightjs/cdn-assets@11.9.0/styles/github-dark-dimmed.css + # # # more: https://www.jsdelivr.com/package/npm/@highlightjs/cdn-assets?path=styles + + # prismjs + # https://prismjs.com/ + # https://hexo.io/zh-cn/docs/syntax-highlight#PrismJS + prismjs: + copy_code: true + # Please set hexo.config.highlight.enable = false !!! set hexo.config.prismjs.enable = true !!! + js: + - https://unpkg.com/prismjs/components/prism-core.min.js + - https://unpkg.com/prismjs/plugins/autoloader/prism-autoloader.min.js + - https://unpkg.com/prismjs/plugins/line-numbers/prism-line-numbers.min.js + css: + - https://unpkg.com/prismjs/themes/prism-dark.css + - https://unpkg.com/prismjs/plugins/line-numbers/prism-line-numbers.css + + # https://scrollrevealjs.org/api/reveal.html + scrollreveal: + enable: #true + distance: 32px + duration: 800 # ms + interval: 20 # ms + scale: 1 # 0.1~1 + + ######## Plugins for Count: + # npm i hexo-wordcount + wordcount: + enable: true + + busuanzi: + enable: true + + ######## Plugins for ... + # Button Ripple Effect + nodewaves: + enable: #true + + # fontawesome V6: https://fontawesome.com/docs/web/style/animate + # fontawesome animation for fontawesome V5 + fontawesome_animation: + enable: #true + + # Typing Effects + comment_typing: + enable: #true + + # 视差滚动效果 Slide Background + parallax: + enable: #true + position: cover # cover: sticky on the cover. fixed: Fixed as background for the site. + shuffle: true # shuffle playlist + duration: 10000 # Duration (ms) + fade: 1500 # fade duration (ms) (Not more than 1500) + images: # For personal use only. At your own risk if used for commercial purposes !!! + - volantis-static/media/wallpaper/minimalist/2020/001.webp + - volantis-static/media/wallpaper/minimalist/2020/002.webp + - volantis-static/media/wallpaper/minimalist/2020/003.webp + - volantis-static/media/wallpaper/minimalist/2020/004.webp + - volantis-static/media/wallpaper/minimalist/2020/005.webp + - volantis-static/media/wallpaper/minimalist/2020/006.webp + - volantis-static/media/wallpaper/minimalist/2020/012.webp + - volantis-static/media/wallpaper/minimalist/2020/016.webp + - volantis-static/media/wallpaper/minimalist/2020/019.webp + - volantis-static/media/wallpaper/minimalist/2020/025.webp + - volantis-static/media/wallpaper/minimalist/2020/033.webp + - volantis-static/media/wallpaper/minimalist/2020/034.webp + - volantis-static/media/wallpaper/minimalist/2020/035.webp + - volantis-static/media/wallpaper/minimalist/2020/038.webp + - volantis-static/media/wallpaper/minimalist/2020/039.webp + - volantis-static/media/wallpaper/minimalist/2020/042.webp + - volantis-static/media/wallpaper/minimalist/2020/046.webp + - volantis-static/media/wallpaper/minimalist/2020/051.webp + - volantis-static/media/wallpaper/minimalist/2020/052.webp + - volantis-static/media/wallpaper/minimalist/2020/054.webp + - volantis-static/media/wallpaper/minimalist/2020/056.webp + + # APlayer is only available in mainland China. + # https://aplayer.js.org/#/zh-Hans/ + # APlayer config: https://github.com/metowolf/MetingJS + aplayer: + enable: #true + source: meting # meting:从 MetingJS API 获取音乐数据(API经常不稳定) / local:本地音乐数据 + # ============= meting begin ============= + # Required + server: netease # netease, tencent, kugou, xiami, baidu + type: playlist # song, playlist, album, search, artist + id: 3175833810 # song id / playlist id / album id / search keyword + # ============= meting end ============= + # ============= local begin ============== + # local 暂时没有适配右键 和 post.music 迷你模式 + audio: + - name: 'Fly' + artist: 'Marshmello' + url: '/music/fly.mp3' + lrc: '/music/fly.lrc' + cover: '/music/fly.jpg' + - name: 'Avem' + artist: 'Alan Walker' + url: '/music/Avem.mp3' + lrc: '/music/Avem.lrc' + cover: '/music/Avem.jpg' + # ============= local end ================ + # Optional + fixed: false # enable fixed mode + theme: '#1BCDFC' # main color + autoplay: false # audio autoplay + order: list # player play order, values: 'list', 'random' + loop: all # player loop play, values: 'all', 'one', 'none' + volume: 0.7 # default volume, notice that player will remember user setting, default volume will not work after user set volume themselves + list_max_height: 320px # list max height + list_folded: true + autoHide: true # hide automaticaly + + # pace + # An automatic web page progress bar. + # https://github.com/CodeByZach/pace + pace: + enable: true + color: blue # black, blue, green, orange, pink, purple, red, silver, white, yellow + theme: minimal # big-counter, bounce, barber-shop, center-atom, center-circle, center-radar, center-simple, corner-indicator, fill-left, flat-top, flash, loading-bar, mac-osx, material, minimal + + # 暗黑模式 darkmode + # 开关按钮:在 navbar.menu 中添加: + # - name: 暗黑模式 # 可自定义 + # icon: fa-solid fa-moon # 可自定义 + # toggle: darkmode + darkmode: + enable: true + + # 旧版 Internet Explorer 淘汰行动 + # https://www.microsoft.com/zh-cn/WindowsForBusiness/End-of-IE-support + # 本主题不支持Internet Explorer的任何版本!!! + killOldVersionsOfIE: + enable: true + + # 禁用JavaScript提示 + # 本页面需要浏览器支持(启用)JavaScript + # 主题中的某些插件必须启用JavaScript才能正常工作,例如开启scrollreveal如果禁用JavaScript会导致卡片消失 + killNoScript: + enable: true + + # Artitalk https://artitalk.js.org + # 配置过程请参考:https://artitalk.js.org/doc.html + # 使用过旧版本的请修改Leancloud shuoshuo class部分列名:https://artitalk.js.org/release.html + # 除appID和appKEY外均为选填项 + artitalk: + # Set `plugins: ["artitalk"]` to enable in front-matter + # 配置项按照yml格式继续填写即可 + appId: ogP8qj3veMh0LFpFWMPOyF0X-MdYXbMMI # your appID + appKey: nHXLd3N3Jgh460t2iRQKWAtr # your appKEY + # serverURL: #leancloud绑定的api访问域名,使用国际版的话不需要填写 + # lang: # 语言设置,zh为汉语,en为英语,es为西班牙语。默认为汉语 + # pageSize: #每页说说的显示数量 + # shuoPla: #在编辑说说的输入框中的占位符 + # avatarPla: #自定义头像url的输入框的占位符 + # motion: #加载动画的开关,1为开,0为关,默认为开 + # bgImg: #说说输入框背景图片url + # color1: #说说背景颜色1&按钮颜色1 + # color2: #说说背景颜色2&按钮颜色2 + # color3: #说说字体颜色 + # cssUrl: #自定义css接口 + + # Memos https://usememos.com + memos: + # Set `plugins: ["memos"]` to enable in front-matter + url: 'https://s.dusays.com/' # 替换成自己的域名,也可以用杜老师的平台托管 + limit: '10' # 展示数量限制 + id: '1' # 替换成自己的用户的ID + + # BBtalk https://bb.js.org + bbtalk: + # Set `plugins: ["bbtalk"]` to enable in front-matter + appId: 0KzOX4vC7Jsk6vzUGNeEiUaI-gzGzoHsz # your appID + appKey: HwCiWuxfpvKiLm4teCUgTIba # your appKEY + serverURLs: https://bbapi.heson10.com # Request Api 域名 + + # 友链朋友圈 hexo-circle-of-friends + # https://github.com/Rock-Candy-Tea/hexo-circle-of-friends + # https://fcircle-doc.js.cool/ + fcircle: + # Set `plugins: ["fcircle"]` to enable in front-matter + private_api_url: https://f.dusays.com/ # api 地址 + page_init_number: 20 # 初始加载几篇文章 + page_turning_number: 10 # 点击加载更多时,一次最多加载几篇文章,默认10 + error_img: https://cravatar.cn/avatar/57d8260dfb55501c37dde588e7c3852c # 头像加载失败时,默认头像地址 + sort_rule: created # 进入页面时第一次的排序规则,可选值:created/updated + expire_days: 1 # 本地文章缓存数据过期时间(天) + js: https://npm.elemecdn.com/fcircle-theme-yyyz@1.0.13/dist/fcircle.min.js # fcircle.min.js的url + + # 消息提示 + # izitoast + message: + enable: true + icon: # 默认图标,支持对图标添加颜色,可选值:see:/source/css/_style/_plugins/fontcolor.styl + default: fa-solid fa-info-circle light-blue + quection: fa-solid fa-question-circle light-blue + time: # 默认持续时间 + default: 5000 + quection: 20000 + position: 'topRight' # 弹出位置 可选值:topRight, bottomRight, bottomLeft, topLeft, topCenter, bottomCenter, center + transitionIn: 'bounceInLeft' # 弹窗打开动画 可选值:bounceInLeft, bounceInRight, bounceInUp, bounceInDown, fadeIn, fadeInDown, fadeInUp, fadeInLeft, fadeInRight, flipInX + transitionOut: 'fadeOutRight' # 弹窗关闭动画 可选值:fadeOut, fadeOutUp, fadeOutDown, fadeOutLeft, fadeOutRight, flipOutX + titleColor: 'var(--color-text)' # 标题颜色 + messageColor: 'var(--color-text)' # 消息颜色 + backgroundColor: 'var(--color-card)' # 默认背景色 + zindex: 2147483647 # 层级 + copyright: # 是否在复制时弹出版权提示,影响范围:ctrl+c、代码块复制按钮、右键复制选项 + enable: true + title: '知识共享许可协议' + message: '请遵守 CC BY-NC-SA 4.0 协议。' + icon: 'far fa-copyright light-blue' + aplayer: # 是否开启音乐通知;播放、暂停、失败 时的图标 + enable: true + play: fa-solid fa-play + pause: fa-solid fa-pause + rightmenu: + enable: true # 是否开启右键模块的消息通知 + notice: true # 唤醒原右键菜单的通知 + + # 聊天功能 + chat_service: # tidio or gitter + + # Tidio + # https://www.tidio.com/ + tidio: + id: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + + # Gitter + # https://gitter.im + gitter: + room: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + + # swiper + # https://www.swiper.com.cn/ + swiper: + enable: true + + # AI摘要 + # https://github.com/zhheo/Post-Abstract-AI + tianliGPT: + enable: false + key: sk-Y80aj4Mz749q66Pc2CBViMiQNKK08HocXNHecmFg9ixdb3sr + wordLimit: 1000 # 摘要字数限制 (⚠️危险:更改此变量损失已消耗过的key,因为你提交的内容发生了变化。) + typewriter: true # 打字机效果 + +############################### Plugins ############################### > end + +############################### Rightmenu ############################### > start + +### 自定义右键 +rightmenus: + enable: true + # 右键菜单项及加载顺序 + # 内容示例:plugins.[组名], menus.[组名], hr(分割线,推荐去线留白), music(音乐控制器) + order: + - plugins.navigation + - hr + - plugins.inputBox + - plugins.seletctText + - plugins.elementCheck + - plugins.elementImage + - menus.link + - hr + - menus.darkMode + - plugins.articlePage + - music + ############################ + # - {id: '', name: '', icon: '', link: '', event: '', group: ''} + # id: 唯一值 + # name: 用于菜单名称显示 + # icon: 用于菜单图标显示 + # link: 跳转链接 + # event: 事件,当输入内容不为内置事件时,作 JavaScript 代码执行 + # group: 菜单项所处分组名称 + # 注: + # 1. link/event 二选一,同时出现时仅处理 link + # 2. 内置事件列表: copyText, copyLink, copyPaste, copyAll, copyCut, copyImg, printMode, readMode + # 3. 内置组列表:navigation, inputBox, seletctText, elementCheck, elementImage, articlePage + # 4. plugins 列允许自定义组内项目 + # 5. menus 列允许自定义组及其内容 + # 6. 除 navigation 外的内置组,在显示时会隐藏含 link 属性的菜单项 + ########################### + # 基础项设置 + options: + # 图标前缀 fa-solid, fa-regular, fa-light, fa-thin, fa-duotone, fa-brands + iconPrefix: fa-solid + # 例外,在 articlePage 组显示时(文章页)时依旧显示含 link 属性的菜单项 + articleShowLink: true + # 当设定全局音乐播放器时,是否一直显示音乐控制菜单。false:仅当音乐播放时启用 + musicAlwaysShow: true + # 右键内置组,预置实现 + plugins: + # 导航组件 + # 横向排列,共用一行,仅显示图标 (原则上支持的数量不限) + navigation: + - {id: 'left', name: '转到上一页', icon: 'fa-solid fa-arrow-left', event: 'history.back()', group: 'navigation'} + - {id: 'right', name: '转到下一页', icon: 'fa-solid fa-arrow-right', event: 'history.forward()', group: 'navigation'} + - {id: 'redo', name: '刷新当前页面', icon: 'fa-solid fa-redo', event: 'window.location.reload()', group: 'navigation'} + - {id: 'up', name: '回到顶部', icon: 'fa-solid fa-arrow-up', event: 'VolantisApp.scrolltoElement(volantis.dom.bodyAnchor)', group: 'navigation'} + #- {id: 'home', name: '回到首页', icon: 'fa-solid fa-home', link: '/', group: 'navigation'} + # 文本输入框相关组件 + # 生效于 input/textarea,粘贴、剪切、全选 + inputBox: + - {id: 'copyPaste', name: '粘贴文本', icon: 'fa-solid fa-paste', event: 'copyPaste', group: 'inputBox'} + - {id: 'copyAll', name: '全选文本', icon: 'fa-solid fa-object-ungroup', event: 'copyAll', group: 'inputBox'} + - {id: 'copyCut', name: '剪切文本', icon: 'fa-solid fa-cut', event: 'copyCut', group: 'inputBox'} + # 文本选中类组件 + # 生效于右键选中文本,__text__ 为选中的文本。 + seletctText: + - {id: 'copyText', name: '复制文本', icon: 'fa-solid fa-copy', event: 'copyText', group: 'seletctText'} + - {id: 'searchWord', name: '站内搜索', icon: 'fa-solid fa-search', event: 'OpenSearch(__text__)', group: 'seletctText'} + - {id: 'bingSearch', name: '百度搜索', icon: 'fa-solid fa-search', event: 'window.open(`https://www.baidu.com/s?wd=${__text__}`)', group: 'seletctText'} + - {id: 'bingSearch', name: '必应搜索', icon: 'fa-solid fa-search', event: 'window.open(`https://cn.bing.com/search?q=${__text__}`)', group: 'seletctText'} + #- {id: 'googleSearch', name: '谷歌搜索', icon: 'fa-solid fa-search', event: 'window.open(`https://www.google.com/search?q=${__text__}`)', group: 'seletctText'} + # 链接判断组件 + # 生效于链接处的右键行为,__link__ 为链接地址 + elementCheck: + - {id: 'openTab', name: '新标签页打开', icon: 'fa-solid fa-external-link-square-alt', event: 'window.open(__link__)', group: 'elementCheck'} + - {id: 'copyLink', name: '复制链接地址', icon: 'fa-solid fa-link', event: 'copyLink', group: 'elementCheck'} + # 图片判断类组件 + # 生效于图片类的右键行为,__link__ 为链接地址 + elementImage: + - {id: 'copyImg', name: '复制图片', icon: 'fa-solid fa-image', event: 'copyImg', group: 'elementImage'} + - {id: 'googleImg', name: '谷歌识图', icon: 'fa-solid fa-images', event: 'window.open(`https://www.google.com.hk/searchbyimage?image_url=${__link__}`)', group: 'elementImage'} + # 文章页面组件 + # 生效于 post.article 页面 + articlePage: + - {id: 'printMode', name: '打印页面', icon: 'fa-solid fa-print', event: 'printMode', group: 'articlePage'} + - {id: 'readMode', name: '阅读模式', icon: 'fa-solid fa-book-open', event: 'readMode', group: 'articlePage'} + # 右键自定义菜单区域 + menus: + link: + - {id: 'help', name: '去不图床', icon: 'fa-solid fa-file-image', link: 'https://7bu.top/', group: 'link'} + - {id: 'examples', name: '购买容量', icon: 'fa-solid fa-address-card', link: 'https://pay.dusays.com/', group: 'link'} + - hr + - {id: 'source_theme', name: '说说广场', icon: 'fa-solid fa-edit', link: 'https://s.dusays.com/', group: 'link'} + - {id: 'contributors', name: '聊天平台', icon: 'fa-solid fa-money-check-alt', link: 'https://chat.dusays.com/signup_user_complete/?id=pmsp46j6ji8xdpket1pohptpnr', group: 'link'} + darkMode: + - {id: 'darkMode', name: '暗黑模式', icon: 'fa-solid fa-moon', event: 'volantis.dark.toggle()', group: 'darkMode'} +### + + +############################### Search ############################### > start +# To use hexo search, you need to install the following plugins: +# npm i hexo-generator-json-content +search: + enable: true + service: meilisearch # hexo, algolia, meilisearch + algolia: + searchAsYouType: true # If false, triggers the search only on submit. + hitsPerPage: 5 # Set the number of hits per page. + placeholder: 'Search...' # The placeholder text of the input. + meilisearch: + placeholder: 'Search...' + searchKey: '6141804bbb0e3cf1195f1712d2c70dda948369a72a7b5258f7c44021e3705cab' + indexName: 'hexo' + hostUrl: 'https://m.dusays.com' + +############################### Search ############################### > end + +############################### Color Scheme ############################### > start +# Accessibility: 背景色和前景色要有足够的对比度 https://web.dev/color-contrast/ +# https://ant.design/docs/spec/colors-cn +color_scheme: + # ------------ + # 通用颜色 + common: + # 主题色 + theme: '#3dd9b6' + # 链接色 + link: '#2092ec' + # 按钮色 + button: '#44D7B6' + # 鼠标放到交互元素上时的色 + hover: '#ff5722' + # 主题色块内部的文字颜色 + inner: '#fff' + # 选中区域文字的背景颜色 + selection: 'alpha(#2196f3, 0.2)' + # ------------ + # 亮色主题(默认) + light: + # 网站背景色 + site_bg: '#f4f4f4' + # 网站背景上的文字 + site_inner: '#fff' + # 网站页脚文字 + site_footer: '#666' + + # 卡片背景色 + card: '#fff' + # 卡片上的普通文字 + text: '#444' + + # 区块和代码块背景色 + block: '#f6f6f6' + # 代码块高亮时的背景色 + codeblock: '#FFF7EA' + # 行内代码颜色 + inlinecode: '#c74f00' + + # 文章部分 + h1: '#3a3a3a' + h2: '#3a3a3a' + h3: '#333' + h4: '#444' + h5: '#555' + h6: '#666' + p: '#444' + + # 列表文字 + list: '#666' + # 列表 hover 时的文字 + list_hl: 'mix($color-theme, #000, 80)' + # 辅助性文字 + meta: '#888' + + # 版权卡片背景色 + copyright_bkg: '#f5f5f5' + # ------------ + # 暗色主题 + # https://www.maijisheji.com/2094.html + dark: + # 网站最深底色 # Dark Grey 1 + site_bd: '#121212' + # 网站背景色 # Dark Grey 2 + site_bg: '#1f1f1f' + # 卡片背景色 # Dark Grey 3 + card: '#262626' + # 网站背景上的文字 + site_inner: '#eeeeeede' + # 网站页脚文字 + site_footer: '#aaaaaade' + # 卡片上的普通文字 + text: '#eeeeeede' + + # 区块和代码块背景色 # Dark Grey 4 + block: '#434343' + # 代码块高亮时的背景色 # Dark Grey 2 + codeblock: '#1f1f1f' + # 行内代码颜色 + inlinecode: '#D56D28' + + # 文章部分 高强度文本的不透明度应为87% 中等重点文字适用于60% + h1: '#FFFFFFde' # Dark Grey 8 + h2: '#FFFFFFde' + h3: '#FFFFFF99' # Dark Grey 7 + h4: '#FFFFFF99' + h5: '#FFFFFF99' + h6: '#FFFFFF99' + p: '#d9d9d9de' # Dark Grey 6 + + # 列表文字 # Dark Grey 6 + list: '#d9d9d9de' + # 列表 hover 时的文字 + list_hl: 'mix($color-theme, #fff, 80)' + # 辅助性文字 # Dark Grey 5 + meta: '#bfbfbfde' + # 版权卡片背景色 + copyright_bkg: '#21252b' + # 夜间图片亮度 + brightness: 70% +############################### Color Scheme ############################### > end + +############################### Custom css ############################### > start +custom_css: + cursor: + enable: #true + text: volantis-static/media/cursor/text.png # https://cdn.jsdelivr.net/gh/inkss/common@1/cursor/text.png + pointer: volantis-static/media/cursor/pointer.png # https://cdn.jsdelivr.net/gh/inkss/common@1/cursor/pointer.png + default: volantis-static/media/cursor/left_ptr.png # https://cdn.jsdelivr.net/gh/inkss/common@1/cursor/left_ptr.png + not-allowed: volantis-static/media/cursor/circle.png # https://cdn.jsdelivr.net/gh/inkss/common@1/cursor/circle.png + zoom-out: volantis-static/media/cursor/zoom-out.png # https://cdn.jsdelivr.net/gh/inkss/common@1/cursor/zoom-out.png + zoom-in: volantis-static/media/cursor/zoom-in.png # https://cdn.jsdelivr.net/gh/inkss/common@1/cursor/zoom-in.png + grab: volantis-static/media/cursor/openhand.png # https://cdn.jsdelivr.net/gh/inkss/common@1/cursor/openhand.png + font_smoothing: true # font-smoothing for webkit + max_width: 1440px # Sum of body width and sidebar width (This limit will be exceeded when the device width is greater than 2000px, reaching 75% of the total width) + scrollbar: + size: 14px + border: 12px + navbar: + height: 64px + width: auto # auto, max + effect: [shadow, floatable, blur] # [shadow, floatable, blur] + sidebar: + effect: [shadow, floatable, blur] # [shadow, floatable, blur] + body: + effect: [shadow, floatable, blur] # [shadow, floatable, blur] + highlight: + language: true # show language of codeblock + grayscale: false # Enable grayscale effect + text_align: # left, right, justify, center + h1: left + h2: left + h3: left + h4: left + p: justify + gap: + h2: 48px # Spacing above H2 (only px unit) + h3: 24px # Spacing above H3 (only px unit) + h4: 16px # Spacing above H4 (only px unit) + p: 1em # Paragraph spacing between paragraphs + line_height: 1.6 # normal, 1.5, 1.75, 2 ... + border_radius: + card: 8px + codeblock: 4px + searchbar: 8px + button: 4px + fontsize: + root: 16px + h1: 1.5rem # 不推荐用在文章中 + h2: 1.5rem + h3: 1.25rem + h4: 1.125rem + h5: 1rem + h6: 1rem + list: .9375rem + meta: .875rem + code: .8125rem + footnote: .78125rem + fontfamily: + logofont: + fontfamily: '"Varela Round", "PingFang SC", "Microsoft YaHei", Helvetica, Arial' + name: 'Varela Round' + url: volantis-static/media/fonts/VarelaRound/VarelaRound-Regular.ttf # https://cdn.jsdelivr.net/gh/volantis-x/cdn-fonts/VarelaRound/VarelaRound-Regular.ttf + weight: normal + style: normal + bodyfont: + fontfamily: 'UbuntuMono, "Varela Round", "PingFang SC", "Microsoft YaHei", Helvetica, Arial' + name: 'UbuntuMono' + url: volantis-static/media/fonts/UbuntuMono/UbuntuMono-Regular.ttf # https://cdn.jsdelivr.net/gh/volantis-x/cdn-fonts/UbuntuMono/UbuntuMono-Regular.ttf + weight: normal + style: normal + codefont: + fontfamily: 'Menlo, UbuntuMono, Monaco' + # name: 'Monaco' + # url: volantis-static/media/fonts/Monaco/Monaco.ttf # https://cdn.jsdelivr.net/gh/volantis-x/cdn-fonts/Monaco/Monaco.ttf + # weight: normal + # style: normal +############################### Custom css ############################### > end + +############################### SEO ############################### > start +seo: + # When there are no keywords in the article's front-matter, use tags as keywords. + use_tags_as_keywords: true + # When there is no description in the article's front-matter, use excerpt as the description. + use_excerpt_as_description: true + robots: + home_first_page: index,follow + home_other_pages: noindex,follow + archive: noindex,follow + category: noindex,follow + tag: noindex,follow + # robots can be written in front-matter +############################### SEO ############################### > end + +############################### Open Graph ############################### > start +# https://ogp.me/ +# https://hexo.io/zh-cn/docs/helpers#open-graph +open_graph: + image: https://cdn.dusays.com/favicon.ico # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/favicon/android-chrome-192x192.png + twitter_card: summary # summary_large_image , summary + #twitter_id: + #twitter_site: +############################### Open Graph ############################### > end + +############################### Structured Data ############################### > start +# SEO 入门文档: https://developers.google.com/search/docs +# https://schema.org.cn/ +# 结构化数据用于更改搜索结果的显示效果 +# 目前内置的结构化数据: blogposting, breadcrumblist, organization, person, website +# 目前内置的富媒体搜索结果: 路径(面包屑导航), 徽标(Logo), 站点链接搜索框(SearchAction) +# https://developers.google.com/search/docs/advanced/structured-data/intro-structured-data +# 富媒体搜索结果测试: https://search.google.com/test/rich-results +structured_data: + enable: true + # 以下是覆盖配置, 默认配置见 scripts/helpers/structured-data/lib/config.js + data: + person: + sns: + - https://github.com/volantis-x + logo: + path: https://cdn.dusays.com/favicon.ico # https://cdn.jsdelivr.net/gh/volantis-x/cdn-org/blog/favicon/android-chrome-192x192.png + width: 192 + height: 192 +############################### Structured Data ############################### > end