diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..d68365d --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,19 @@ +name: npm publish + +on: + release: + types: [created] +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + # Setup .npmrc file to publish to npm + - uses: actions/setup-node@v1 + with: + node-version: '12.x' + registry-url: 'https://registry.npmjs.org' + - run: npm install + - run: npm publish + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} \ No newline at end of file diff --git a/_config.yml b/_config.yml index d6f20b9..1a1b290 100644 --- a/_config.yml +++ b/_config.yml @@ -86,6 +86,9 @@ avatar: img: effect: false +# Disable all banner image +disable_top_img: false + # The banner image of home page index_img: @@ -192,6 +195,14 @@ reward: # link: # text: alipay +# Post edit +# Easily browse and edit blog source code online. +post_edit: + enable: false + # url: https://github.com/user-name/repo-name/edit/branch-name/subdirectory-name/ + # For example: https://github.com/jerryc127/butterfly.js.org/edit/main/source/ + url: + # Related Articles related_post: enable: true @@ -201,6 +212,13 @@ related_post: # figcaption (圖片描述文字) photofigcaption: false +# post_pagination (分頁) +# value: 1 || 2 || false +# 1: The 'next post' will link to old post +# 2: The 'next post' will link to new post +# false: disable pagination +post_pagination: 1 + # anchor # when you scroll in post, the URL will update according to header id. anchor: false @@ -248,7 +266,8 @@ comments: # lazyload: The comment system will be load when comment element enters the browser's viewport. # If you set it to true, the comment count will be invalid lazyload: false - count: false # Display comment count in top_img + count: false # Display comment count in post's top_img + card_post_count: false # Display comment count in Home Page # disqus # https://disqus.com/ @@ -601,10 +620,10 @@ subtitle: loop: true # source調用第三方服務 # source: false 關閉調用 - # source: 1 調用搏天api的隨機語錄(簡體) https://api.btstu.cn/ - # source: 2 調用一言網的一句話(簡體) https://hitokoto.cn/ - # source: 3 調用一句網(簡體) http://yijuzhan.com/ - # source: 4 調用今日詩詞(簡體) https://www.jinrishici.com/ + # source: 1 調用搏天api的隨機語錄(簡體) + # source: 2 調用一言網的一句話(簡體) + # source: 3 調用一句網(簡體) + # source: 4 調用今日詩詞(簡體) # subtitle 會先顯示 source , 再顯示 sub 的內容 source: false # 如果有英文逗號' , ',請使用轉義字元 , @@ -682,6 +701,7 @@ newest_comments: enable: false sort_order: # Don't modify the setting unless you know how it works limit: 6 + storage: 10 # unit: mins, save data to localStorage avatar: true # You can only choose one, or neither valine: false @@ -799,9 +819,6 @@ snackbar: bg_light: '#49b1f5' # The background color of Toast Notification in light mode bg_dark: '#121212' # The background color of Toast Notification in dark mode -# Baidu Push (百度推送) -baidu_push: false - # https://instant.page/ # prefetch (預加載) instantpage: false @@ -829,16 +846,10 @@ lazyload: # favicon_16_16: /image/pwa/16.png # mask_icon: /image/pwa/safari-pinned-tab.svg -# Disable Baidu transformation on mobile devices (禁止百度轉碼) -disable_baidu_transformation: true - # Open graph meta tags # https://developers.facebook.com/docs/sharing/webmasters/ Open_Graph_meta: true -# Caches the contents in a fragment, speed up the generation (開啟hexo自帶的緩存,加快生成速度) -fragment_cache: true - # Add the vendor prefixes to ensure compatibility css_prefix: true diff --git a/languages/default.yml b/languages/default.yml index 0983604..3e0cd28 100644 --- a/languages/default.yml +++ b/languages/default.yml @@ -13,6 +13,8 @@ page: category: Category archives: Archives +card_post_count: comments + sticky: Sticky no_title: No title @@ -30,6 +32,7 @@ post: copyright_notice: Copyright Notice copyright_content: 'All articles in this blog are licensed under %s unless stating additionally.' recommend: Related Articles + edit: Edited on search: Search algolia_search: @@ -74,6 +77,9 @@ aside: loading_text: loading... error: Unable to get the data, please make sure the settings are correct. zero: No Comment + image: image + link: link + code: code card_toc: Catalog date_suffix: diff --git a/languages/en.yml b/languages/en.yml index ae08d27..40aabfb 100644 --- a/languages/en.yml +++ b/languages/en.yml @@ -13,6 +13,8 @@ page: category: Category archives: Archives +card_post_count: comments + sticky: Sticky no_title: No title @@ -30,6 +32,7 @@ post: copyright_notice: Copyright Notice copyright_content: 'All articles in this blog are licensed under %s unless stating additionally.' recommend: Related Articles + edit: Edited on search: Search algolia_search: @@ -74,6 +77,9 @@ aside: loading_text: loading... error: Unable to get the data, please make sure the settings are correct. zero: No Comment + image: image + link: link + code: code card_toc: Catalog date_suffix: diff --git a/languages/zh-CN.yml b/languages/zh-CN.yml index 753fc14..a48bf3e 100644 --- a/languages/zh-CN.yml +++ b/languages/zh-CN.yml @@ -13,6 +13,8 @@ page: category: 分类 archives: 归档 +card_post_count: 条评论 + sticky: 置顶 no_title: 无题 @@ -31,6 +33,7 @@ post: copyright_content: '本博客所有文章除特别声明外,均采用 %s 许可协议。转载请注明来自 %s!' recommend: 相关推荐 + edit: 编辑 search: 搜索 algolia_search: @@ -75,6 +78,9 @@ aside: loading_text: 正在加载中... error: 无法获取评论,请确认相关配置是否正确 zero: 没有评论 + image: 图片 + link: 链接 + code: 代码 card_toc: 目录 date_suffix: diff --git a/languages/zh-TW.yml b/languages/zh-TW.yml index 21c4cda..2356331 100644 --- a/languages/zh-TW.yml +++ b/languages/zh-TW.yml @@ -13,6 +13,8 @@ page: category: 分類 archives: 歸檔 +card_post_count: 條評論 + sticky: 置頂 no_title: 無題 @@ -20,7 +22,7 @@ post: created: 發表於 updated: 更新於 wordcount: 字數總計 - min2read: 閲讀時長 + min2read: 閱讀時長 min2read_unit: 分鐘 page_pv: 閱讀量 comments: 評論數 @@ -31,6 +33,7 @@ post: copyright_content: '本部落格所有文章除特別聲明外,均採用 %s 許可協議。轉載請註明來自 %s!' recommend: 相關推薦 + edit: 編輯 search: 搜尋 algolia_search: @@ -72,9 +75,12 @@ aside: more_button: 檢視更多 card_newest_comments: headline: 最新評論 - loading_text: 正在加載中... + loading_text: 正在載入中... error: 無法獲取評論,請確認相關配置是否正確 zero: 沒有評論 + image: 圖片 + link: 連結 + code: 代碼 card_toc: 目錄 date_suffix: diff --git a/layout/404.pug b/layout/404.pug index 364b7cf..e4b46e4 100644 --- a/layout/404.pug +++ b/layout/404.pug @@ -1,5 +1,5 @@ - var top_img = theme.error_404.background || theme.default_top_img -- var bg_img = `background-image: url(${url_for(top_img)})` +- var bg_img = `background-image: url('${url_for(top_img)}')` doctype html html(lang=config.language data-theme=theme.display_mode) @@ -7,7 +7,7 @@ html(lang=config.language data-theme=theme.display_mode) include includes/head.pug body if theme.preloader - !=partial('includes/loading/loading', {}, {cache:theme.fragment_cache}) + !=partial('includes/loading/loading', {}, {cache: true}) if theme.fireworks && theme.fireworks.enable canvas.fireworks diff --git a/layout/category.pug b/layout/category.pug index 01ad990..5dc21d5 100644 --- a/layout/category.pug +++ b/layout/category.pug @@ -11,4 +11,4 @@ block content #category .article-sort-title= _p('page.category') + ' - ' + page.category +articleSort(page.posts) - include includes/pagination.pug \ No newline at end of file + include includes/pagination.pug \ No newline at end of file diff --git a/layout/includes/additional-js.pug b/layout/includes/additional-js.pug index 523655b..d125cd7 100644 --- a/layout/includes/additional-js.pug +++ b/layout/includes/additional-js.pug @@ -2,7 +2,7 @@ div script(src=url_for(theme.CDN.utils)) script(src=url_for(theme.CDN.main)) - if theme.translate && theme.translate.enable + if theme.translate.enable script(src=url_for(theme.CDN.translate)) if theme.medium_zoom @@ -14,11 +14,11 @@ div if theme.lazyload.enable script(src=url_for(theme.CDN.lazyload)) - if (theme.snackbar && theme.snackbar.enable) + if theme.snackbar.enable script(src=url_for(theme.CDN.snackbar)) - if theme.pangu && theme.pangu.enable - !=partial('includes/third-party/pangu.pug', {}, {cache:theme.fragment_cache}) + if theme.pangu.enable + !=partial('includes/third-party/pangu.pug', {}, {cache: true}) //- search if theme.algolia_search.enable @@ -27,10 +27,13 @@ div script(src=url_for(theme.CDN.local_search)) if theme.preloader - !=partial('includes/loading/loading-js', {}, {cache:theme.fragment_cache}) + !=partial('includes/loading/loading-js', {}, {cache: true}) .js-pjax - if theme.subtitle.enable && is_home() && theme.index_img !== false + if needLoadCountJs + !=partial('includes/third-party/card-post-count/index', {}, {cache: true}) + + if loadSubJs include ./third-party/subtitle.pug include ./third-party/math/index.pug @@ -38,22 +41,19 @@ div if commentsJsLoad include ./third-party/comments/js.pug - if theme.busuanzi.site_uv || theme.busuanzi.site_pv || theme.busuanzi.page_pv - script(async src=url_for(theme.CDN.busuanzi)) - - !=partial('includes/third-party/prismjs', {}, {cache:theme.fragment_cache}) + !=partial('includes/third-party/prismjs', {}, {cache: true}) if theme.aside.enable && theme.newest_comments.enable if theme.pjax.enable - !=partial('includes/third-party/newest-comments/index', {}, {cache:theme.fragment_cache}) + !=partial('includes/third-party/newest-comments/index', {}, {cache: true}) else if (!is_post() && page.aside !== false) - !=partial('includes/third-party/newest-comments/index', {}, {cache:theme.fragment_cache}) + !=partial('includes/third-party/newest-comments/index', {}, {cache: true}) !=fragment_cache('injectBottom', function(){return injectHtml(theme.inject.bottom)}) - !=partial('includes/third-party/effect', {}, {cache:theme.fragment_cache}) + !=partial('includes/third-party/effect', {}, {cache: true}) - !=partial('includes/third-party/chat/index', {}, {cache:theme.fragment_cache}) + !=partial('includes/third-party/chat/index', {}, {cache: true}) if theme.aplayerInject && theme.aplayerInject.enable if theme.pjax.enable || theme.aplayerInject.per_page @@ -62,7 +62,7 @@ div include ./third-party/aplayer.pug if theme.pjax.enable - !=partial('includes/third-party/pjax', {}, {cache:theme.fragment_cache}) - - !=partial('includes/third-party/baidu_push', {}, {cache:theme.fragment_cache}) - \ No newline at end of file + !=partial('includes/third-party/pjax', {}, {cache: true}) + + if theme.busuanzi.site_uv || theme.busuanzi.site_pv || theme.busuanzi.page_pv + script(async data-pjax src=url_for(theme.CDN.busuanzi)) diff --git a/layout/includes/head.pug b/layout/includes/head.pug index 886053e..35b95c3 100644 --- a/layout/includes/head.pug +++ b/layout/includes/head.pug @@ -29,10 +29,6 @@ meta(name="copyright" content=pageCopyright) meta(name ="format-detection" content="telephone=no") meta(name="theme-color" content=themeColor) -if theme.disable_baidu_transformation - meta(http-equiv="Cache-Control" content="no-transform") - meta(http-equiv="Cache-Control" content="no-siteapp") - //- Open_Graph include ./head/Open_Graph.pug @@ -40,14 +36,14 @@ include ./head/Open_Graph.pug link(rel="canonical" href=urlNoIndex()) //- 預解析 -!=partial('includes/head/preconnect', {}, {cache:theme.fragment_cache}) +!=partial('includes/head/preconnect', {}, {cache: true}) //- 網站驗證 -!=partial('includes/head/site_verification', {}, {cache:theme.fragment_cache}) +!=partial('includes/head/site_verification', {}, {cache: true}) //- PWA if (theme.pwa && theme.pwa.enable) - !=partial('includes/head/pwa', {}, {cache:theme.fragment_cache}) + !=partial('includes/head/pwa', {}, {cache: true}) //- main css link(rel='stylesheet', href=url_for(theme.CDN.main_css)) @@ -61,21 +57,21 @@ if theme.algolia_search.enable script(src=url_for(theme.CDN.algolia_search) defer) //- google_adsense -!=partial('includes/head/google_adsense', {}, {cache:theme.fragment_cache}) +!=partial('includes/head/google_adsense', {}, {cache: true}) //- analytics -!=partial('includes/head/analytics', {}, {cache:theme.fragment_cache}) +!=partial('includes/head/analytics', {}, {cache: true}) //- font if theme.blog_title_font && theme.blog_title_font.font_link link(rel='stylesheet' href=url_for(theme.blog_title_font.font_link) media="print" onload="this.media='all'") //- global config -!=partial('includes/head/config', {}, {cache:theme.fragment_cache}) +!=partial('includes/head/config', {}, {cache: true}) include ./head/config_site.pug include ./head/noscript.pug -!=partial('includes/head/js', {}, {cache:theme.fragment_cache}) +!=fragment_cache('injectHeadJs', function(){return inject_head_js()}) !=fragment_cache('injectHead', function(){return injectHtml(theme.inject.head)}) \ No newline at end of file diff --git a/layout/includes/head/config.pug b/layout/includes/head/config.pug index 6ed3d8e..710345d 100644 --- a/layout/includes/head/config.pug +++ b/layout/includes/head/config.pug @@ -83,7 +83,7 @@ } script. - var GLOBAL_CONFIG = { + const GLOBAL_CONFIG = { root: '!{config.root}', algolia: !{algolia}, localSearch: !{localSearch}, @@ -124,47 +124,4 @@ script. isPhotoFigcaption: !{theme.photofigcaption}, islazyload: !{theme.lazyload.enable}, isanchor: !{theme.anchor} - }; - - var saveToLocal = { - set: function setWithExpiry(key, value, ttl) { - const now = new Date() - const expiryDay = ttl * 86400000 - const item = { - value: value, - expiry: now.getTime() + expiryDay, - } - localStorage.setItem(key, JSON.stringify(item)) - }, - - get: function getWithExpiry(key) { - const itemStr = localStorage.getItem(key) - - if (!itemStr) { - return undefined - } - const item = JSON.parse(itemStr) - const now = new Date() - - if (now.getTime() > item.expiry) { - localStorage.removeItem(key) - return undefined - } - return item.value - } } - - // https://stackoverflow.com/questions/16839698/jquery-getscript-alternative-in-native-javascript - const getScript = url => new Promise((resolve, reject) => { - const script = document.createElement('script') - script.src = url - script.async = true - script.onerror = reject - script.onload = script.onreadystatechange = function() { - const loadState = this.readyState - if (loadState && loadState !== 'loaded' && loadState !== 'complete') return - script.onload = script.onreadystatechange = null - resolve() - } - document.head.appendChild(script) - }) \ No newline at end of file diff --git a/layout/includes/head/config_site.pug b/layout/includes/head/config_site.pug index 98c3d22..1b951be 100644 --- a/layout/includes/head/config_site.pug +++ b/layout/includes/head/config_site.pug @@ -8,7 +8,7 @@ var showToc = is_post() && theme.aside.enable && pageToc && (toc(page.content) !== '' || page.encrypt == true ) - -script#config_change +script#config-diff . var GLOBAL_CONFIG_SITE = { isPost: !{is_post()}, diff --git a/layout/includes/head/js.pug b/layout/includes/head/js.pug deleted file mode 100644 index 09044df..0000000 --- a/layout/includes/head/js.pug +++ /dev/null @@ -1,71 +0,0 @@ -script - | (function () { - - if theme.darkmode.enable - | window.activateDarkMode = function () { - | document.documentElement.setAttribute('data-theme', 'dark') - | if (document.querySelector('meta[name="theme-color"]') !== null) { - | document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d') - | } - | } - | window.activateLightMode = function () { - | document.documentElement.setAttribute('data-theme', 'light') - | if (document.querySelector('meta[name="theme-color"]') !== null) { - | document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff') - | } - | } - - | const autoChangeMode = '#{theme.darkmode.autoChangeMode}' - | const t = saveToLocal.get('theme') - | if (autoChangeMode === '1') { - | const isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches - | const isLightMode = window.matchMedia('(prefers-color-scheme: light)').matches - | const isNotSpecified = window.matchMedia('(prefers-color-scheme: no-preference)').matches - | const hasNoSupport = !isDarkMode && !isLightMode && !isNotSpecified - - | if (t === undefined) { - | if (isLightMode) activateLightMode() - | else if (isDarkMode) activateDarkMode() - | else if (isNotSpecified || hasNoSupport) { - | const now = new Date() - | const hour = now.getHours() - | const isNight = hour <= 6 || hour >= 18 - | isNight ? activateDarkMode() : activateLightMode() - | } - | window.matchMedia('(prefers-color-scheme: dark)').addListener(function (e) { - | if (saveToLocal.get('theme') === undefined) { - | e.matches ? activateDarkMode() : activateLightMode() - | } - | }) - | } else if (t === 'light') activateLightMode() - | else activateDarkMode() - | } else if (autoChangeMode === '2') { - | const now = new Date() - | const hour = now.getHours() - | const isNight = hour <= 6 || hour >= 18 - | if (t === undefined) isNight ? activateDarkMode() : activateLightMode() - | else if (t === 'light') activateLightMode() - | else activateDarkMode() - | } else { - | if (t === 'dark') activateDarkMode() - | else if (t === 'light') activateLightMode() - | } - - if theme.aside.enable && theme.aside.button - | const asideStatus = saveToLocal.get('aside-status') - | if (asideStatus !== undefined) { - | if (asideStatus === 'hide') { - | document.documentElement.classList.add('hide-aside') - | } else { - | document.documentElement.classList.remove('hide-aside') - | } - | } - - if theme.change_font_size - | const fontSizeVal = saveToLocal.get('global-font-size') - | if (fontSizeVal !== undefined) { - | document.documentElement.style.setProperty('--global-font-size', fontSizeVal + 'px') - | } - - | })() - diff --git a/layout/includes/head/preconnect.pug b/layout/includes/head/preconnect.pug index 98c5983..73231c7 100644 --- a/layout/includes/head/preconnect.pug +++ b/layout/includes/head/preconnect.pug @@ -22,7 +22,4 @@ if theme.blog_title_font && theme.blog_title_font.font_link && theme.blog_title_ link(rel="preconnect" href="//fonts.googleapis.com" crossorigin='') if theme.busuanzi.site_uv || theme.busuanzi.site_pv || theme.busuanzi.page_pv - link(rel="preconnect" href="//busuanzi.ibruce.info") - -if theme.baidu_push - link(rel="preconnect" href="//zz.bdstatic.com") + link(rel="preconnect" href="//busuanzi.ibruce.info") \ No newline at end of file diff --git a/layout/includes/header/index.pug b/layout/includes/header/index.pug index 4fe2e2c..ed02549 100644 --- a/layout/includes/header/index.pug +++ b/layout/includes/header/index.pug @@ -1,4 +1,4 @@ -if page.top_img !== false +if !theme.disable_top_img && page.top_img !== false if is_post() - var top_img = page.top_img || page.cover || page.randomcover || theme.default_top_img else if is_page() @@ -17,27 +17,29 @@ if page.top_img !== false - var top_img = page.top_img || theme.default_top_img if top_img !== false - - var imgSource = top_img && top_img.indexOf('/') !== -1 ? `background-image: url(${url_for(top_img)})` : `background: ${top_img}` + - var imgSource = top_img && top_img.indexOf('/') !== -1 ? `background-image: url('${url_for(top_img)}')` : `background: ${top_img}` - var bg_img = top_img ? imgSource : '' - var site_title = is_archive() ? _p('page.archives') : page.title || page.tag || page.category || config.title - - var isHomeClass = is_home() ? 'full_page' : 'not-index-bg' + - var isHomeClass = is_home() ? 'full_page' : 'not-home-page' - is_post() ? isHomeClass = 'post-bg' : isHomeClass else - - var isHomeClass = 'no-top-img' + - var isHomeClass = 'not-top-img' else - var top_img = false - - var isHomeClass = 'no-top-img' + - var isHomeClass = 'not-top-img' header#page-header(class=isHomeClass style=bg_img) - !=partial('includes/header/nav', {}, {cache:theme.fragment_cache}) + !=partial('includes/header/nav', {}, {cache: true}) if top_img !== false if is_post() include ./post-info.pug else if is_home() #site-info h1#site-title=site_title - #site-subtitle - span#subtitle + if theme.subtitle.enable + - var loadSubJs = true + #site-subtitle + span#subtitle if(theme.social) #site_social_icons !=fragment_cache('social', function(){return partial('includes/header/social')}) @@ -45,4 +47,4 @@ header#page-header(class=isHomeClass style=bg_img) i.fas.fa-angle-down.scroll-down-effects else #page-site-info - h1#site-title=site_title + h1#site-title=site_title \ No newline at end of file diff --git a/layout/includes/header/post-info.pug b/layout/includes/header/post-info.pug index 9639512..7e2d4c1 100644 --- a/layout/includes/header/post-info.pug +++ b/layout/includes/header/post-info.pug @@ -1,6 +1,9 @@ #post-info h1.post-title= page.title || _p('no_title') - + if theme.post_edit.enable + a.post-edit-link(href=theme.post_edit.url + page.source title=_p('post.edit') target="_blank") + i.fas.fa-pencil-alt + #post-meta .meta-firstline if (theme.post_meta.post.date_type) diff --git a/layout/includes/layout.pug b/layout/includes/layout.pug index e9d68fe..6d2cc2c 100644 --- a/layout/includes/layout.pug +++ b/layout/includes/layout.pug @@ -8,12 +8,12 @@ html(lang=config.language data-theme=theme.display_mode class=htmlClassHideAside include ./head.pug body if theme.preloader - !=partial('includes/loading/loading', {}, {cache:theme.fragment_cache}) + !=partial('includes/loading/loading', {}, {cache: true}) if theme.background #web_bg - !=partial('includes/sidebar', {}, {cache:theme.fragment_cache}) + !=partial('includes/sidebar', {}, {cache: true}) #body-wrap(class=pageType) include ./header/index.pug @@ -31,13 +31,13 @@ html(lang=config.language data-theme=theme.display_mode class=htmlClassHideAside if (footerBg === true) - var footer_bg = bg_img else - - var footer_bg = theme.footer_bg.indexOf('/') !== -1 ? `background-image: url(${url_for(footerBg)})` : `background: ${footerBg}` + - var footer_bg = theme.footer_bg.indexOf('/') !== -1 ? `background-image: url('${url_for(footerBg)}')` : `background: ${footerBg}` else - var footer_bg = '' footer#footer(style=footer_bg) - !=partial('includes/footer', {}, {cache:theme.fragment_cache}) + !=partial('includes/footer', {}, {cache: true}) include ./rightside.pug - !=partial('includes/third-party/search/index', {}, {cache:theme.fragment_cache}) + !=partial('includes/third-party/search/index', {}, {cache: true}) include ./additional-js.pug \ No newline at end of file diff --git a/layout/includes/loading/loading-js.pug b/layout/includes/loading/loading-js.pug index 6bf7f2d..7e5f0d4 100644 --- a/layout/includes/loading/loading-js.pug +++ b/layout/includes/loading/loading-js.pug @@ -10,4 +10,4 @@ script. } } - window.addEventListener('load',()=> {preloader.endLoading()}) \ No newline at end of file + window.addEventListener('load',preloader.endLoading()) \ No newline at end of file diff --git a/layout/includes/mixins/post-ui.pug b/layout/includes/mixins/post-ui.pug index b436dff..4d8778a 100644 --- a/layout/includes/mixins/post-ui.pug +++ b/layout/includes/mixins/post-ui.pug @@ -18,7 +18,7 @@ mixin postUI(posts) .article-meta-wrap if (is_home() && (article.top || article.sticky > 0)) span.article-meta - i.fas.fa-thumbtack.article-meta__icon.sticky + i.fas.fa-thumbtack.sticky span.sticky= _p('sticky') span.article-meta__separator | if (theme.post_meta.page.date_type) @@ -42,7 +42,7 @@ mixin postUI(posts) if (theme.post_meta.page.categories && article.categories.data.length > 0) span.article-meta span.article-meta__separator | - i.fas.fa-inbox.article-meta__icon + i.fas.fa-inbox each item, index in article.categories.data a(href=url_for(item.path)).article-meta__categories #[=item.name] if (index < article.categories.data.length - 1) @@ -50,11 +50,42 @@ mixin postUI(posts) if (theme.post_meta.page.tags && article.tags.data.length > 0) span.article-meta.tags span.article-meta__separator | - i.fas.fa-tag.article-meta__icon + i.fas.fa-tag each item, index in article.tags.data a(href=url_for(item.path)).article-meta__tags #[=item.name] if (index < article.tags.data.length - 1) span.article-meta__link #[='•'] + + mixin countBlockInIndex + - needLoadCountJs = true + span.article-meta + span.article-meta__separator | + i.fas.fa-comments + if block + block + span.article-meta-label= ' ' + _p('card_post_count') + + if theme.comments.card_post_count + case theme.comments.use[0] + when 'Disqus' + when 'Disqusjs' + +countBlockInIndex + a(href=full_url_for(link) + '#disqus_thread') + when 'Valine' + +countBlockInIndex + a(href=url_for(link) + '#post-comment' itemprop="discussionUrl") + span.valine-comment-count(data-xid=url_for(link) itemprop="commentCount") + when 'Waline' + +countBlockInIndex + a(href=url_for(link) + '#post-comment') + span.waline-comment-count(id=url_for(link)) + when 'Twikoo' + +countBlockInIndex + a.twikoo-count(href=url_for(link) + '#post-comment') + when 'Facebook Comments' + +countBlockInIndex + a(href=url_for(link) + '#post-comment') + span.fb-comments-count(data-href=urlNoIndex(article.permalink)) //- Display the article introduction on homepage case theme.index_post_content.method diff --git a/layout/includes/page/flink.pug b/layout/includes/page/flink.pug index 48bcf32..456d3b7 100644 --- a/layout/includes/page/flink.pug +++ b/layout/includes/page/flink.pug @@ -1,19 +1,23 @@ -.flink#article-container - if site.data.link - each i in site.data.link - if i.class_name - h2!= i.class_name - if i.class_desc - .flink-desc!=i.class_desc - .flink-list - each item in i.link_list - .flink-list-item - a(href=url_for(item.link) title=item.name target="_blank") - if theme.lazyload.enable - img(data-lazy-src=url_for(item.avatar) onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'` alt=item.name ) - else - img(src=url_for(item.avatar) onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'` alt=item.name ) - span.flink-item-name= item.name - span.flink-item-desc(title=item.descr)= item.descr - != page.content +#article-container + if top_img === false + h1.page-title= page.title + + .flink + if site.data.link + each i in site.data.link + if i.class_name + h2!= i.class_name + if i.class_desc + .flink-desc!=i.class_desc + .flink-list + each item in i.link_list + .flink-list-item + a(href=url_for(item.link) title=item.name target="_blank") + if theme.lazyload.enable + img(data-lazy-src=url_for(item.avatar) onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'` alt=item.name ) + else + img(src=url_for(item.avatar) onerror=`this.onerror=null;this.src='` + url_for(theme.error_img.flink) + `'` alt=item.name ) + span.flink-item-name= item.name + span.flink-item-desc(title=item.descr)= item.descr + != page.content diff --git a/layout/includes/pagination.pug b/layout/includes/pagination.pug index 488055c..86f0faf 100644 --- a/layout/includes/pagination.pug +++ b/layout/includes/pagination.pug @@ -11,29 +11,31 @@ if(!is_post()) div.pagination !=paginator(options) else + - let prev = theme.post_pagination === 1 ? page.prev : page.next + - let next = theme.post_pagination === 1 ? page.next : page.prev nav#pagination.pagination-post - if(page.prev) - - var hasPageNext = page.next ? 'pull-left' : 'pull-full' + if(prev) + - var hasPageNext = next ? 'pull-left' : 'pull-full' .prev-post(class=hasPageNext) - - var pagination_cover = page.prev.cover === false ? page.prev.randomcover : page.prev.cover - a(href=url_for(page.prev.path)) + - var pagination_cover = prev.cover === false ? prev.randomcover : prev.cover + a(href=url_for(prev.path)) if theme.lazyload.enable img.prev-cover(data-lazy-src=url_for(pagination_cover) onerror=`onerror=null;src='${url_for(theme.error_img.post_page)}'` alt='cover of previous post') else img.prev-cover(src=url_for(pagination_cover) onerror=`onerror=null;src='${url_for(theme.error_img.post_page)}'` alt='cover of previous post') .pagination-info .label=_p('pagination.prev') - .prev_info=page.prev.title + .prev_info=prev.title - if(page.next) - - var hasPagePrev = page.prev ? 'pull-right' : 'pull-full' - - var pagination_cover = page.next.cover == false ? page.next.randomcover : page.next.cover + if(next) + - var hasPagePrev = prev ? 'pull-right' : 'pull-full' + - var pagination_cover = next.cover == false ? next.randomcover : next.cover .next-post(class=hasPagePrev) - a(href=url_for(page.next.path)) + a(href=url_for(next.path)) if theme.lazyload.enable img.next-cover(data-lazy-src=url_for(pagination_cover) onerror=`onerror=null;src='${url_for(theme.error_img.post_page)}'` alt='cover of next post') else img.next-cover(src=url_for(pagination_cover) onerror=`onerror=null;src='${url_for(theme.error_img.post_page)}'` alt='cover of next post') .pagination-info .label=_p('pagination.next') - .next_info=page.next.title \ No newline at end of file + .next_info=next.title \ No newline at end of file diff --git a/layout/includes/post/reward.pug b/layout/includes/post/reward.pug index 1bf9381..0d6a584 100644 --- a/layout/includes/post/reward.pug +++ b/layout/includes/post/reward.pug @@ -1,16 +1,16 @@ .post-reward - .reward-button + .reward-button.button--animated i.fas.fa-qrcode = ' ' + _p('donate') - .reward-main - ul.reward-all - each item in theme.reward.QR_code - - var clickTo = (item.itemlist||item).link ? (item.itemlist||item).link : (item.itemlist||item).img - li.reward-item - a(href=clickTo target='_blank') - if theme.lazyload.enable - img.post-qr-code-img(data-lazy-src=url_for((item.itemlist||item).img) alt=(item.itemlist||item).text) - else - img.post-qr-code-img(src=url_for((item.itemlist||item).img) alt=(item.itemlist||item).text) - .post-qr-code-desc=(item.itemlist||item).text + .reward-main + ul.reward-all + each item in theme.reward.QR_code + - var clickTo = item.link ? item.link : item.img + li.reward-item + a(href=url_for(clickTo) target='_blank') + if theme.lazyload.enable + img.post-qr-code-img(data-lazy-src=url_for(item.img) alt=item.text) + else + img.post-qr-code-img(src=url_for(item.img) alt=item.text) + .post-qr-code-desc=item.text diff --git a/layout/includes/third-party/baidu_push.pug b/layout/includes/third-party/baidu_push.pug deleted file mode 100644 index ac87a7b..0000000 --- a/layout/includes/third-party/baidu_push.pug +++ /dev/null @@ -1,15 +0,0 @@ -if theme.baidu_push - script. - (function(){ - const bp = document.createElement('script'); - const curProtocol = window.location.protocol.split(':')[0]; - if (curProtocol === 'https') { - bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; - } - else{ - bp.src = 'http://push.zhanzhang.baidu.com/push.js'; - } - bp.dataset.pjax = '' - const s = document.getElementsByTagName("script")[0]; - s.parentNode.insertBefore(bp, s); - })() \ No newline at end of file diff --git a/layout/includes/third-party/card-post-count/disqus.pug b/layout/includes/third-party/card-post-count/disqus.pug new file mode 100644 index 0000000..1dfe327 --- /dev/null +++ b/layout/includes/third-party/card-post-count/disqus.pug @@ -0,0 +1,16 @@ +script. + (() => { + const getCount = () => { + if (window.DISQUSWIDGETS === undefined) { + var d = document, s = d.createElement('script'); + s.src = 'https://!{theme.disqus.shortname}.disqus.com/count.js'; + s.id = 'dsq-count-scr'; + (d.head || d.body).appendChild(s); + } else { + DISQUSWIDGETS.getCount({reset: true}); + } + } + + window.pjax ? getCount() : window.addEventListener('load', getCount) + + })() diff --git a/layout/includes/third-party/card-post-count/fb.pug b/layout/includes/third-party/card-post-count/fb.pug new file mode 100644 index 0000000..3323972 --- /dev/null +++ b/layout/includes/third-party/card-post-count/fb.pug @@ -0,0 +1,15 @@ +script. + (()=>{ + function loadFBComment () { + if (typeof FB === 'object') FB.XFBML.parse() + else { + let ele = document.createElement('script') + ele.setAttribute('src','https://connect.facebook.net/!{theme.facebook_comments.lang}/sdk.js#xfbml=1&version=v9.0') + ele.setAttribute('async', 'true') + ele.setAttribute('defer', 'true') + ele.setAttribute('crossorigin', 'anonymous') + document.body.appendChild(ele) + } + } + window.pjax ? loadFBComment() : window.addEventListener('load', loadFBComment) + })() diff --git a/layout/includes/third-party/card-post-count/index.pug b/layout/includes/third-party/card-post-count/index.pug new file mode 100644 index 0000000..44839b3 --- /dev/null +++ b/layout/includes/third-party/card-post-count/index.pug @@ -0,0 +1,12 @@ +case theme.comments.use[0] + when 'Twikoo' + include ./twikoo.pug + when 'Disqus' + when 'Disqusjs' + include ./disqus.pug + when 'Valine' + include ./valine.pug + when 'Waline' + include ./waline.pug + when 'Facebook Comments' + include ./fb.pug \ No newline at end of file diff --git a/layout/includes/third-party/card-post-count/twikoo.pug b/layout/includes/third-party/card-post-count/twikoo.pug new file mode 100644 index 0000000..46ae7c9 --- /dev/null +++ b/layout/includes/third-party/card-post-count/twikoo.pug @@ -0,0 +1,37 @@ +script. + (() => { + const getCommentUrl = () => { + const eleGroup = document.querySelectorAll('#recent-posts .article-title') + let urlArray = [] + eleGroup.forEach(i=>{ + urlArray.push(i.getAttribute('href')) + }) + return urlArray + } + + const getCount = () => { + const runTwikoo = () => { + twikoo.getCommentsCount({ + envId: '!{theme.twikoo.envId}', + region: '!{theme.twikoo.region}', + urls: getCommentUrl(), + includeReply: false + }).then(function (res) { + document.querySelectorAll('#recent-posts .twikoo-count').forEach((item,index) => { + item.innerText = res[index].count + }) + }).catch(function (err) { + console.log(err) + }) + } + + if (typeof twikoo === 'object') { + runTwikoo() + } else { + getScript('!{theme.CDN.twikoo}').then(runTwikoo) + } + } + + window.pjax ? getCount() : window.addEventListener('load', getCount) + + })() \ No newline at end of file diff --git a/layout/includes/third-party/card-post-count/valine.pug b/layout/includes/third-party/card-post-count/valine.pug new file mode 100644 index 0000000..399151f --- /dev/null +++ b/layout/includes/third-party/card-post-count/valine.pug @@ -0,0 +1,19 @@ +script. + (() => { + function loadValine () { + function initValine () { + let initData = { + el: '#vcomment', + appId: '#{theme.valine.appId}', + appKey: '#{theme.valine.appKey}', + } + + const valine = new Valine(initData) + } + + if (typeof Valine === 'function') initValine() + else getScript('!{url_for(theme.CDN.valine)}').then(initValine) + } + + window.pjax ? loadValine() : window.addEventListener('load', loadValine) + })() diff --git a/layout/includes/third-party/card-post-count/waline.pug b/layout/includes/third-party/card-post-count/waline.pug new file mode 100644 index 0000000..f823c1e --- /dev/null +++ b/layout/includes/third-party/card-post-count/waline.pug @@ -0,0 +1,18 @@ +script. + (() => { + function loadWaline () { + function initWaline () { + let initData = { + el: '#waline-wrap', + serverURL: '!{theme.waline.serverURL}', + } + + const waline = new Waline(initData) + } + + if (typeof Waline === 'function') initWaline() + else getScript('!{url_for(theme.CDN.waline)}').then(initWaline) + } + + window.pjax ? loadWaline() : window.addEventListener('load', loadWaline) + })() diff --git a/layout/includes/third-party/comments/facebook_comments.pug b/layout/includes/third-party/comments/facebook_comments.pug index cf28c34..4075c1e 100644 --- a/layout/includes/third-party/comments/facebook_comments.pug +++ b/layout/includes/third-party/comments/facebook_comments.pug @@ -7,7 +7,7 @@ script. if (typeof FB === 'object') FB.XFBML.parse() else { let ele = document.createElement('script') - ele.setAttribute('src','https://connect.facebook.net/!{theme.facebook_comments.lang}/sdk.js#xfbml=1&version=v7.0') + ele.setAttribute('src','https://connect.facebook.net/!{theme.facebook_comments.lang}/sdk.js#xfbml=1&version=v9.0') ele.setAttribute('async', 'true') ele.setAttribute('defer', 'true') ele.setAttribute('crossorigin', 'anonymous') diff --git a/layout/includes/third-party/comments/js.pug b/layout/includes/third-party/comments/js.pug index 404149b..0b04451 100644 --- a/layout/includes/third-party/comments/js.pug +++ b/layout/includes/third-party/comments/js.pug @@ -1,20 +1,20 @@ each name in theme.comments.use case name when 'Valine' - !=partial('includes/third-party/comments/valine', {}, {cache:theme.fragment_cache}) + !=partial('includes/third-party/comments/valine', {}, {cache: true}) when 'Disqus' include ./disqus.pug when 'Disqusjs' include ./disqusjs.pug when 'Livere' - !=partial('includes/third-party/comments/livere', {}, {cache:theme.fragment_cache}) + !=partial('includes/third-party/comments/livere', {}, {cache: true}) when 'Gitalk' include ./gitalk.pug when 'Utterances' - !=partial('includes/third-party/comments/utterances', {}, {cache:theme.fragment_cache}) + !=partial('includes/third-party/comments/utterances', {}, {cache: true}) when 'Twikoo' - !=partial('includes/third-party/comments/twikoo', {}, {cache:theme.fragment_cache}) + !=partial('includes/third-party/comments/twikoo', {}, {cache: true}) when 'Waline' - !=partial('includes/third-party/comments/waline', {}, {cache:theme.fragment_cache}) + !=partial('includes/third-party/comments/waline', {}, {cache: true}) when 'Facebook Comments' - !=partial('includes/third-party/comments/facebook_comments', {}, {cache:theme.fragment_cache}) + !=partial('includes/third-party/comments/facebook_comments', {}, {cache: true}) diff --git a/layout/includes/third-party/comments/twikoo.pug b/layout/includes/third-party/comments/twikoo.pug index e28233c..d47a5d5 100644 --- a/layout/includes/third-party/comments/twikoo.pug +++ b/layout/includes/third-party/comments/twikoo.pug @@ -21,6 +21,7 @@ script. const getCount = () => { twikoo.getCommentsCount({ envId: '!{theme.twikoo.envId}', + region: '!{theme.twikoo.region}', urls: [window.location.pathname], includeReply: false }).then(function (res) { diff --git a/layout/includes/third-party/math/index.pug b/layout/includes/third-party/math/index.pug index 4ce6692..e91ca85 100644 --- a/layout/includes/third-party/math/index.pug +++ b/layout/includes/third-party/math/index.pug @@ -1,6 +1,6 @@ if theme.mathjax && theme.mathjax.enable if theme.mathjax.per_page - if(!is_tag() && !is_category() && !is_archive() && !is_home()) + if is_post() && is_page() include ./mathjax.pug else if page.mathjax @@ -8,7 +8,7 @@ if theme.mathjax && theme.mathjax.enable if theme.katex && theme.katex.enable if theme.katex.per_page - if(!is_tag() && !is_category() && !is_archive() && !is_home()) + if is_post() && is_page() include ./katex.pug else if page.katex diff --git a/layout/includes/third-party/newest-comments/disqus-comment.pug b/layout/includes/third-party/newest-comments/disqus-comment.pug index 5d900d9..c06d52a 100644 --- a/layout/includes/third-party/newest-comments/disqus-comment.pug +++ b/layout/includes/third-party/newest-comments/disqus-comment.pug @@ -3,9 +3,10 @@ script. const changeContent = (content) => { if (content === '') return content + content = content.replace(/]+>/ig, '[!{_p("aside.card_newest_comments.image")}]') // replace image link + content = content.replace(/]+?href=["']?([^"']+)["']?[^>]*>([^<]+)<\/a>/gi, '[!{_p("aside.card_newest_comments.link")}]') // replace url + content = content.replace(/.*?<\/code>/gi, '[!{_p("aside.card_newest_comments.code")}]') // replace code content = content.replace(/<[^>]+>/g,"") // remove html tag - content = content.replace(/(http(s?):)([/|.|\w|\s|-])*\.(?:jpg|jpeg|gif|png|webp)/g, '') // remove image link - content = content.replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi, '') // remove url if (content.length > 150) { content = content.substring(0,150) + '...' @@ -26,8 +27,8 @@ script. 'date': item.createdAt } }) - // set expiry to 10 min - saveToLocal.set('disqus-newest-comments', JSON.stringify(disqusArray), 10/(60*24)) + + saveToLocal.set('disqus-newest-comments', JSON.stringify(disqusArray), !{theme.newest_comments.storage}/(60*24)) generateHtml(disqusArray) }).catch(e => { const $dom = document.querySelector('#card-newest-comments .aside-list') @@ -43,10 +44,7 @@ script. result += '
' if (!{theme.newest_comments.avatar}) { - let name = 'src' - if(!{theme.lazyload.enable}) { - name = 'data-lazy-src' - } + const name = '!{theme.lazyload.enable ? "data-lazy-src" : "src"}' result += `${array[i].nick}` } diff --git a/layout/includes/third-party/newest-comments/github-issues.pug b/layout/includes/third-party/newest-comments/github-issues.pug index 03bb331..e561f95 100644 --- a/layout/includes/third-party/newest-comments/github-issues.pug +++ b/layout/includes/third-party/newest-comments/github-issues.pug @@ -3,9 +3,10 @@ script. const changeContent = (content) => { if (content === '') return content + content = content.replace(/]+>/ig, '[!{_p("aside.card_newest_comments.image")}]') // replace image link + content = content.replace(/]+?href=["']?([^"']+)["']?[^>]*>([^<]+)<\/a>/gi, '[!{_p("aside.card_newest_comments.link")}]') // replace url + content = content.replace(/
.*?<\/pre>/gi, '[!{_p("aside.card_newest_comments.code")}]') // replace code
       content = content.replace(/<[^>]+>/g,"") // remove html tag
-      content = content.replace(/(http(s?):)([/|.|\w|\s|-])*\.(?:jpg|jpeg|gif|png|webp)/g, '') // remove image link
-      content = content.replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi, '') // remove url
 
       if (content.length > 150) {
         content = content.substring(0,150) + '...'
@@ -13,21 +14,50 @@ script.
       return content
     }
 
+    const findTrueUrl = (array) => {
+      let url = ''
+      Promise.all(array.map(item =>
+        fetch(item.url).then(resp => resp.json()).then(data => {
+          if (data.user.login === 'utterances-bot') {
+            url = data.body.match(/https?\:\/\/[^\" ]+/ig).slice(-1)
+            return url[0]
+          } else {
+            url = data.body.match(/https?\:\/\/[^\" ]+/i)
+            return url[0]
+          }
+        })
+      )).then(res => {
+          array = array.map((i,index)=> {
+            return {
+              ...i,
+              url: res[index]
+            }
+          })
+
+          saveToLocal.set('github-newest-comments', JSON.stringify(array), !{theme.newest_comments.storage}/(60*24))
+          generateHtml(array)
+      });
+    }
+
     const getComment = () => {
-      fetch('https://api.github.com/repos/!{theme.newest_comments.github_issues.repo}/issues/comments?sort=updated&direction=desc&per_page=!{theme.newest_comments.limit}&page=1')
+      fetch('https://api.github.com/repos/!{theme.newest_comments.github_issues.repo}/issues/comments?sort=updated&direction=desc&per_page=!{theme.newest_comments.limit}&page=1',{
+        "headers": {
+          Accept: 'application/vnd.github.v3.html+json'
+        }
+      })
         .then(response => response.json())
         .then(data => {
           const githubArray = data.map(item => {
             return {
               'avatar': item.user.avatar_url,
-              'content': changeContent(item.body),
+              'content': changeContent(item.body_html),
               'nick': item.user.login,
-              'url': item.html_url,
-              'date': item.updated_at
+              'url': item.issue_url,
+              'date': item.updated_at,
+              'githubUrl': item.html_url
             }
           })
-          saveToLocal.set('github-newest-comments', JSON.stringify(githubArray), 10/(60*24))
-          generateHtml(githubArray)
+          findTrueUrl(githubArray)
         }).catch(e => {
           const $dom = document.querySelector('#card-newest-comments .aside-list')
           $dom.innerHTML= "!{_p('aside.card_newest_comments.error')}"
@@ -42,16 +72,13 @@ script.
           result += '
' if (!{theme.newest_comments.avatar}) { - let name = 'src' - if(!{theme.lazyload.enable}) { - name = 'data-lazy-src' - } - result += `${array[i].nick}` + const name = '!{theme.lazyload.enable ? "data-lazy-src" : "src"}' + result += `${array[i].nick}` } result += `
${array[i].content} -
${array[i].nick}
+
${array[i].nick} /
` } } else { diff --git a/layout/includes/third-party/newest-comments/twikoo-comment.pug b/layout/includes/third-party/newest-comments/twikoo-comment.pug index 13fdea4..d8cea8c 100644 --- a/layout/includes/third-party/newest-comments/twikoo-comment.pug +++ b/layout/includes/third-party/newest-comments/twikoo-comment.pug @@ -3,9 +3,10 @@ script. const changeContent = (content) => { if (content === '') return content + content = content.replace(/]+>/ig, '[!{_p("aside.card_newest_comments.image")}]') // replace image link + content = content.replace(/]+?href=["']?([^"']+)["']?[^>]*>([^<]+)<\/a>/gi, '[!{_p("aside.card_newest_comments.link")}]') // replace url + content = content.replace(/
.*?<\/pre>/gi, '[!{_p("aside.card_newest_comments.code")}]') // replace code
       content = content.replace(/<[^>]+>/g,"") // remove html tag
-      content = content.replace(/(http(s?):)([/|.|\w|\s|-])*\.(?:jpg|jpeg|gif|png|webp)/g, '') // remove image link
-      content = content.replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi, '') // remove url
 
       if (content.length > 150) {
         content = content.substring(0,150) + '...'
@@ -21,8 +22,18 @@ script.
           pageSize: !{theme.newest_comments.limit},
           includeReply: true
         }).then(function (res) {
-          saveToLocal.set('twikoo-newest-comments', JSON.stringify(res), 10/(60*24))
-          generateHtml(res)
+          const twikooArray = res.map(e => {
+            return {
+              'content': changeContent(e.comment),
+              'avatar': e.avatar,
+              'nick': e.nick,
+              'url': e.url + '#' + e.id,
+              'date': new Date(e.created).toISOString()
+            }
+          })
+
+          saveToLocal.set('twikoo-newest-comments', JSON.stringify(twikooArray), !{theme.newest_comments.storage}/(60*24))
+          generateHtml(twikooArray)
         }).catch(function (err) {
           const $dom = document.querySelector('#card-newest-comments .aside-list')
           $dom.innerHTML= "!{_p('aside.card_newest_comments.error')}"
@@ -44,16 +55,13 @@ script.
           result += '
' if (!{theme.newest_comments.avatar}) { - let name = 'src' - if(!{theme.lazyload.enable}) { - name = 'data-lazy-src' - } - result += `${array[i].nick}` + const name = '!{theme.lazyload.enable ? "data-lazy-src" : "src"}' + result += `${array[i].nick}` } result += `
- ${changeContent(array[i].commentText)} -
${array[i].nick}
+ ${array[i].content} +
${array[i].nick} /
` } } else { diff --git a/layout/includes/third-party/newest-comments/valine.pug b/layout/includes/third-party/newest-comments/valine.pug index 98c195d..809da74 100644 --- a/layout/includes/third-party/newest-comments/valine.pug +++ b/layout/includes/third-party/newest-comments/valine.pug @@ -6,9 +6,10 @@ script. const changeContent = (content) => { if (content === '') return content + content = content.replace(/]+>/ig, '[!{_p("aside.card_newest_comments.image")}]') // replace image link + content = content.replace(/]+?href=["']?([^"']+)["']?[^>]*>([^<]+)<\/a>/gi, '[!{_p("aside.card_newest_comments.link")}]') // replace url + content = content.replace(/
.*?<\/pre>/gi, '[!{_p("aside.card_newest_comments.code")}]') // replace code
       content = content.replace(/<[^>]+>/g,"") // remove html tag
-      content = content.replace(/(http(s?):)([/|.|\w|\s|-])*\.(?:jpg|jpeg|gif|png|webp)/g, '') // remove image link
-      content = content.replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi, '') // remove url
 
       if (content.length > 150) {
         content = content.substring(0,150) + '...'
@@ -18,7 +19,6 @@ script.
 
     const getIcon = (icon, mail) => {
       if (icon) return icon
-      
       let defaultIcon = '!{ default_avatar ? `?d=${default_avatar}` : ''}'
       let iconUrl = `https://gravatar.loli.net/avatar/${md5(mail.toLowerCase()) + defaultIcon}`
       return iconUrl
@@ -32,16 +32,13 @@ script.
           result += '
' if (!{theme.newest_comments.avatar}) { - let name = 'src' - if(!{theme.lazyload.enable}) { - name = 'data-lazy-src' - } - result += `${array[i].nick}` + const name = '!{theme.lazyload.enable ? "data-lazy-src" : "src"}' + result += `${array[i].nick}` } result += `
${array[i].content} -
${array[i].nick}
+
${array[i].nick} /
` } } else { @@ -55,12 +52,7 @@ script. } const getComment = () => { - let serverURL = '' - if (!{Boolean(theme.valine.serverURLs)}) { - serverURL = '!{theme.valine.serverURLs}' - } else { - serverURL = 'https://!{theme.valine.appId.substring(0,8)}.api.lncldglobal.com' - } + const serverURL = '!{theme.valine.serverURLs || `https://${theme.valine.appId.substring(0,8)}.api.lncldglobal.com` }' var settings = { "method": "GET", @@ -76,15 +68,14 @@ script. .then(data => { const valineArray = data.results.map(function (e) { return { - 'avatar': e.QQAvatar, + 'avatar': getIcon(e.QQAvatar, e.mail), 'content': changeContent(e.comment), - 'mail': e.mail, 'nick': e.nick, 'url': e.url + '#' + e.objectId, - 'date': e.createdAt, + 'date': e.updatedAt, } }) - saveToLocal.set('leancloud-newest-comments', JSON.stringify(valineArray), 10/(60*24)) + saveToLocal.set('valine-newest-comments', JSON.stringify(valineArray), !{theme.newest_comments.storage}/(60*24)) generateHtml(valineArray) }).catch(e => { const $dom = document.querySelector('#card-newest-comments .aside-list') @@ -94,7 +85,7 @@ script. const newestCommentInit = () => { if (document.querySelector('#card-newest-comments .aside-list')) { - const data = saveToLocal.get('leancloud-newest-comments') + const data = saveToLocal.get('valine-newest-comments') if (data) { generateHtml(JSON.parse(data)) } else { diff --git a/layout/includes/third-party/newest-comments/waline.pug b/layout/includes/third-party/newest-comments/waline.pug index c99abc2..8a09847 100644 --- a/layout/includes/third-party/newest-comments/waline.pug +++ b/layout/includes/third-party/newest-comments/waline.pug @@ -5,9 +5,10 @@ script. const changeContent = (content) => { if (content === '') return content + content = content.replace(/]+>/ig, '[!{_p("aside.card_newest_comments.image")}]') // replace image link + content = content.replace(/]+?href=["']?([^"']+)["']?[^>]*>([^<]+)<\/a>/gi, '[!{_p("aside.card_newest_comments.link")}]') // replace url + content = content.replace(/
.*?<\/pre>/gi, '[!{_p("aside.card_newest_comments.code")}]') // replace code
       content = content.replace(/<[^>]+>/g,"") // remove html tag
-      content = content.replace(/(http(s?):)([/|.|\w|\s|-])*\.(?:jpg|jpeg|gif|png|webp)/g, '') // remove image link
-      content = content.replace(/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi, '') // remove url
 
       if (content.length > 150) {
         content = content.substring(0,150) + '...'
@@ -15,7 +16,8 @@ script.
       return content
     }
 
-    const getIcon = (mail) => {
+    const getIcon = (avatar,mail) => {
+      if (avatar) return avatar
       let defaultIcon = '!{ default_avatar ? `?d=${default_avatar}` : ''}'
       let iconUrl = `https://gravatar.loli.net/avatar/${mail + defaultIcon}`
       return iconUrl
@@ -29,16 +31,13 @@ script.
           result += '
' if (!{theme.newest_comments.avatar}) { - let name = 'src' - if(!{theme.lazyload.enable}) { - name = 'data-lazy-src' - } - result += `${array[i].nick}` + const name = '!{theme.lazyload.enable ? "data-lazy-src" : "src"}' + result += `${array[i].nick}` } result += `
${array[i].content} -
${array[i].nick}
+
${array[i].nick} /
` } } else { @@ -61,13 +60,13 @@ script. const walineArray = comments.map(function (e) { return { 'content': changeContent(e.comment), - 'mail': e.mail, + 'avatar': getIcon(e.QQAvatar,e.mail), 'nick': e.nick, 'url': e.url + '#' + e.objectId, - 'date': e.createdAt, + 'date': e.updatedAt, } }) - saveToLocal.set('waline-newest-comments', JSON.stringify(walineArray), 10/(60*24)) + saveToLocal.set('waline-newest-comments', JSON.stringify(walineArray), !{theme.newest_comments.storage}/(60*24)) generateHtml(walineArray) }).catch(e => { const $dom = document.querySelector('#card-newest-comments .aside-list') diff --git a/layout/includes/third-party/pangu.pug b/layout/includes/third-party/pangu.pug index e61305f..7ac1395 100644 --- a/layout/includes/third-party/pangu.pug +++ b/layout/includes/third-party/pangu.pug @@ -1,10 +1,10 @@ script. function panguFn () { - if (typeof pangu === 'object') pangu.spacingElementById('content-inner') + if (typeof pangu === 'object') pangu.autoSpacingPage() else { getScript('!{url_for(theme.CDN.pangu)}') .then(() => { - pangu.spacingElementById('content-inner') + pangu.autoSpacingPage() }) } } diff --git a/layout/includes/third-party/pjax.pug b/layout/includes/third-party/pjax.pug index 0d41660..92c389c 100644 --- a/layout/includes/third-party/pjax.pug +++ b/layout/includes/third-party/pjax.pug @@ -7,7 +7,7 @@ script(src=url_for(theme.CDN.pjax)) script. let pjaxSelectors = [ 'title', - '#config_change', + '#config-diff', '#body-wrap', '#rightside-config-hide', '#rightside-config-show', @@ -78,3 +78,9 @@ script. $bodyClassList.contains('read-mode') && $bodyClassList.remove('read-mode') }) + + document.addEventListener('pjax:error', (e) => { + if (e.request.status === 404) { + pjax.loadUrl('/404.html') + } + }) diff --git a/layout/includes/third-party/share/index.pug b/layout/includes/third-party/share/index.pug index 41892a6..f28ceab 100644 --- a/layout/includes/third-party/share/index.pug +++ b/layout/includes/third-party/share/index.pug @@ -1,7 +1,7 @@ .post_share if theme.addThis.enable - !=partial('includes/third-party/share/add-this', {}, {cache:theme.fragment_cache}) + !=partial('includes/third-party/share/add-this', {}, {cache: true}) else if theme.sharejs.enable include ./share-js.pug else if theme.addtoany.enable - !=partial('includes/third-party/share/addtoany', {}, {cache:theme.fragment_cache}) + !=partial('includes/third-party/share/addtoany', {}, {cache: true}) diff --git a/layout/includes/widget/card_archives.pug b/layout/includes/widget/card_archives.pug index 1080e28..bb0e78e 100644 --- a/layout/includes/widget/card_archives.pug +++ b/layout/includes/widget/card_archives.pug @@ -1,9 +1,5 @@ if theme.aside.card_archives.enable .card-widget.card-archives - .item-headline - i.fas.fa-archive - span= _p('aside.card_archives') - - let type = theme.aside.card_archives.type || 'monthly' - let format = theme.aside.card_archives.format || 'MMMM YYYY' - let order = theme.aside.card_archives.order || -1 diff --git a/layout/includes/widget/card_categories.pug b/layout/includes/widget/card_categories.pug index 4f69e2f..529ea55 100644 --- a/layout/includes/widget/card_categories.pug +++ b/layout/includes/widget/card_categories.pug @@ -1,7 +1,4 @@ if theme.aside.card_categories.enable if site.categories.length .card-widget.card-categories - .item-headline - i.fas.fa-folder-open - span= _p('aside.card_categories') !=aside_categories({ limit: theme.aside.card_categories.limit === 0 ? 0 : theme.aside.card_categories.limit || 8 , expand: theme.aside.card_categories.expand }) diff --git a/layout/includes/widget/index.pug b/layout/includes/widget/index.pug index 10dd161..a37b066 100644 --- a/layout/includes/widget/index.pug +++ b/layout/includes/widget/index.pug @@ -5,23 +5,23 @@ .sticky_layout include ./card_post_toc.pug else - !=partial('includes/widget/card_author', {}, {cache:theme.fragment_cache}) - !=partial('includes/widget/card_announcement', {}, {cache:theme.fragment_cache}) + !=partial('includes/widget/card_author', {}, {cache: true}) + !=partial('includes/widget/card_announcement', {}, {cache: true}) .sticky_layout if showToc include ./card_post_toc.pug - !=partial('includes/widget/card_recent_post', {}, {cache:theme.fragment_cache}) - !=partial('includes/widget/card_ad', {}, {cache:theme.fragment_cache}) + !=partial('includes/widget/card_recent_post', {}, {cache: true}) + !=partial('includes/widget/card_ad', {}, {cache: true}) else //- page - !=partial('includes/widget/card_author', {}, {cache:theme.fragment_cache}) - !=partial('includes/widget/card_announcement', {}, {cache:theme.fragment_cache}) + !=partial('includes/widget/card_author', {}, {cache: true}) + !=partial('includes/widget/card_announcement', {}, {cache: true}) .sticky_layout - !=partial('includes/widget/card_recent_post', {}, {cache:theme.fragment_cache}) - !=partial('includes/widget/card_ad', {}, {cache:theme.fragment_cache}) - !=partial('includes/widget/card_newest_comment', {}, {cache:theme.fragment_cache}) - !=partial('includes/widget/card_categories', {}, {cache:theme.fragment_cache}) - !=partial('includes/widget/card_tags', {}, {cache:theme.fragment_cache}) - !=partial('includes/widget/card_archives', {}, {cache:theme.fragment_cache}) - !=partial('includes/widget/card_webinfo', {}, {cache:theme.fragment_cache}) - !=partial('includes/widget/card_self', {}, {cache:theme.fragment_cache}) \ No newline at end of file + !=partial('includes/widget/card_recent_post', {}, {cache: true}) + !=partial('includes/widget/card_ad', {}, {cache: true}) + !=partial('includes/widget/card_newest_comment', {}, {cache: true}) + !=partial('includes/widget/card_categories', {}, {cache: true}) + !=partial('includes/widget/card_tags', {}, {cache: true}) + !=partial('includes/widget/card_archives', {}, {cache: true}) + !=partial('includes/widget/card_webinfo', {}, {cache: true}) + !=partial('includes/widget/card_self', {}, {cache: true}) \ No newline at end of file diff --git a/layout/page.pug b/layout/page.pug index 474580d..7287546 100644 --- a/layout/page.pug +++ b/layout/page.pug @@ -16,4 +16,4 @@ block content if page.comments !== false && theme.comments && theme.comments.use - var commentsJsLoad = true - !=partial('includes/third-party/comments/index', {}, {cache:theme.fragment_cache}) \ No newline at end of file + !=partial('includes/third-party/comments/index', {}, {cache: true}) \ No newline at end of file diff --git a/layout/post.pug b/layout/post.pug index 7249b9f..a5399b2 100644 --- a/layout/post.pug +++ b/layout/post.pug @@ -15,17 +15,18 @@ block content include includes/third-party/share/index.pug if theme.reward.enable - !=partial('includes/post/reward', {}, {cache:theme.fragment_cache}) + !=partial('includes/post/reward', {}, {cache: true}) //- ad if theme.ad && theme.ad.post .ads-wrap!=theme.ad.post - include includes/pagination.pug + if theme.post_pagination + include includes/pagination.pug if theme.related_post && theme.related_post.enable != related_posts(page,site.posts) if page.comments !== false && theme.comments && theme.comments.use - var commentsJsLoad = true - !=partial('includes/third-party/comments/index', {}, {cache:theme.fragment_cache}) + !=partial('includes/third-party/comments/index', {}, {cache: true}) \ No newline at end of file diff --git a/package.json b/package.json index 2b6d80d..3ae4979 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hexo-theme-butterfly", - "version": "3.5.1", + "version": "3.6.0", "description": "A Simple and Card UI Design theme for Hexo", "main": "package.json", "scripts": { @@ -20,13 +20,13 @@ }, "bugs": { "url": "https://github.com/jerryc127/hexo-theme-butterfly/issues", - "email": "wong@jerryc.me" + "email": "btf@immyw.com" }, "dependencies": { "hexo-renderer-stylus": "^2.0.1", "hexo-renderer-pug": "^1.0.0" }, "homepage": "https://butterfly.js.org/", - "author": "Jerry ", + "author": "Jerry ", "license": "Apache-2.0" } diff --git a/scripts/helpers/aside_archives.js b/scripts/helpers/aside_archives.js index 9112306..779c1d4 100644 --- a/scripts/helpers/aside_archives.js +++ b/scripts/helpers/aside_archives.js @@ -19,7 +19,6 @@ hexo.extend.helper.register('aside_archives', function (options = {}) { ? (yearA, monthA, yearB, monthB) => yearA === yearB && monthA === monthB : (yearA, monthA, yearB, monthB) => yearA === yearB const limit = options.limit - const moreButton = this._p('aside.more_button') let result = '' if (!format) { @@ -67,11 +66,18 @@ hexo.extend.helper.register('aside_archives', function (options = {}) { return this.url_for(url) } - result += '
    ' - const len = data.length const Judge = limit === 0 ? len : Math.min(len, limit) + result += `
    ${this._p('aside.card_archives')}` + + if (len > Judge) { + result += ` + ` + } + + result += '
      ' + for (let i = 0; i < Judge; i++) { const item = data[i] @@ -89,11 +95,6 @@ hexo.extend.helper.register('aside_archives', function (options = {}) { result += '' } - if (len > Judge) { - result += '
    • ' - result += ` - ${moreButton}
    • ` - } result += '
    ' return result }) diff --git a/scripts/helpers/aside_categories.js b/scripts/helpers/aside_categories.js index bb83de5..0e60b8e 100644 --- a/scripts/helpers/aside_categories.js +++ b/scripts/helpers/aside_categories.js @@ -25,7 +25,6 @@ hexo.extend.helper.register('aside_categories', function (categories, options) { const limit = options.limit === 0 ? categories.length : options.limit const isExpand = options.expand !== 'none' const expandClass = isExpand && options.expand === true ? 'expand' : '' - const buttonLabel = this._p('aside.more_button') const prepareQuery = (parent) => { const query = {} @@ -80,17 +79,19 @@ hexo.extend.helper.register('aside_categories', function (categories, options) { const list = hierarchicalList(limit, 0) const moreButton = function () { - let moreHtml = '' if (categories.length <= limit) return '' - moreHtml += '
  • ' - moreHtml += ` - ${buttonLabel}
  • ` + const moreHtml = ` + ` return moreHtml } - return `
      - ${list[0]} + return `
      + + ${this._p('aside.card_categories')} ${moreButton()} +
      +
        + ${list[0]}
      ` }) diff --git a/scripts/helpers/inject_head_js.js b/scripts/helpers/inject_head_js.js new file mode 100644 index 0000000..93f714d --- /dev/null +++ b/scripts/helpers/inject_head_js.js @@ -0,0 +1,145 @@ +/** + * Butterfly + * inject js to head + */ + +'use strict' + +hexo.extend.helper.register('inject_head_js', function () { + const { darkmode, aside, change_font_size } = this.theme + + const localStore = ` + win.saveToLocal = { + set: function setWithExpiry(key, value, ttl) { + if (ttl === 0) return + const now = new Date() + const expiryDay = ttl * 86400000 + const item = { + value: value, + expiry: now.getTime() + expiryDay, + } + localStorage.setItem(key, JSON.stringify(item)) + }, + + get: function getWithExpiry(key) { + const itemStr = localStorage.getItem(key) + + if (!itemStr) { + return undefined + } + const item = JSON.parse(itemStr) + const now = new Date() + + if (now.getTime() > item.expiry) { + localStorage.removeItem(key) + return undefined + } + return item.value + } + } + ` + + // https://stackoverflow.com/questions/16839698/jquery-getscript-alternative-in-native-javascript + const getScript = ` + win.getScript = url => new Promise((resolve, reject) => { + const script = document.createElement('script') + script.src = url + script.async = true + script.onerror = reject + script.onload = script.onreadystatechange = function() { + const loadState = this.readyState + if (loadState && loadState !== 'loaded' && loadState !== 'complete') return + script.onload = script.onreadystatechange = null + resolve() + } + document.head.appendChild(script) + }) + ` + + let darkmodeJs = '' + if (darkmode.enable) { + darkmodeJs = ` + win.activateDarkMode = function () { + document.documentElement.setAttribute('data-theme', 'dark') + if (document.querySelector('meta[name="theme-color"]') !== null) { + document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d') + } + } + win.activateLightMode = function () { + document.documentElement.setAttribute('data-theme', 'light') + if (document.querySelector('meta[name="theme-color"]') !== null) { + document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff') + } + } + const t = saveToLocal.get('theme') + ` + + const autoChangeMode = darkmode.autoChangeMode + + if (autoChangeMode === 1) { + darkmodeJs += ` + const isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches + const isLightMode = window.matchMedia('(prefers-color-scheme: light)').matches + const isNotSpecified = window.matchMedia('(prefers-color-scheme: no-preference)').matches + const hasNoSupport = !isDarkMode && !isLightMode && !isNotSpecified + + if (t === undefined) { + if (isLightMode) activateLightMode() + else if (isDarkMode) activateDarkMode() + else if (isNotSpecified || hasNoSupport) { + const now = new Date() + const hour = now.getHours() + const isNight = hour <= 6 || hour >= 18 + isNight ? activateDarkMode() : activateLightMode() + } + window.matchMedia('(prefers-color-scheme: dark)').addListener(function (e) { + if (saveToLocal.get('theme') === undefined) { + e.matches ? activateDarkMode() : activateLightMode() + } + }) + } else if (t === 'light') activateLightMode() + else activateDarkMode() + ` + } else if (autoChangeMode === 2) { + darkmodeJs += ` + const now = new Date() + const hour = now.getHours() + const isNight = hour <= 6 || hour >= 18 + if (t === undefined) isNight ? activateDarkMode() : activateLightMode() + else if (t === 'light') activateLightMode() + else activateDarkMode() + ` + } else { + darkmodeJs += ` + if (t === 'dark') activateDarkMode() + else if (t === 'light') activateLightMode() + ` + } + } + + let asideStatus = '' + if (aside.enable && aside.button) { + asideStatus = ` + const asideStatus = saveToLocal.get('aside-status') + if (asideStatus !== undefined) { + if (asideStatus === 'hide') { + document.documentElement.classList.add('hide-aside') + } else { + document.documentElement.classList.remove('hide-aside') + } + } + ` + } + + let changFontAside = '' + if (change_font_size) { + changFontAside = ` + const fontSizeVal = saveToLocal.get('global-font-size') + if (fontSizeVal !== undefined) { + document.documentElement.style.setProperty('--global-font-size', fontSizeVal + 'px') + } + ` + } + + return `` +}) diff --git a/scripts/helpers/page.js b/scripts/helpers/page.js index fd44158..3042d95 100644 --- a/scripts/helpers/page.js +++ b/scripts/helpers/page.js @@ -15,7 +15,7 @@ hexo.extend.helper.register('page_description', function () { let description = page.description || page.content || page.title || config.description if (description) { - description = escapeHTML(stripHTML(description).substring(0, 200) + description = escapeHTML(stripHTML(description).substring(0, 150) .trim() ).replace(/\n/g, ' ') return description @@ -54,8 +54,8 @@ hexo.extend.helper.register('cloudTags', function (options = {}) { return result }) -hexo.extend.helper.register('urlNoIndex', function () { - return prettyUrls(this.url, { trailing_index: false, trailing_html: false }) +hexo.extend.helper.register('urlNoIndex', function (url = null) { + return prettyUrls(url || this.url, { trailing_index: false, trailing_html: false }) }) hexo.extend.helper.register('md5', function (path) { diff --git a/source/css/_global/function.styl b/source/css/_global/function.styl index e77ff53..a8c1063 100644 --- a/source/css/_global/function.styl +++ b/source/css/_global/function.styl @@ -127,6 +127,7 @@ if hexo-config('avatar.effect') == true transform: translateY(50px) 100% + filter: none opacity: 1 transform: translateY(0) diff --git a/source/css/_global/index.styl b/source/css/_global/index.styl index d06931e..71fc5f1 100644 --- a/source/css/_global/index.styl +++ b/source/css/_global/index.styl @@ -27,6 +27,8 @@ --blockquote-bg: $blockquote-background-color --reward-pop: $reward-pop-up-bg --toc-link-color: $toc-link-color + --card-box-shadow: 0 3px 8px 6px rgba(7, 17, 27, .06) + --card-hover-box-shadow: 0 3px 8px 6px rgba(7, 17, 27, .15) html height: 100% diff --git a/source/css/_layout/404.styl b/source/css/_layout/404.styl index e7cedcb..e9a8610 100644 --- a/source/css/_layout/404.styl +++ b/source/css/_layout/404.styl @@ -18,7 +18,11 @@ if hexo-config('error_404.enable') height: 18rem border-radius: 8px background: var(--card-bg) - box-shadow: 0 4px 8px 6px rgba(7, 17, 27, .06) + box-shadow: var(--card-box-shadow) + transition: all .3s + + &:hover + box-shadow: var(--card-hover-box-shadow) +maxWidth768() flex-direction: column @@ -45,6 +49,7 @@ if hexo-config('error_404.enable') padding: .5rem text-align: center font-size: 14px + if $site-name-font font-family: $site-name-font diff --git a/source/css/_layout/aside.styl b/source/css/_layout/aside.styl index a55880c..cee1701 100644 --- a/source/css/_layout/aside.styl +++ b/source/css/_layout/aside.styl @@ -23,11 +23,11 @@ padding: 1rem 1.2rem border-radius: 8px background: var(--card-bg) - box-shadow: 0 4px 8px 6px rgba(7, 17, 27, .06) + box-shadow: var(--card-box-shadow) transition: box-shadow .3s &:hover - box-shadow: 0 4px 12px 12px rgba(7, 17, 27, .15) + box-shadow: var(--card-hover-box-shadow) if hexo-config('aside.mobile') == false +maxWidth768() @@ -110,6 +110,7 @@ position: sticky position: -webkit-sticky top: 20px + transition: top .3s .card-tag-cloud a @@ -213,16 +214,6 @@ width: 20% text-align: right - &.more - span - padding-right: .3rem - width: auto !important - transition: .5s - - &:hover - span - padding-right: .6rem - .card-categories .card-category-list &.child @@ -333,6 +324,21 @@ > .card-widget margin-top: 0 + .card-more-btn + float: right + color: inherit + + &:hover + animation: more-btn-move 1s infinite + +@keyframes more-btn-move + 0%, + 100% + transform: translateX(0) + + 50% + transform: translateX(3px) + @keyframes toc-open 0% transform: scale(.7) diff --git a/source/css/_layout/head.styl b/source/css/_layout/head.styl index b081f93..37ca649 100644 --- a/source/css/_layout/head.styl +++ b/source/css/_layout/head.styl @@ -69,7 +69,7 @@ font-size: 30px // page - &.not-index-bg + &.not-home-page height: 20rem +maxWidth768() @@ -101,19 +101,6 @@ background-color: alpha($dark-black, .5) content: '' - &.no-top-img - margin-bottom: .5rem - height: 60px - background: 0 - - #nav - background: rgba(255, 255, 255, .8) - box-shadow: 0 5px 6px -5px rgba(133, 133, 133, .6) - - a - color: var(--font-color) - text-shadow: none - #post-info position: absolute bottom: 5rem @@ -129,6 +116,75 @@ bottom: 1.1rem padding: 0 1.1rem + &.not-top-img + margin-bottom: .5rem + height: 60px + background: 0 + + #nav + background: rgba(255, 255, 255, .8) + box-shadow: 0 5px 6px -5px rgba(133, 133, 133, .6) + + a + color: var(--font-color) + text-shadow: none + + &.nav-fixed + #nav + position: fixed + top: -60px + z-index: 91 + background: rgba(255, 255, 255, .8) + box-shadow: 0 5px 6px -5px alpha($grey, .6) + transition: transform .2s ease-in-out, opacity .2s ease-in-out + + a, + #site-name, + #toggle-menu + color: var(--font-color) + text-shadow: none + + &:hover + color: $light-blue + + &.nav-visible + #nav + transition: all .5s + transform: translate3d(0, 100%, 0) + + & + .layout + & > .aside-content > .sticky_layout + top: 70px + transition: top .5s + +// css hack +// all browser in ios and safari in all apple device +_::-webkit-full-page-media, +_:future, +:root #page-header.full_page + background-attachment: scroll !important + +#page + h1.page-title + margin: .4rem 0 1rem + +// for not top_img +#post + & > #post-info + margin-bottom: 1.5rem + + .post-title + padding-bottom: .2rem + border-bottom: 1px solid var(--light-grey) + color: var(--text-highlight-color) + + .post-edit-link + float: right + + #post-meta, + #post-meta a + color: #78818a + #post-info .post-title @extend .limit-more-line @@ -142,6 +198,9 @@ +maxWidth768() font-size: 1.72em + .post-edit-link + padding-left: .5rem + #post-meta color: var(--light-grey) font-size: 95% @@ -183,27 +242,6 @@ time display: none -// for not top_img -#post - & > #post-info - margin-bottom: 1.5rem - - .post-title - padding-bottom: .2rem - border-bottom: 1px solid var(--light-grey) - color: var(--text-highlight-color) - - #post-meta, - #post-meta a - color: #78818a - -// css hack -// all browser in ios and safari in all apple device -_::-webkit-full-page-media, -_:future, -:root #page-header.full_page - background-attachment: scroll !important - #nav position: absolute top: 0 @@ -221,10 +259,6 @@ _:future, +maxWidth768() padding: 0 16px - &:not(.fixed) - #menus - padding-right: 0 !important - &.show opacity: 1 @@ -245,27 +279,6 @@ _:future, &:hover color: var(--white) - &.fixed - position: fixed - top: -60px - z-index: 91 - background: rgba(255, 255, 255, .8) - box-shadow: 0 5px 6px -5px alpha($grey, .6) - transition: transform .2s ease-in-out, opacity .2s ease-in-out - - a, - #site-name, - #toggle-menu - color: var(--font-color) - text-shadow: none - - &:hover - color: $light-blue - - &.visible - transition: all .5s - transform: translate3d(0, 100%, 0) - #site-name text-shadow: .1rem .1rem .2rem rgba($dark-black, .15) font-weight: bold @@ -335,8 +348,8 @@ _:future, display: inline-block padding: .3rem .7rem width: 100% - color: var(--font-color) - text-shadow: none + color: var(--font-color) !important + text-shadow: none !important &.hide-menu #toggle-menu @@ -363,4 +376,4 @@ _:future, padding-bottom: .3rem text-shadow: .05rem .05rem .1rem rgba($dark-black, .3) font-size: .78em - cursor: pointer \ No newline at end of file + cursor: pointer diff --git a/source/css/_layout/pagination.styl b/source/css/_layout/pagination.styl index b792a06..aee8aca 100644 --- a/source/css/_layout/pagination.styl +++ b/source/css/_layout/pagination.styl @@ -75,5 +75,5 @@ transform: scale(1.1) &.pagination-post - margin: 2rem 0 !important + margin-top: 2rem background: $dark-black \ No newline at end of file diff --git a/source/css/_layout/post.styl b/source/css/_layout/post.styl index 5c2ad25..bce034a 100644 --- a/source/css/_layout/post.styl +++ b/source/css/_layout/post.styl @@ -152,6 +152,7 @@ no-beautify() text-decoration: underline img + display: block margin: 0 auto .8rem p @@ -171,9 +172,6 @@ no-beautify() no-beautify() #post - img - display: block - .tag_share .post-meta &__tag-list @@ -218,24 +216,13 @@ no-beautify() transition: box-shadow .3s ease-in-out &:before + @extend .fontawesomeIcon position: absolute - top: t = .5rem - right: t - width: w = .8rem - height: w - border-radius: w - background: $light-blue - content: '' - - &:after - position: absolute - top: t = .7rem - right: t - width: w = .4rem - height: w - border-radius: w - background: var(--card-bg) - content: '' + top: .1rem + right: .6rem + color: $theme-color + content: '\f1f9' + font-size: 1rem &:hover box-shadow: 0 0 8px 0 rgba(232, 237, 250, .6), 0 2px 4px 0 rgba(232, 237, 250, .5) diff --git a/source/css/_layout/relatedposts.styl b/source/css/_layout/relatedposts.styl index b296917..5d69ec5 100644 --- a/source/css/_layout/relatedposts.styl +++ b/source/css/_layout/relatedposts.styl @@ -1,5 +1,5 @@ .relatedPosts - margin-top: 1rem + margin-top: 2rem & > .headline margin-bottom: 5px diff --git a/source/css/_layout/reward.styl b/source/css/_layout/reward.styl index b5d5717..ba91955 100644 --- a/source/css/_layout/reward.styl +++ b/source/css/_layout/reward.styl @@ -12,60 +12,58 @@ cursor: pointer transition: all .4s - &:hover - box-shadow: inset 9em 0 0 0 var(--btn-hover-color) + &:hover + & > .reward-main + display: block - .reward-main - display: block + .reward-main + position: absolute + bottom: 40px + left: 0 + z-index: 100 + display: none + padding: 0 0 15px + width: 100% - .reward-main - position: absolute - bottom: 40px - left: 0 - z-index: 100 - display: none - padding: 0 0 15px - width: 100% + .reward-all + display: inline-block + margin: 0 + padding: 1rem .5rem + border-radius: 4px + background: var(--reward-pop) - .reward-all + &:before + position: absolute + bottom: -10px + left: 0 + width: 100% + height: 20px + content: '' + + &:after + position: absolute + right: 0 + bottom: 2px + left: 0 + margin: 0 auto + width: 0 + height: 0 + border-top: 13px solid var(--reward-pop) + border-right: 13px solid transparent + border-left: 13px solid transparent + content: '' + + .reward-item display: inline-block - margin: 0 - padding: 1rem .5rem - border-radius: 4px - background: var(--reward-pop) + padding: 0 8px + list-style-type: none + vertical-align: top - &:before - position: absolute - bottom: -10px - left: 0 - width: 100% - height: 20px - content: '' + img + width: 130px + height: 130px - &:after - position: absolute - right: 0 - bottom: 2px - left: 0 - margin: 0 auto - width: 0 - height: 0 - border-top: 13px solid var(--reward-pop) - border-right: 13px solid transparent - border-left: 13px solid transparent - content: '' - - .reward-item - display: inline-block - padding: 0 8px - list-style-type: none - vertical-align: top - - img - width: 130px - height: 130px - - .post-qr-code-desc - padding-top: .4rem - width: 130px - color: $reward-pop-up-color + .post-qr-code-desc + padding-top: .4rem + width: 130px + color: $reward-pop-up-color diff --git a/source/css/_layout/rightside.styl b/source/css/_layout/rightside.styl index 39d1299..05678c2 100644 --- a/source/css/_layout/rightside.styl +++ b/source/css/_layout/rightside.styl @@ -24,7 +24,6 @@ color: var(--btn-color) text-align: center font-size: 16px - cursor: pointer &:hover background-color: var(--btn-hover-color) diff --git a/source/css/_layout/third-party.styl b/source/css/_layout/third-party.styl index 334c4a4..af709f3 100644 --- a/source/css/_layout/third-party.styl +++ b/source/css/_layout/third-party.styl @@ -10,10 +10,6 @@ &:hover background: var(--btn-hover-color) - textarea - &:focus - background-image: none - .vimg transition: all .3s @@ -30,11 +26,17 @@ if hexo-config('valine.bg') textarea background: url(hexo-config('valine.bg')) 100% 100% no-repeat + &:focus + background-image: none + if hexo-config('waline.bg') #waline-wrap textarea background: url(hexo-config('waline.bg')) 100% 100% no-repeat + &:focus + background-image: none + .fireworks position: fixed top: 0 diff --git a/source/css/_mode/darkmode.styl b/source/css/_mode/darkmode.styl index ee5a28b..ad4b4de 100644 --- a/source/css/_mode/darkmode.styl +++ b/source/css/_mode/darkmode.styl @@ -53,8 +53,8 @@ if hexo-config('darkmode.enable') || hexo-config('display_mode') == 'dark' // 頭部 #page-header - & > #nav.fixed, - &.no-top-img #nav + &.nav-fixed > #nav, + &.not-top-img > #nav background: alpha(#121212, .8) box-shadow: 0 5px 6px -5px rgba(133, 133, 133, 0) diff --git a/source/css/_mode/readmode.styl b/source/css/_mode/readmode.styl index b1ee497..dbe2308 100644 --- a/source/css/_mode/readmode.styl +++ b/source/css/_mode/readmode.styl @@ -38,9 +38,7 @@ if hexo-config('readmode') border-radius: 8px background: var(--exit-btn-bg) color: var(--exit-btn-color) - text-align: center font-size: 16px - cursor: pointer transition: background .3s &:hover @@ -49,9 +47,6 @@ if hexo-config('readmode') #aside-content display: none - #body-wrap - padding-left: 0 !important - #page-header.post-bg background-color: transparent background-image: none !important @@ -60,7 +55,6 @@ if hexo-config('readmode') opacity: 0 & > #post-info - padding: 0 text-align: center #post @@ -81,7 +75,7 @@ if hexo-config('readmode') .post-outdate-notice, #web_bg, #rightside, - .no-top-img + .not-top-img display: none !important #article-container @@ -90,7 +84,7 @@ if hexo-config('readmode') pre, .highlight:not(.js-file-line-container) - background: var(-highlight-bg) !important + background: var(--highlight-bg) !important * color: var(--font-color) !important @@ -196,4 +190,8 @@ if hexo-config('readmode') border-left-color: var(--gray) !important filter: none background-color: var(--readmode-light-color) !important - color: var(--font-color) \ No newline at end of file + color: var(--font-color) + + &:before, + .note-icon + color: var(--font-color) diff --git a/source/css/_page/common.styl b/source/css/_page/common.styl index d28abdd..5868fb9 100644 --- a/source/css/_page/common.styl +++ b/source/css/_page/common.styl @@ -18,10 +18,10 @@ padding: 50px 40px border-radius: 8px background: var(--card-bg) - box-shadow: 0 4px 8px 6px rgba(7, 17, 27, .06) + box-shadow: var(--card-box-shadow) &:hover - box-shadow: 0 4px 12px 12px rgba(7, 17, 27, .15) + box-shadow: var(--card-hover-box-shadow) +maxWidth768() padding: 1.8rem .7rem !important @@ -47,6 +47,6 @@ & > div width: 100% !important -#page - h1.page-title - margin-top: .4rem \ No newline at end of file +// fix chrome enter animation blur +.layout + filter: blur(0) \ No newline at end of file diff --git a/source/css/_page/flink.styl b/source/css/_page/flink.styl index b37d26e..f7e9280 100644 --- a/source/css/_page/flink.styl +++ b/source/css/_page/flink.styl @@ -1,76 +1,77 @@ -.flink#article-container - .flink-desc - margin: .2rem 0 .5rem +#article-container + .flink + .flink-desc + margin: .2rem 0 .5rem - .flink-list - overflow: auto - padding: 10px 10px 0 - text-align: center + .flink-list + overflow: auto + padding: 10px 10px 0 + text-align: center - & > .flink-list-item - position: relative - float: left - overflow: hidden - margin: 15px 7px - width: calc(100% / 3 - 15px) - height: 90px - border-radius: 8px - line-height: 17px - -webkit-transform: translateZ(0) + & > .flink-list-item + position: relative + float: left + overflow: hidden + margin: 15px 7px + width: calc(100% / 3 - 15px) + height: 90px + border-radius: 8px + line-height: 17px + -webkit-transform: translateZ(0) - +maxWidth1024() - width: calc(50% - 15px) !important + +maxWidth1024() + width: calc(50% - 15px) !important - +maxWidth600() - width: calc(100% - 15px) !important + +maxWidth600() + width: calc(100% - 15px) !important - &:hover - img - transform: rotate(360deg) + &:hover + img + transform: rotate(360deg) - &:before - position: absolute - top: 0 - right: 0 - bottom: 0 - left: 0 - z-index: -1 - background: var(--text-bg-hover) - content: '' - transition: transform .3s ease-out - transform: scale(0) + &:before + position: absolute + top: 0 + right: 0 + bottom: 0 + left: 0 + z-index: -1 + background: var(--text-bg-hover) + content: '' + transition: transform .3s ease-out + transform: scale(0) - &:hover:before, - &:focus:before, - &:active:before - transform: scale(1) + &:hover:before, + &:focus:before, + &:active:before + transform: scale(1) - a - color: var(--font-color) - text-decoration: none + a + color: var(--font-color) + text-decoration: none - img - float: left - margin: 15px 10px - width: 60px - height: 60px - border-radius: 35px - transition: all .3s + img + float: left + margin: 15px 10px + width: 60px + height: 60px + border-radius: 35px + transition: all .3s - .img-alt - display: none + .img-alt + display: none - .flink-item-name - @extend .limit-one-line - display: block - padding: 16px 10px 0 0 - height: 40px - font-weight: bold - font-size: 1.43em + .flink-item-name + @extend .limit-one-line + display: block + padding: 16px 10px 0 0 + height: 40px + font-weight: bold + font-size: 1.43em - .flink-item-desc - @extend .limit-one-line - display: block - padding: 16px 10px 16px 0 - height: 50px - font-size: .93em + .flink-item-desc + @extend .limit-one-line + display: block + padding: 16px 10px 16px 0 + height: 50px + font-size: .93em diff --git a/source/css/_page/homepage.styl b/source/css/_page/homepage.styl index e9ddf6e..7d10e3e 100644 --- a/source/css/_page/homepage.styl +++ b/source/css/_page/homepage.styl @@ -9,14 +9,14 @@ height: 20em border-radius: 12px 8px 8px 12px background: var(--card-bg) - box-shadow: 0 4px 8px 6px rgba(7, 17, 27, .06) + box-shadow: var(--card-box-shadow) transition: all .3s +maxWidth768() border-radius: 12px 12px 8px 8px &:hover - box-shadow: 0 4px 12px 12px rgba(7, 17, 27, .15) + box-shadow: var(--card-hover-box-shadow) img.post_bg transform: scale(1.1) diff --git a/source/js/main.js b/source/js/main.js index 08db8b6..da5be46 100644 --- a/source/js/main.js +++ b/source/js/main.js @@ -1,17 +1,16 @@ document.addEventListener('DOMContentLoaded', function () { - let blogNameWidth = document.getElementById('site-name').offsetWidth + const $blogName = document.getElementById('site-name') + let blogNameWidth = $blogName && $blogName.offsetWidth const $menusEle = document.querySelector('#menus .menus_items') let menusWidth = $menusEle && $menusEle.offsetWidth const $searchEle = document.querySelector('#search-button') let searchWidth = $searchEle && $searchEle.offsetWidth - let detectFontSizeChange = false - const adjustMenu = () => { - if (detectFontSizeChange) { - blogNameWidth = document.getElementById('site-name').offsetWidth + const adjustMenu = (change = false) => { + if (change) { + blogNameWidth = $blogName && $blogName.offsetWidth menusWidth = $menusEle && $menusEle.offsetWidth searchWidth = $searchEle && $searchEle.offsetWidth - detectFontSizeChange = false } const $nav = document.getElementById('nav') let t @@ -316,7 +315,7 @@ document.addEventListener('DOMContentLoaded', function () { let initTop = 0 let isChatShow = true - const $nav = document.getElementById('nav') + const $header = document.getElementById('page-header') const isChatBtnHide = typeof chatBtnHide === 'function' const isChatBtnShow = typeof chatBtnShow === 'function' window.addEventListener('scroll', btf.throttle(function (e) { @@ -324,25 +323,25 @@ document.addEventListener('DOMContentLoaded', function () { const isDown = scrollDirection(currentTop) if (currentTop > 56) { if (isDown) { - if ($nav.classList.contains('visible')) $nav.classList.remove('visible') + if ($header.classList.contains('nav-visible')) $header.classList.remove('nav-visible') if (isChatBtnShow && isChatShow === true) { chatBtnHide() isChatShow = false } } else { - if (!$nav.classList.contains('visible')) $nav.classList.add('visible') + if (!$header.classList.contains('nav-visible')) $header.classList.add('nav-visible') if (isChatBtnHide && isChatShow === false) { chatBtnShow() isChatShow = true } } - $nav.classList.add('fixed') + $header.classList.add('nav-fixed') if (window.getComputedStyle($rightside).getPropertyValue('opacity') === '0') { $rightside.style.cssText = 'opacity: 1; transform: translateX(-38px)' } } else { if (currentTop === 0) { - $nav.classList.remove('fixed', 'visible') + $header.classList.remove('nav-fixed', 'nav-visible') } $rightside.style.cssText = "opacity: ''; transform: ''" } @@ -449,7 +448,7 @@ document.addEventListener('DOMContentLoaded', function () { let currentIndex = '' list.forEach(function (ele, index) { - if (top > btf.getEleTop(ele) - 70) { + if (top > btf.getEleTop(ele) - 80) { currentId = '#' + encodeURI(ele.getAttribute('id')) currentIndex = index } @@ -536,17 +535,16 @@ document.addEventListener('DOMContentLoaded', function () { adjustFontSize: (plus) => { const fontSizeVal = parseInt(window.getComputedStyle(document.documentElement).getPropertyValue('--global-font-size')) let newValue = '' - detectFontSizeChange = true if (plus) { if (fontSizeVal >= 20) return newValue = fontSizeVal + 1 document.documentElement.style.setProperty('--global-font-size', newValue + 'px') - !document.getElementById('nav').classList.contains('hide-menu') && adjustMenu() + !document.getElementById('nav').classList.contains('hide-menu') && adjustMenu(true) } else { if (fontSizeVal <= 10) return newValue = fontSizeVal - 1 document.documentElement.style.setProperty('--global-font-size', newValue + 'px') - document.getElementById('nav').classList.contains('hide-menu') && adjustMenu() + document.getElementById('nav').classList.contains('hide-menu') && adjustMenu(true) } saveToLocal.set('global-font-size', newValue, 2) @@ -798,6 +796,7 @@ document.addEventListener('DOMContentLoaded', function () { const unRefreshFn = function () { window.addEventListener('resize', adjustMenu) + window.addEventListener('orientationchange', () => { setTimeout(adjustMenu(true), 100) }) clickFnOfSubMenu() GLOBAL_CONFIG.islazyload && lazyloadImg()