├── page_end
├── footer.js
├── main.js
├── header.js
├── posts.js
├── page.js
└── post.js
├── .gitignore
├── .jsdoc
├── .github
└── workflows
│ └── dist.yml
├── page_begin
├── main.html
├── header.html
├── page.html
├── footer.html
├── posts.html
└── post.html
├── .merge
├── layout_begin.html
├── LICENSE
├── layout.css
├── README.md
└── layout_end.html
/page_end/footer.js:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | dist/
2 | .tmp/
--------------------------------------------------------------------------------
/.jsdoc:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | jsdoc2md page_end/*.js page_begin/*.js > API.md
--------------------------------------------------------------------------------
/.github/workflows/dist.yml:
--------------------------------------------------------------------------------
1 | name: dist
2 |
3 | on:
4 | push:
5 | branches:
6 | - master
7 |
8 | jobs:
9 | check-dist:
10 | runs-on: ubuntu-latest
11 |
12 | steps:
13 | - uses: actions/checkout@v2
14 |
15 | - run: bash .merge
16 |
17 | - uses: actions/upload-artifact@v3
18 | with:
19 | name: dist
20 | path: dist/
21 | retention-days: 1
--------------------------------------------------------------------------------
/page_end/main.js:
--------------------------------------------------------------------------------
1 | // LoadMain 根据页面内容 加载main容器
2 | // 目前支持 layout: post posts
3 | function LoadMain() {
4 | if (vm.metadata.querySelector('#post_detail')) {
5 | LoadPost()
6 | LoadReadProcess()
7 | LoadComments()
8 | }
9 | else if (vm.metadata.querySelectorAll('.postTitle, .postTitl2, .entrylistPosttitle').length !== 0) {
10 | LoadPosts()
11 | LoadPage()
12 | }
13 | }
--------------------------------------------------------------------------------
/page_begin/main.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/.merge:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | mkdir .tmp
4 | echo '' > .tmp/DONOTEDIT
5 | echo '' > .tmp/SCRIPTEND
7 | wget https://unpkg.com/@picocss/pico@1.5.5/css/pico.min.css -O .tmp/pico.min.css
8 |
9 | mkdir dist
10 | cat .tmp/DONOTEDIT layout_begin.html page_begin/*.html > dist/page_begin.html
11 | cat .tmp/DONOTEDIT layout_end.html .tmp/SCRIPT page_end/*.js .tmp/SCRIPTEND > dist/page_end.html
12 | cat .tmp/pico.min.css layout.css > dist/custom.css
13 | rm -rf .tmp
--------------------------------------------------------------------------------
/layout_begin.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/page_begin/header.html:
--------------------------------------------------------------------------------
1 |
2 |
14 |
--------------------------------------------------------------------------------
/page_begin/page.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
11 |
12 |
--------------------------------------------------------------------------------
/page_end/header.js:
--------------------------------------------------------------------------------
1 | // header 博客头部
2 | // header = {
3 | // "url": "https://www.cnblogs.com/blogure/", // 博客园主页url
4 | // "title": "blogure", // 博客园标题
5 | // "subtitle": "又一个博客园主题", // 博客园副标题
6 | // "navlist": "...管理" // 导航栏dom
7 | // }
8 |
9 | // LoadHeader 头部数据初始化
10 | function LoadHeader() {
11 | const vm = window.vm
12 | const header = (vm.header = {})
13 | const headerdom = vm.metadata.querySelector('#header')
14 | // 博客标题 博客子标题
15 | const h1dom = headerdom.querySelector('h1 a')
16 | header.url = h1dom.href.trim()
17 | header.title = h1dom.innerText.trim()
18 | const h2dom = headerdom.querySelector('h2')
19 | header.subtitle = h2dom.innerText.trim()
20 | // 导航栏控件
21 | header.navlist = ''
22 | const navlistdoms = headerdom.querySelectorAll('#navList li')
23 | navlistdoms.forEach(nav => { // 这里解析仅对空值过滤
24 | if (nav.innerText.trim()) {
25 | header.navlist += nav.outerHTML
26 | }
27 | })
28 | console.debug(`header${header} loaded`)
29 | }
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 zidft
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/page_end/posts.js:
--------------------------------------------------------------------------------
1 | // posts 文章数组
2 |
3 | // LoadPosts 文章列表初始化
4 | function LoadPosts() {
5 | // 设置页面布局与初始化文章数组
6 | const vm = window.vm
7 | vm.layout = 'posts'
8 | vm.posts = []
9 | // 获取页面全部文章链接
10 | const postlistdoms = vm.metadata.querySelectorAll('.postTitle, .postTitl2, .entrylistPosttitle')
11 | const descsdoms = vm.metadata.querySelectorAll('.postDesc, .postDesc2, .entrylistItemPostDesc')
12 | const l = Math.min(postlistdoms.length, descsdoms.length)
13 | for (let index = 0; index < l; index++) {
14 | // 初始化文章进行预加载
15 | const post = { async: {} }
16 | const adom = postlistdoms[index].querySelector('a')
17 | post.title = adom.innerText.trim()
18 | post.url = adom.href.trim()
19 | post.async.preview = false
20 | vm.posts.push(post)
21 | Get(post.url).then(((idx) => {
22 | return (r) => {
23 | const tempdom = document.createElement('div')
24 | tempdom.innerHTML = r.responseText.trim()
25 | FillPost(vm.posts[idx], tempdom)
26 | vm.posts[idx].async.preview = true
27 | }
28 | })(index))
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/layout.css:
--------------------------------------------------------------------------------
1 | /* custom */
2 | kbd {
3 | --font-family: "sans-serif";
4 | }
5 |
6 | body {
7 | visibility: hidden;
8 | }
9 |
10 | blockquote {
11 | border-top: 0;
12 | border-bottom: 0;
13 | }
14 |
15 | blockquote p {
16 | margin-bottom: 0;
17 | }
18 |
19 | pre>.highlighter-prismjs,
20 | pre>code {
21 | padding: 0;
22 | }
23 |
24 | ::-webkit-scrollbar {
25 | width: calc(var(--spacing)/2);
26 | height: calc(var(--spacing)/2);
27 | }
28 |
29 | ::-webkit-scrollbar-thumb {
30 | background: var(--code-kbd-background-color);
31 | }
32 |
33 | .is-active-li {
34 | background: var(--code-kbd-background-color);
35 | }
36 |
37 | .toc-list {
38 | padding: 0;
39 | }
40 |
41 | .toc-list-item a {
42 | color: var(--code-kbd-background-color);
43 | }
44 |
45 | .is-active-li a {
46 | color: var(--code-kbd-color);
47 | }
48 |
49 | p code {
50 | padding: calc(var(--spacing) / 4);
51 | }
52 |
53 | .light:before {
54 | content: "🌝";
55 | }
56 |
57 | .dark:before {
58 | content: "🌚";
59 | }
60 |
61 | #navList li a {
62 | display: block !important;
63 | }
64 |
65 | .is-collapsible {
66 | overflow: hidden;
67 | transition: var(--transition)
68 | }
69 |
70 | .is-collapsed {
71 | max-height: 0
72 | }
--------------------------------------------------------------------------------
/page_begin/footer.html:
--------------------------------------------------------------------------------
1 |
2 |
21 |
--------------------------------------------------------------------------------
/page_begin/posts.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | 📅 {{ post.desc.date }}
18 | 👁️ {{ post.desc.viewCount }}
19 | 💬 {{ post.desc.commentCount }}
20 |
21 |
22 |
23 |
24 | 阅读更多
26 |
27 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/page_end/page.js:
--------------------------------------------------------------------------------
1 | // page 分页
2 | // page = {
3 | // "pages": [
4 | // { "desc": "1", "url": "" }, // 当前页
5 | // { "desc": "2", "url": "https://www.cnblogs.com/blogure/?page=2" }, // 其他页
6 | // { "desc": "下一页", "url": "https://www.cnblogs.com/blogure/?page=2" }
7 | // ],
8 | // "async": {
9 | // "pages": true // 分页异步标志
10 | // }
11 | // }
12 |
13 | function LoadPage() {
14 | const vm = window.vm
15 | const page = (vm.page = {})
16 | const originBody = vm.metadata
17 | page.pages = []
18 | page.async = {}
19 | if (!((originBody.querySelector('.Pager, .pager') || originBody.querySelector('#nav_next_page a')))) {
20 | return page
21 | }
22 | const pagerdom = originBody.querySelector('.Pager') ? originBody.querySelector('.Pager') : originBody.querySelector('.pager')
23 | if (pagerdom) {
24 | const pagenodes = pagerdom.childNodes
25 | for (let index = 0; index < pagenodes.length; index++) {
26 | const pagenode = pagenodes[index]
27 | if (pagenode.textContent.trim() == '') continue
28 | const p = {}
29 | p.desc = pagenode.textContent.trim()
30 | p.url = pagenode.href ? pagenode.href.trim() : ''
31 | page.pages.push(p)
32 | }
33 | return page
34 | }
35 | page.async.pages = false
36 | Get(originBody.querySelector('#nav_next_page a').href.trim()).then(((page) => {
37 | return (r) => {
38 | const tempdom = document.createElement('html')
39 | tempdom.innerHTML = r.responseText
40 | const pagenodes = tempdom.querySelector('.Pager, .pager').childNodes
41 | for (let index = 0; index < pagenodes.length; index++) {
42 | const pagenode = pagenodes[index]
43 | if (pagenode.textContent.trim() == '') continue
44 | const p = {}
45 | p.desc = pagenode.textContent.trim()
46 | p.url = pagenode.href ? pagenode.href.trim() : ''
47 | page.pages.push(p)
48 | }
49 | page.pages.shift() // const('上一页')
50 | if (page.pages.length == 2) page.pages.push({ 'desc': '下一页', url: r.responseURL })
51 | [page.pages[0], page.pages[1]] = [page.pages[1], page.pages[2]]
52 | page.pages[0].desc = '1'
53 | page.pages[0].url = ''
54 | page.pages[1].desc = '2'
55 | page.pages[1].url = r.responseURL
56 | page.async.pages = true
57 | }
58 | })(vm.page))
59 | }
--------------------------------------------------------------------------------
/page_begin/post.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 |
13 |
14 |
15 | 📅 {{vm.post.desc.date}}
16 | 👁️ {{vm.post.desc.viewCount}}
17 | 💬 {{vm.post.desc.commentCount}}
18 |
19 |
20 |
21 |
27 |
28 |
29 |
30 |
31 |
32 |
34 |
35 |
36 |
37 |
38 |
39 | -
40 |
41 |
![]()
43 |
44 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # cnblogs-theme-blogure
2 |
3 | > cnblogs-theme-blogure - 又一个博客园主题,它使用 *PetiteVue* 和 *PicoCSS*。
4 |
5 | 喜欢的话可以帮个点[⭐Star](https://github.com/zidft/cnblogs-theme-blogure),万分感谢。
6 |
7 | ## 🚀 快速开始
8 |
9 | > 确保博客园有JS权限,没有可以申请[博客园 JS 权限](https://i.cnblogs.com/settings)
10 |
11 | 1. 基本设置 -> 博客皮肤 -> SimpleMemory
12 | 1. 代码高亮 -> prismjs[完全支持]
13 | 1. 页面定制 CSS 代码 -> ☑️禁用模板默认CSS -> [source](https://github.com/zidft/cnblogs-theme-blogure/releases/download/v0.0.8/custom.css)
14 | 1. 页首 HTML 代码 -> [source](https://github.com/zidft/cnblogs-theme-blogure/releases/download/v0.0.8/page_begin.html)
15 | 1. 页脚 HTML 代码 -> [source](https://github.com/zidft/cnblogs-theme-blogure/releases/download/v0.0.8/page_end.html)
16 |
17 |
18 |
19 |
20 |

21 |
22 |
23 | ## ✨ 功能特性
24 |
25 | ### 正文预览
26 |
27 | 没有预览的摘要将变得难以理解,像下面这样。
28 |
29 |
30 |
31 | Blogure支持将正文的一部分作为摘要展示在首页。
32 |
33 |
34 |
35 | 使用它很简单,使用HTML元素`<* class="more">*>`作为摘要,推荐使用单标签`
`。
36 |
37 |
38 |
39 | ### 暗黑模式
40 |
41 | 基于picocss,很方便可以调整主题风格为暗黑模式。
42 |
43 |
44 |
45 | ### 实时目录 | 阅读进度
46 |
47 | 基于 tocbot,很方便可以实时定位文章的目录,同时对文章页面加入了顶部实时进度。
48 |
49 |
50 |
51 | ### 代码高亮
52 |
53 | 博客园原生高亮`prismjs`支持。
54 |
55 |
56 |
57 | ## 📦 项目依赖
58 |
59 | + [PetiteVue ~6kb](https://github.com/vuejs/petite-vue)
60 | + [PicoCSS ~30kb](https://picocss.com/)
61 |
62 | ## 🔨 构建流程
63 |
64 | ### Linux
65 |
66 | ```sh
67 | bash .merge
68 | ```
69 |
70 | ### Windows
71 |
72 | 自行`wsl`,按照`Linux`操作。
73 |
74 | ## 🎹 参与共建 | 二次开发
75 |
76 | 参与共建,可以在[github-issues](https://github.com/zidft/cnblogs-theme-blogure/issues)中找到`help wanted`标签,发起[PR](https://github.com/zidft/cnblogs-theme-blogure/compare)。
77 |
78 | 自行[fork](https://github.com/zidft/cnblogs-theme-blogure/fork)。
79 |
80 | ## 📝 反馈
81 |
82 | 通过[github-issues](https://github.com/zidft/cnblogs-theme-blogure/issues)。
83 |
--------------------------------------------------------------------------------
/layout_end.html:
--------------------------------------------------------------------------------
1 |
3 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/page_end/post.js:
--------------------------------------------------------------------------------
1 | // comment 评论
2 | // comment = {
3 | // "actions": "...修改 删除 回复", // 评论行为dom
4 | // "user": {
5 | // "info": "...#1楼 [楼主] 2022-09-17 08:53 blogure", // 用户信息dom
6 | // "avatar": "https://pic.cnblogs.com/face/2555898/20230117114245.png" // 头像url
7 | // },
8 | // "content": "...这里可以一起讨论主题哦!" // 评论内容dom
9 | // }
10 |
11 | // comments 评论数组
12 |
13 | // tag 标签
14 | // tag = {
15 | // "desc": "主题", // 标签文字
16 | // "url": "https://www.cnblogs.com/blogure/tag/%E4%B8%BB%E9%A2%98/" // 标签url
17 | // }
18 |
19 | // tags 标签数组
20 |
21 | // post 文章
22 | // post = {
23 | // "async": {
24 | // "tags": true, // 标签异步标志
25 | // "comments": true, // 评论异步标志
26 | // "commentForm": true, // 评论框异步标志
27 | // },
28 | // "url": "https://www.cnblogs.com/blogure/p/cnblogs-theme-blogure.html", // 文章url
29 | // "title": "博客园 Blogure 主题 🎨", // 文章标题
30 | // "content": "...又一个博客园主题", // 文章内容
31 | // "preview": "...又一个博客园主题", // 文章预览
32 | // "desc": {
33 | // "date": "2021-09-29 09:30", // 发布时间
34 | // "viewCount": "494", // 浏览量
35 | // "commentCount": "6" // 评论数
36 | // },
37 | // "postid": "15322331", // 文章id
38 | // "comments": [object], // 评论数组
39 | // "process": {
40 | // "val": 6350, // 当前阅读进度
41 | // "max": 6809, // 最大阅读进度
42 | // },
43 | // "commentForm": "...", // 评论框dom
44 | // "tags": [object], // 标签数组
45 | // }
46 |
47 | // LoadReadProcess 进度条初始化与事件监听
48 | function LoadReadProcess() {
49 | const vm = window.vm
50 | vm.post.process = { val: window.scrollY, max: document.documentElement.scrollHeight - window.innerHeight }
51 | document.addEventListener('scroll', () => {
52 | vm.post.process.max = document.documentElement.scrollHeight - window.innerHeight
53 | vm.post.process.val = window.scrollY
54 | })
55 | }
56 |
57 | // LoadComments 评论变动事件监听, 触发重新渲染
58 | function LoadComments() {
59 | $(document).ajaxComplete((_e, _x, settings) => {
60 | if (settings.url.indexOf('PostComment/Add.aspx') < 0 && settings.url.indexOf('PostComment/Update.aspx') < 0 && settings.url.indexOf('comment/DeleteComment.aspx') < 0) return
61 | window.vm.post.async.comments = false
62 | Get(getAjaxBaseUrl() + `GetComments.aspx?postId=${cb_entryId}&pageIndex=0`).then((r) => {
63 | comments = []
64 | const tempdom = document.createElement('div')
65 | tempdom.innerHTML = r.responseText.trim()
66 | const commentsdoms = tempdom.querySelectorAll('.feedbackItem')
67 | for (let index = 0; index < commentsdoms.length; index++) {
68 | const commentdom = commentsdoms[index]
69 | const comment = {}
70 | comment.actions = commentdom.querySelector('.comment_actions').innerHTML
71 | commentdom.querySelector('.comment_actions').innerHTML = ''
72 | commentdom.querySelector('.feedbackManage').style.display = 'none'
73 | const userdom = commentdom.querySelector('.feedbackListSubtitle')
74 | comment.user = { info: userdom.innerHTML.trim() }
75 | comment.content = commentdom.querySelectorAll('.feedbackCon div')[0].innerHTML.trim()
76 | const spandoms = commentdom.querySelectorAll('.feedbackCon span')
77 | const avatardom = spandoms[spandoms.length - 1]
78 | comment.user.avatar = avatardom.innerText.trim()
79 | comments.push(comment)
80 | }
81 | window.vm.post.comments = comments
82 | window.vm.post.async.comments = true
83 | })
84 | })
85 | }
86 |
87 | // tocSwitcher 控制目录打开和关闭
88 | function tocSwitcher(dom) {
89 | if (dom.checked) {
90 | document.querySelector('#toc').style.transform = 'translate(0)'
91 | document.querySelector('#toc').style.boxShadow = 'var(--card-box-shadow)'
92 | }
93 | if (!dom.checked) {
94 | document.querySelector('#toc').style.transform = 'translate(calc(var(--spacing)*15))'
95 | document.querySelector('#toc').style.boxShadow = ''
96 | }
97 | }
98 |
99 | // LoadPost 文章初始化
100 | function LoadPost() {
101 | // 设置页面布局与初始化文章
102 | const vm = window.vm
103 | vm.layout = 'post'
104 | vm.post = { async: {} }
105 | // fill
106 | FillPost(vm.post, vm.metadata)
107 | if (!vm.logined) return
108 | // 评论列表
109 | vm.post.async.comments = false
110 | vm.post.comments = []
111 | Get(getAjaxBaseUrl() + `GetComments.aspx?postId=${cb_entryId}&pageIndex=0`).then(((post) => {
112 | return (r) => {
113 | const tempdom = document.createElement('div')
114 | tempdom.innerHTML = r.responseText.trim()
115 | const commentsdoms = tempdom.querySelectorAll('.feedbackItem')
116 | for (let index = 0; index < commentsdoms.length; index++) {
117 | const commentdom = commentsdoms[index]
118 | const comment = {}
119 | comment.actions = commentdom.querySelector('.comment_actions').innerHTML
120 | commentdom.querySelector('.comment_actions').innerHTML = ''
121 | commentdom.querySelector('.feedbackManage').style.display = 'none'
122 | const userdom = commentdom.querySelector('.feedbackListSubtitle')
123 | comment.user = { info: userdom.innerHTML.trim() }
124 | comment.content = commentdom.querySelectorAll('.feedbackCon div')[0].innerHTML.trim()
125 | const spandoms = commentdom.querySelectorAll('.feedbackCon span')
126 | const avatardom = spandoms[spandoms.length - 1]
127 | comment.user.avatar = avatardom.innerText.trim()
128 | post.comments.push(comment)
129 | }
130 | post.async.comments = true
131 | }
132 | })(vm.post))
133 | // 评论框
134 | vm.post.async.commentForm = false
135 | Get(getAjaxBaseUrl() + `CommentForm.aspx?postId=${cb_entryId}`).then(((post) => {
136 | return (r) => {
137 | const tempdom = document.createElement('div')
138 | tempdom.innerHTML = r.responseText.trim()
139 | tempdom.querySelector('.commentbox_main').style.width = '100%'
140 | tempdom.querySelector('#tbCommentBody').style.maxWidth = '100%'
141 | tempdom.querySelector('#tbCommentBody').style.minWidth = '100%'
142 | tempdom.querySelector('#commentform_title').style.padding = '0'
143 | tempdom.querySelector('#commentform_title').style.backgroundImage = 'none'
144 |
145 | post.commentForm = ''
146 | for (let index = 0; index < tempdom.children.length; index++) {
147 | const formdom = tempdom.children[index]
148 | if (formdom.tagName !== 'SCRIPT') post.commentForm += formdom.outerHTML
149 | }
150 | post.async.commentForm = true
151 | }
152 | })(vm.post))
153 | }
154 |
155 | // FillPost 文章和文章列表共用逻辑
156 | function FillPost(post, dom) {
157 | const detaildom = dom.querySelector('#post_detail')
158 | // title url
159 | const titledom = detaildom.querySelector('.postTitle a')
160 | if (!post.url)
161 | post.url = titledom.href.trim()
162 | if (!post.title)
163 | post.title = titledom.innerText.trim()
164 | // content
165 | const bodydom = detaildom.querySelector('#cnblogs_post_body')
166 | highlightNumber(bodydom)
167 | post.content = bodydom.innerHTML.trim()
168 | // preview
169 | if (!bodydom.querySelector('.more')) post.preview = post.content
170 | else post.preview = ''
171 | for (let index = 0; index < bodydom.children.length && bodydom.querySelector('.more'); index++) {
172 | const childdom = bodydom.children[index]
173 | if (childdom == bodydom.querySelector('.more') || childdom.querySelector('.more')) break
174 | post.preview += childdom.outerHTML
175 | }
176 | // desc
177 | const descdom = detaildom.querySelector('.postDesc')
178 | post.desc = {}
179 | post.desc.date = descdom.querySelector('#post-date').innerText
180 | post.desc.viewCount = descdom.querySelector('#post_view_count').innerText
181 | post.desc.commentCount = descdom.querySelector('#post_comment_count').innerText
182 | // postid
183 | const bdoms = descdom.querySelectorAll('a')
184 | bdoms.forEach(e => {
185 | if (e.innerText === '编辑') post.postid = new URL(e.href).searchParams.get('postid')
186 | })
187 | // tags(async)
188 | if (!post.postid) { post.async.tags = true; return }
189 | post.async.tags = false
190 | Get(getAjaxBaseUrl() + `CategoriesTags.aspx?blogId=${currentBlogId}&postId=${post.postid}`).then(((post) => {
191 | return (r) => {
192 | const tempdom = document.createElement('div')
193 | tempdom.innerHTML = r.responseText.trim()
194 | const tagsdoms = tempdom.querySelectorAll('a')
195 | const tags = []
196 | for (let index = 0; index < tagsdoms.length; index++) {
197 | const tagdom = tagsdoms[index]
198 | const tag = {}
199 | tag.desc = tagdom.innerText.trim()
200 | tag.url = tagdom.href.trim()
201 | tags.push(tag)
202 | }
203 | post.tags = tags
204 | post.async.tags = true
205 | console.debug(`tags${post.tags} loaded`)
206 | }
207 | })(post))
208 | console.debug(`post${post} loaded`)
209 | }
--------------------------------------------------------------------------------