From 636ae7b1696d3af403d74fc72bf5f15bf254d74c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E8=8E=AB=E5=94=90=E5=B0=BC?= <49033970+XiaoMoDonnie@users.noreply.github.com> Date: Tue, 6 Dec 2022 15:08:29 +0800 Subject: [PATCH] =?UTF-8?q?v1.0.0-beta=20=E6=BA=90=E7=A0=81=E6=AD=A3?= =?UTF-8?q?=E5=BC=8F=E5=BC=80=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 5 + .hbuilderx/launch.json | 20 + App.vue | 77 + CHANGELOG.md | 3 + GIT_README.md | 19 + LICENSE | 20 + README.md | 76 + api/admin/attachment.js | 86 + api/admin/category.js | 70 + api/admin/comments.js | 142 + api/admin/journal.js | 61 + api/admin/links.js | 59 + api/admin/logs.js | 28 + api/admin/photos.js | 101 + api/admin/posts.js | 121 + api/admin/tags.js | 56 + api/admin/user.js | 83 + api/archive.js | 22 + api/article.js | 25 + api/blogger.js | 15 + api/category.js | 24 + api/comment.js | 45 + api/index.js | 77 + api/journal.js | 74 + api/link.js | 24 + api/login.js | 112 + api/menu.js | 24 + api/option.js | 30 + api/photo.js | 31 + api/post.js | 82 + api/sheet.js | 67 + api/statistics.js | 22 + api/theme.js | 40 + api/url.js | 1 + common/filters/index.js | 74 + common/http/index.js | 38 + common/http/interceptors.js | 84 + common/http/request.js | 29 + common/icons/halocoloriconfont.css | 91 + common/icons/haloiconfont.css | 90 + common/icons/mphtmliconfont.css | 86 + common/locales/en.js | 23 + common/locales/zh.js | 23 + common/markdown/markdown.config.js | 97 + common/markdown/markdown.scss | 155 + common/mixins/index.js | 67 + common/styles/app.base.scss | 38 + common/styles/app.theme.scss | 8 + common/theme/theme.css | 5 + components/article-card/article-card.vue | 304 + .../article-min-card/article-min-card.vue | 197 + .../attachment-select/attachment-select.vue | 207 + .../bottom-tool-bar/bottom-tool-bar.vue | 194 + components/cache-image/cache-image.vue | 180 + .../category-mini-card/category-mini-card.vue | 63 + components/comment-item/comment-item.vue | 147 + components/comment-list/comment-list.vue | 266 + components/e-swiper/e-swiper.scss | 341 + components/e-swiper/e-swiper.vue | 233 + components/journal-card/journal-card.vue | 177 + components/lff-barrage/lff-barrage.vue | 250 + components/lff-barrage/markdown.md | 15 + .../components/mp-html/editable/config.js | 11 + .../components/mp-html/editable/index.js | 532 + .../mp-html/components/mp-html/emoji/index.js | 203 + .../components/mp-html/highlight/config.js | 5 + .../components/mp-html/highlight/index.js | 96 + .../components/mp-html/highlight/prism.min.js | 7 + .../components/mp-html/img-cache/index.js | 138 + .../components/mp-html/markdown/index.js | 34 + .../components/mp-html/markdown/marked.min.js | 6 + .../mp-html/components/mp-html/mp-html.vue | 579 + .../mp-html/components/mp-html/node/node.vue | 1119 + .../mp-html/components/mp-html/parser.js | 1342 + .../mp-html/components/mp-html/style/index.js | 129 + .../components/mp-html/style/parser.js | 175 + .../static/app-plus/mp-html/js/handler.js | 1 + .../app-plus/mp-html/js/uni.webview.min.js | 1 + .../static/app-plus/mp-html/local.html | 1 + components/r-canvas/r-canvas.js | 735 + components/r-canvas/r-canvas.vue | 26 + components/t-color-picker/t-color-picker.vue | 784 + components/wave/wave.vue | 89 + config/ad.config.template.js | 20 + config/halo.config.template.js | 113 + config/keys.js | 7 + config/sheets.config.js | 8 + index.html | 20 + js_sdk/fy-showModal/index.js | 72 + js_sdk/fy-showModal/router-interceptor.js | 62 + js_sdk/fy-showModal/showModal.js | 176 + .../luch-request/adapters/index.js | 99 + .../luch-request/core/InterceptorManager.js | 51 + .../luch-request/luch-request/core/Request.js | 200 + .../luch-request/core/buildFullPath.js | 20 + .../luch-request/core/defaults.js | 30 + .../luch-request/core/dispatchRequest.js | 6 + .../luch-request/core/mergeConfig.js | 103 + .../luch-request/luch-request/core/settle.js | 16 + .../luch-request/helpers/buildURL.js | 69 + .../luch-request/helpers/combineURLs.js | 14 + .../luch-request/helpers/isAbsoluteURL.js | 14 + js_sdk/luch-request/luch-request/index.d.ts | 116 + js_sdk/luch-request/luch-request/index.js | 2 + js_sdk/luch-request/luch-request/utils.js | 135 + .../luch-request/luch-request/utils/clone.js | 264 + js_sdk/luch-request/package.json | 13 + main.js | 88 + manifest.json | 159 + package.json | 9 + pages.json | 542 + pages/index/index.vue | 25 + pages/tabbar/about/about.vue | 577 + pages/tabbar/category/category.vue | 229 + pages/tabbar/gallery/gallery.vue | 317 + pages/tabbar/home/home.vue | 464 + pages/tabbar/links/links.vue | 335 + pages/template.vue | 134 + pagesA/about/about.vue | 94 + pagesA/archives/archives.vue | 340 + pagesA/article-detail/article-detail.vue | 771 + pagesA/articles/articles.vue | 203 + pagesA/category-detail/category-detail.vue | 144 + pagesA/comment/comment.vue | 163 + pagesA/contact/contact.vue | 268 + pagesA/disclaimers/disclaimers.vue | 42 + pagesA/journal/journal.vue | 133 + pagesA/leaving/leaving.vue | 263 + pagesA/love/love.vue | 22 + pagesA/setting/setting.vue | 312 + pagesA/start/start.vue | 386 + pagesB/admin/admin.vue | 286 + pagesB/articles/article-edit.vue | 687 + pagesB/articles/article-setting.vue | 760 + pagesB/articles/articles.vue | 404 + pagesB/attachment/attachment.vue | 767 + pagesB/category/category.vue | 420 + pagesB/comments/comments.vue | 476 + pagesB/journal/journal-edit.vue | 620 + pagesB/journal/journal.vue | 176 + pagesB/links/links.vue | 446 + pagesB/login/login.vue | 185 + pagesB/logs/logs.vue | 303 + pagesB/menus/menus.vue | 30 + pagesB/password/password.vue | 146 + pagesB/photos/photos-edit.vue | 19 + pagesB/photos/photos.vue | 553 + pagesB/profile/profile.vue | 249 + pagesB/settings/settings.vue | 30 + pagesB/tags/tags.vue | 387 + pagesB/template.vue | 93 + pagesC/website/website.vue | 25 + router/router.js | 87 + static/login/login_bottom_bg.jpg | Bin 0 -> 17085 bytes static/login/login_top2.jpg | Bin 0 -> 29842 bytes static/summer.jpg | Bin 0 -> 18367 bytes static/tabbar/select_category.png | Bin 0 -> 5898 bytes static/tabbar/select_category_active.png | Bin 0 -> 6287 bytes static/tabbar/select_gallery.png | Bin 0 -> 4003 bytes static/tabbar/select_gallery_active.png | Bin 0 -> 5371 bytes static/tabbar/select_home.png | Bin 0 -> 3851 bytes static/tabbar/select_home_active.png | Bin 0 -> 4897 bytes static/tabbar/select_links.png | Bin 0 -> 4975 bytes static/tabbar/select_links_active.png | Bin 0 -> 7174 bytes static/tabbar/select_mine.png | Bin 0 -> 4420 bytes static/tabbar/select_mine_active.png | Bin 0 -> 5264 bytes static/wave/wave-1.png | Bin 0 -> 4147 bytes static/wave/wave-2.png | Bin 0 -> 5203 bytes store/article.js | 27 + store/blogger.js | 42 + store/comment.js | 27 + store/journal.js | 27 + store/setting.js | 46 + store/user.js | 82 + tm-vuetify/.npmignore | 12 + tm-vuetify/changelog.md | 530 + .../tm-actionSheet/tm-actionSheet.vue | 151 + .../tm-actionSheetMenu/tm-actionSheetMenu.vue | 170 + tm-vuetify/components/tm-album/tm-album.vue | 226 + tm-vuetify/components/tm-alerts/tm-alerts.vue | 290 + tm-vuetify/components/tm-avatar/tm-avatar.vue | 204 + .../tm-avatarCrop/tm-avatarCrop.vue | 524 + .../tm-avatarGroup/tm-avatarGroup.vue | 58 + tm-vuetify/components/tm-badges/tm-badges.vue | 147 + .../components/tm-banners/tm-banners.vue | 258 + .../tm-bottomnavigation.vue | 466 + tm-vuetify/components/tm-button/tm-button.vue | 702 + .../components/tm-calendar/tm-calendar.vue | 959 + .../tm-calendarView/tm-calendarView.vue | 887 + tm-vuetify/components/tm-card/tm-card.vue | 210 + .../tm-cartBarFood/tm-cartBarFood.vue | 379 + .../tm-cartCellListFood.vue | 211 + .../components/tm-checkbox/tm-checkbox.vue | 310 + .../components/tm-choujiang/tm-choujiang.vue | 270 + .../tm-choujiangGame/tm-choujiangGame.vue | 467 + .../tm-choujiangGrid/tm-choujiangGrid.vue | 318 + tm-vuetify/components/tm-col/tm-col.vue | 162 + .../components/tm-countdown/tm-countdown.vue | 124 + tm-vuetify/components/tm-coupon/tm-coupon.vue | 137 + tm-vuetify/components/tm-dialog/tm-dialog.vue | 347 + .../components/tm-divider/tm-divider.vue | 166 + .../components/tm-dragGrid/tm-dragGrid.vue | 329 + .../components/tm-dragList/tm-dragList.vue | 272 + .../components/tm-dropDownMenu/doc.json | 107 + .../tm-dropDownMenu/tm-dropDownMenu.vue | 547 + .../components/tm-echarts/tm-echarts.vue | 380 + tm-vuetify/components/tm-empty/tm-empty.vue | 78 + .../tm-flop/requestAnimationFrame.js | 46 + tm-vuetify/components/tm-flop/tm-flop.vue | 273 + .../tm-flotbutton/tm-flotbutton.vue | 431 + .../tm-flowLayout/tm-flowLayout.vue | 206 + tm-vuetify/components/tm-form/tm-form.vue | 217 + .../tm-formGeneration/tm-formGeneration.vue | 29 + .../components/tm-fullView/tm-fullView.vue | 72 + tm-vuetify/components/tm-gap/tm-gap.vue | 38 + tm-vuetify/components/tm-grid/tm-grid.vue | 177 + .../tm-groupButton/tm-groupButton.vue | 105 + .../tm-groupcheckbox/tm-groupcheckbox.vue | 124 + .../components/tm-grouplist/tm-grouplist.vue | 166 + .../tm-groupradio/tm-groupradio.vue | 84 + .../components/tm-helpTips/tm-helpTips.vue | 210 + tm-vuetify/components/tm-icons/tm-icons.vue | 187 + tm-vuetify/components/tm-images/tm-images.vue | 201 + tm-vuetify/components/tm-input/tm-input.vue | 533 + .../components/tm-keyborad/tm-keyborad.vue | 408 + .../components/tm-listitem/tm-listitem.vue | 393 + .../components/tm-loadding/tm-loadding.vue | 119 + tm-vuetify/components/tm-lottie/tm-lottie.vue | 210 + .../tm-mapSelectedPoint.vue | 432 + .../components/tm-maskFlow/tm-maskFlow.vue | 132 + tm-vuetify/components/tm-menu/tm-menu.vue | 223 + .../components/tm-menubars/tm-menubars.vue | 259 + .../components/tm-message/tm-message.vue | 365 + .../tm-monthCalendar/tm-monthCalendar.vue | 302 + tm-vuetify/components/tm-more/tm-more.vue | 177 + .../tm-pagination/tm-pagination.vue | 230 + .../components/tm-password/tm-password.vue | 240 + .../components/tm-pickers/tm-pickers.vue | 216 + .../tm-pickersCity/tm-pickersCity.vue | 285 + .../tm-pickersCityView/tm-pickersCityView.vue | 160 + .../tm-pickersDate/tm-pickersDate.vue | 244 + .../tm-pickersDateView - 副本 (2).vue | 621 + .../tm-pickersDateView - 副本.vue | 836 + .../tm-pickersDateView/tm-pickersDateView.vue | 650 + .../tm-pickersView/tm-pickersView.vue | 538 + .../tm-pickersView/tm-pickersViewsss.vue | 587 + .../components/tm-position/tm-position.vue | 78 + tm-vuetify/components/tm-poup/tm-poup.vue | 519 + .../components/tm-propress/tm-propress.vue | 251 + .../tm-propressRound/tm-propressRound.vue | 345 + .../tm-pullBottom/tm-pullBottom.vue | 222 + .../components/tm-quickCity/tm-quickCity.vue | 624 + .../tm-quickIndex/tm-quickIndex.vue | 328 + tm-vuetify/components/tm-radio/tm-radio.vue | 263 + tm-vuetify/components/tm-rate/tm-rate.vue | 148 + tm-vuetify/components/tm-ratio/tm-ratio.vue | 170 + .../components/tm-render/tm-render - 副本.vue | 449 + tm-vuetify/components/tm-render/tm-render.vue | 787 + tm-vuetify/components/tm-row/tm-row.vue | 105 + tm-vuetify/components/tm-scroll/tm-scroll.vue | 106 + tm-vuetify/components/tm-search/tm-search.vue | 210 + .../components/tm-segTabs/tm-segTabs.vue | 290 + .../tm-shareSheet/tm-shareSheet.vue | 167 + tm-vuetify/components/tm-sheet/tm-sheet.vue | 180 + .../components/tm-signBoard/tm-signBoard.vue | 191 + .../components/tm-skeleton/tm-skeleton.vue | 94 + tm-vuetify/components/tm-slider/tm-slider.vue | 469 + .../components/tm-sliderNav/tm-sliderNav.vue | 188 + .../components/tm-sliders/tm-sliders.vue | 572 + .../components/tm-stepper/tm-stepper.vue | 315 + tm-vuetify/components/tm-steps/tm-steps.vue | 268 + .../components/tm-stepsItem/tm-stepsItem.vue | 182 + tm-vuetify/components/tm-sticky/tm-sticky.vue | 99 + tm-vuetify/components/tm-swiper/tm-swiper.vue | 464 + .../tm-swiperList/tm-swiperList.vue | 193 + .../tm-swiperListItem/tm-swiperListItem.vue | 74 + tm-vuetify/components/tm-switch/tm-switch.vue | 252 + .../tm-switchList/tm-switchList.vue | 415 + tm-vuetify/components/tm-table/tm-table.vue | 291 + tm-vuetify/components/tm-tabs/tm-tabs.vue | 391 + tm-vuetify/components/tm-tags/tm-tags.vue | 191 + .../components/tm-timeline/tm-timeline.vue | 310 + .../components/tm-translate/tm-translate.vue | 355 + tm-vuetify/components/tm-tree/tm-tree.vue | 998 + .../tm-treeSelect/tm-treeSelect.vue | 311 + tm-vuetify/components/tm-upload/tm-upload.vue | 444 + .../tm-uploadfile/tm-uploadfile.vue | 441 + .../tm-verificationImg/tm-verificationImg.vue | 137 + tm-vuetify/components/tm-vuetify/说明.md | 1 + .../components/tm-weekbar/tm-weekbar.vue | 188 + tm-vuetify/index.js | 100 + tm-vuetify/license.md | 3 + tm-vuetify/mian.min.css | 1 + tm-vuetify/package.json | 95 + tm-vuetify/readme.md | 35 + tm-vuetify/scss/fonts/fontawesome_base64.css | 9 + tm-vuetify/scss/fonts/mdi_base64.css | 23961 ++++++++++++++++ tm-vuetify/scss/iconfonts/demo.css | 539 + tm-vuetify/scss/iconfonts/iconfont.css | 1150 + tm-vuetify/scss/iconfonts/iconfont.js | 1 + tm-vuetify/scss/iconfonts/iconfont.json | 1913 ++ tm-vuetify/scss/iconfonts/iconfont.ttf | Bin 0 -> 43784 bytes tm-vuetify/scss/iconfonts/index.html | 6355 ++++ tm-vuetify/scss/theme.css | 28 + tm-vuetify/scss/theme/amber.css | 5 + tm-vuetify/scss/theme/blue-grey.css | 5 + tm-vuetify/scss/theme/blue.css | 5 + tm-vuetify/scss/theme/brown.css | 5 + tm-vuetify/scss/theme/cyan.css | 5 + tm-vuetify/scss/theme/deep-orange.css | 5 + tm-vuetify/scss/theme/deep-purple.css | 5 + tm-vuetify/scss/theme/green.css | 5 + tm-vuetify/scss/theme/indigo.css | 5 + tm-vuetify/scss/theme/light-blue.css | 5 + tm-vuetify/scss/theme/light-green.css | 5 + tm-vuetify/scss/theme/lime.css | 5 + tm-vuetify/scss/theme/orange.css | 5 + tm-vuetify/scss/theme/pink.css | 5 + tm-vuetify/scss/theme/primary.css | 5 + tm-vuetify/scss/theme/purple.css | 5 + tm-vuetify/scss/theme/red.css | 5 + tm-vuetify/scss/theme/teal.css | 5 + tm-vuetify/scss/theme/yellow.css | 5 + tm-vuetify/tool/config/config.js | 11 + tm-vuetify/tool/function/calendar.js | 553 + tm-vuetify/tool/function/choujianggailv.js | 41 + tm-vuetify/tool/function/clipboardJS.js | 15 + tm-vuetify/tool/function/color.js | 272 + .../core/bezierCurveToPolyline.js | 310 + .../crender/bezier-curve/core/path2d.js | 465 + .../core/polylineToBezierCurve.js | 111 + .../function/crender/bezier-curve/index.js | 11 + .../function/crender/class/crender.class.js | 2151 ++ .../function/crender/class/graph.class.js | 377 + .../function/crender/class/style.class.js | 467 + .../function/crender/color/config/keywords.js | 150 + .../tool/function/crender/color/index.js | 299 + .../tool/function/crender/config/graphs.js | 2044 ++ .../tool/function/crender/crender.min.js | 1 + .../tool/function/crender/graph/path2d.js | 679 + .../tool/function/crender/graph/ring.js | 136 + tm-vuetify/tool/function/crender/index.js | 11 + .../tool/function/crender/plugin/canvas.js | 50 + .../tool/function/crender/plugin/util.js | 332 + .../crender/transition/config/curves.js | 109 + .../tool/function/crender/transition/index.js | 310 + tm-vuetify/tool/function/dayjs/dayjs.min.js | 1 + tm-vuetify/tool/function/dayjs/index.js | 12 + .../tool/function/dayjs/isBetween.min.js | 5 + .../tool/function/dayjs/relativeTime.min.js | 5 + .../tool/function/dayjs/toObject.min.js | 5 + tm-vuetify/tool/function/dayjs/zh-cn.min.js | 7 + tm-vuetify/tool/function/deepClone.js | 24 + tm-vuetify/tool/function/deepMerge.js | 31 + tm-vuetify/tool/function/echarts.min.js | 18 + tm-vuetify/tool/function/findCnChart.js | 452 + tm-vuetify/tool/function/getParent.js | 48 + tm-vuetify/tool/function/getParentAls.js | 19 + tm-vuetify/tool/function/getParentAttr.js | 18 + tm-vuetify/tool/function/guid.js | 41 + tm-vuetify/tool/function/js-search.min.js | 2 + tm-vuetify/tool/function/lottie.js | 1 + tm-vuetify/tool/function/md5.js | 385 + tm-vuetify/tool/function/mixin.js | 53 + tm-vuetify/tool/function/objToString.js | 11 + tm-vuetify/tool/function/phaser.min.js | 1 + tm-vuetify/tool/function/preview.js | 53 + tm-vuetify/tool/function/random.js | 10 + tm-vuetify/tool/function/randomArray.js | 7 + tm-vuetify/tool/function/signBoard.js | 388 + tm-vuetify/tool/function/sleep.js | 16 + tm-vuetify/tool/function/test.js | 200 + tm-vuetify/tool/function/theme.js | 32 + tm-vuetify/tool/function/toast.js | 9 + tm-vuetify/tool/function/trim.js | 15 + .../tool/function/uni-echarts-canvas.js | 105 + tm-vuetify/tool/function/upload.js | 447 + tm-vuetify/tool/function/util.js | 234 + tm-vuetify/tool/function/vuex.js | 63 + tm-vuetify/tool/function/wxshare.js | 50 + tm-vuetify/tool/mixin/mixin.js | 168 + tm-vuetify/tool/request/index.js | 170 + tm-vuetify/tool/store/tm-vuetify.js | 91 + tm-vuetify/tool/util/area.js | 1 + tm-vuetify/tool/util/city.js | 1 + tm-vuetify/tool/util/emitter.js | 51 + tm-vuetify/tool/util/province.js | 2 + uni.scss | 76 + uni_modules/lsj-upload/changelog.md | 92 + .../components/lsj-upload/LsjFile.js | 392 + .../components/lsj-upload/lsj-upload.vue | 310 + .../lsj-upload/hybrid/html/js/vue.min.js | 8 + .../lsj-upload/hybrid/html/uploadFile.html | 179 + uni_modules/lsj-upload/package.json | 82 + uni_modules/lsj-upload/readme.md | 330 + uni_modules/uni-config-center/changelog.md | 6 + uni_modules/uni-config-center/package.json | 81 + uni_modules/uni-config-center/readme.md | 93 + .../common/uni-config-center/index.js | 1 + .../common/uni-config-center/package.json | 9 + uni_modules/uni-id-common/changelog.md | 26 + uni_modules/uni-id-common/package.json | 87 + uni_modules/uni-id-common/readme.md | 3 + .../common/uni-id-common/index.js | 1 + .../common/uni-id-common/package.json | 16 + .../uni-upgrade-center-app/changelog.md | 66 + .../images/app_update_close.png | Bin 0 -> 7644 bytes .../uni-upgrade-center-app/images/bg_top.png | Bin 0 -> 30486 bytes .../uni-upgrade-center-app/package.json | 81 + .../pages/upgrade-popup.vue | 539 + .../uni-upgrade-center-app/pages_init.json | 18 + uni_modules/uni-upgrade-center-app/readme.md | 126 + .../uniCloud/cloudfunctions/temp.png | Bin 0 -> 7644 bytes .../uniCloud/database/db_init.json | 1 + .../utils/call-check-version.js | 33 + .../utils/check-update.js | 158 + uni_modules/z-paging/changelog.md | 5 + .../z-paging-cell/z-paging-cell.vue | 34 + .../z-paging-empty-view.vue | 163 + .../z-paging-swiper-item.vue | 145 + .../z-paging-swiper/z-paging-swiper.vue | 227 + .../components/z-paging-load-more.vue | 152 + .../z-paging/components/z-paging-refresh.vue | 273 + .../components/z-paging/config/index.js | 3 + .../components/z-paging/css/z-paging-main.css | 227 + .../z-paging/css/z-paging-static.css | 35 + .../z-paging/js/modules/back-to-top.js | 108 + .../z-paging/js/modules/data-handle.js | 731 + .../components/z-paging/js/modules/empty.js | 154 + .../components/z-paging/js/modules/i18n.js | 98 + .../z-paging/js/modules/load-more.js | 328 + .../components/z-paging/js/modules/nvue.js | 220 + .../z-paging/js/modules/refresher.js | 632 + .../z-paging/js/modules/scroller.js | 478 + .../z-paging/js/modules/virtual-list.js | 374 + .../components/z-paging/js/z-paging-config.js | 26 + .../z-paging/js/z-paging-constant.js | 21 + .../components/z-paging/js/z-paging-enum.js | 37 + .../components/z-paging/js/z-paging-i18n.js | 133 + .../z-paging/js/z-paging-interceptor.js | 34 + .../components/z-paging/js/z-paging-main.js | 604 + .../components/z-paging/js/z-paging-mixin.js | 26 + .../components/z-paging/js/z-paging-static.js | 23 + .../components/z-paging/js/z-paging-utils.js | 244 + .../z-paging/wxs/z-paging-renderjs.js | 68 + .../components/z-paging/wxs/z-paging-wxs.wxs | 354 + .../z-paging/components/z-paging/z-paging.vue | 354 + uni_modules/z-paging/package.json | 85 + uni_modules/z-paging/readme.md | 40 + utils/app.js | 78 + utils/auth.js | 78 + utils/imageCache.js | 52 + utils/index.js | 139 + utils/network.js | 26 + utils/permission.js | 80 + utils/random.js | 35 + utils/storage.js | 39 + utils/throttle.js | 32 + utils/update.js | 47 + utils/utils.js | 0 vue.config.js | 32 + 461 files changed, 116817 insertions(+) create mode 100644 .gitignore create mode 100644 .hbuilderx/launch.json create mode 100644 App.vue create mode 100644 CHANGELOG.md create mode 100644 GIT_README.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 api/admin/attachment.js create mode 100644 api/admin/category.js create mode 100644 api/admin/comments.js create mode 100644 api/admin/journal.js create mode 100644 api/admin/links.js create mode 100644 api/admin/logs.js create mode 100644 api/admin/photos.js create mode 100644 api/admin/posts.js create mode 100644 api/admin/tags.js create mode 100644 api/admin/user.js create mode 100644 api/archive.js create mode 100644 api/article.js create mode 100644 api/blogger.js create mode 100644 api/category.js create mode 100644 api/comment.js create mode 100644 api/index.js create mode 100644 api/journal.js create mode 100644 api/link.js create mode 100644 api/login.js create mode 100644 api/menu.js create mode 100644 api/option.js create mode 100644 api/photo.js create mode 100644 api/post.js create mode 100644 api/sheet.js create mode 100644 api/statistics.js create mode 100644 api/theme.js create mode 100644 api/url.js create mode 100644 common/filters/index.js create mode 100644 common/http/index.js create mode 100644 common/http/interceptors.js create mode 100644 common/http/request.js create mode 100644 common/icons/halocoloriconfont.css create mode 100644 common/icons/haloiconfont.css create mode 100644 common/icons/mphtmliconfont.css create mode 100644 common/locales/en.js create mode 100644 common/locales/zh.js create mode 100644 common/markdown/markdown.config.js create mode 100644 common/markdown/markdown.scss create mode 100644 common/mixins/index.js create mode 100644 common/styles/app.base.scss create mode 100644 common/styles/app.theme.scss create mode 100644 common/theme/theme.css create mode 100644 components/article-card/article-card.vue create mode 100644 components/article-min-card/article-min-card.vue create mode 100644 components/attachment-select/attachment-select.vue create mode 100644 components/bottom-tool-bar/bottom-tool-bar.vue create mode 100644 components/cache-image/cache-image.vue create mode 100644 components/category-mini-card/category-mini-card.vue create mode 100644 components/comment-item/comment-item.vue create mode 100644 components/comment-list/comment-list.vue create mode 100644 components/e-swiper/e-swiper.scss create mode 100644 components/e-swiper/e-swiper.vue create mode 100644 components/journal-card/journal-card.vue create mode 100644 components/lff-barrage/lff-barrage.vue create mode 100644 components/lff-barrage/markdown.md create mode 100644 components/mp-html/components/mp-html/editable/config.js create mode 100644 components/mp-html/components/mp-html/editable/index.js create mode 100644 components/mp-html/components/mp-html/emoji/index.js create mode 100644 components/mp-html/components/mp-html/highlight/config.js create mode 100644 components/mp-html/components/mp-html/highlight/index.js create mode 100644 components/mp-html/components/mp-html/highlight/prism.min.js create mode 100644 components/mp-html/components/mp-html/img-cache/index.js create mode 100644 components/mp-html/components/mp-html/markdown/index.js create mode 100644 components/mp-html/components/mp-html/markdown/marked.min.js create mode 100644 components/mp-html/components/mp-html/mp-html.vue create mode 100644 components/mp-html/components/mp-html/node/node.vue create mode 100644 components/mp-html/components/mp-html/parser.js create mode 100644 components/mp-html/components/mp-html/style/index.js create mode 100644 components/mp-html/components/mp-html/style/parser.js create mode 100644 components/mp-html/static/app-plus/mp-html/js/handler.js create mode 100644 components/mp-html/static/app-plus/mp-html/js/uni.webview.min.js create mode 100644 components/mp-html/static/app-plus/mp-html/local.html create mode 100644 components/r-canvas/r-canvas.js create mode 100644 components/r-canvas/r-canvas.vue create mode 100644 components/t-color-picker/t-color-picker.vue create mode 100644 components/wave/wave.vue create mode 100644 config/ad.config.template.js create mode 100644 config/halo.config.template.js create mode 100644 config/keys.js create mode 100644 config/sheets.config.js create mode 100644 index.html create mode 100644 js_sdk/fy-showModal/index.js create mode 100644 js_sdk/fy-showModal/router-interceptor.js create mode 100644 js_sdk/fy-showModal/showModal.js create mode 100644 js_sdk/luch-request/luch-request/adapters/index.js create mode 100644 js_sdk/luch-request/luch-request/core/InterceptorManager.js create mode 100644 js_sdk/luch-request/luch-request/core/Request.js create mode 100644 js_sdk/luch-request/luch-request/core/buildFullPath.js create mode 100644 js_sdk/luch-request/luch-request/core/defaults.js create mode 100644 js_sdk/luch-request/luch-request/core/dispatchRequest.js create mode 100644 js_sdk/luch-request/luch-request/core/mergeConfig.js create mode 100644 js_sdk/luch-request/luch-request/core/settle.js create mode 100644 js_sdk/luch-request/luch-request/helpers/buildURL.js create mode 100644 js_sdk/luch-request/luch-request/helpers/combineURLs.js create mode 100644 js_sdk/luch-request/luch-request/helpers/isAbsoluteURL.js create mode 100644 js_sdk/luch-request/luch-request/index.d.ts create mode 100644 js_sdk/luch-request/luch-request/index.js create mode 100644 js_sdk/luch-request/luch-request/utils.js create mode 100644 js_sdk/luch-request/luch-request/utils/clone.js create mode 100644 js_sdk/luch-request/package.json create mode 100644 main.js create mode 100644 manifest.json create mode 100644 package.json create mode 100644 pages.json create mode 100644 pages/index/index.vue create mode 100644 pages/tabbar/about/about.vue create mode 100644 pages/tabbar/category/category.vue create mode 100644 pages/tabbar/gallery/gallery.vue create mode 100644 pages/tabbar/home/home.vue create mode 100644 pages/tabbar/links/links.vue create mode 100644 pages/template.vue create mode 100644 pagesA/about/about.vue create mode 100644 pagesA/archives/archives.vue create mode 100644 pagesA/article-detail/article-detail.vue create mode 100644 pagesA/articles/articles.vue create mode 100644 pagesA/category-detail/category-detail.vue create mode 100644 pagesA/comment/comment.vue create mode 100644 pagesA/contact/contact.vue create mode 100644 pagesA/disclaimers/disclaimers.vue create mode 100644 pagesA/journal/journal.vue create mode 100644 pagesA/leaving/leaving.vue create mode 100644 pagesA/love/love.vue create mode 100644 pagesA/setting/setting.vue create mode 100644 pagesA/start/start.vue create mode 100644 pagesB/admin/admin.vue create mode 100644 pagesB/articles/article-edit.vue create mode 100644 pagesB/articles/article-setting.vue create mode 100644 pagesB/articles/articles.vue create mode 100644 pagesB/attachment/attachment.vue create mode 100644 pagesB/category/category.vue create mode 100644 pagesB/comments/comments.vue create mode 100644 pagesB/journal/journal-edit.vue create mode 100644 pagesB/journal/journal.vue create mode 100644 pagesB/links/links.vue create mode 100644 pagesB/login/login.vue create mode 100644 pagesB/logs/logs.vue create mode 100644 pagesB/menus/menus.vue create mode 100644 pagesB/password/password.vue create mode 100644 pagesB/photos/photos-edit.vue create mode 100644 pagesB/photos/photos.vue create mode 100644 pagesB/profile/profile.vue create mode 100644 pagesB/settings/settings.vue create mode 100644 pagesB/tags/tags.vue create mode 100644 pagesB/template.vue create mode 100644 pagesC/website/website.vue create mode 100644 router/router.js create mode 100644 static/login/login_bottom_bg.jpg create mode 100644 static/login/login_top2.jpg create mode 100644 static/summer.jpg create mode 100644 static/tabbar/select_category.png create mode 100644 static/tabbar/select_category_active.png create mode 100644 static/tabbar/select_gallery.png create mode 100644 static/tabbar/select_gallery_active.png create mode 100644 static/tabbar/select_home.png create mode 100644 static/tabbar/select_home_active.png create mode 100644 static/tabbar/select_links.png create mode 100644 static/tabbar/select_links_active.png create mode 100644 static/tabbar/select_mine.png create mode 100644 static/tabbar/select_mine_active.png create mode 100644 static/wave/wave-1.png create mode 100644 static/wave/wave-2.png create mode 100644 store/article.js create mode 100644 store/blogger.js create mode 100644 store/comment.js create mode 100644 store/journal.js create mode 100644 store/setting.js create mode 100644 store/user.js create mode 100644 tm-vuetify/.npmignore create mode 100644 tm-vuetify/changelog.md create mode 100644 tm-vuetify/components/tm-actionSheet/tm-actionSheet.vue create mode 100644 tm-vuetify/components/tm-actionSheetMenu/tm-actionSheetMenu.vue create mode 100644 tm-vuetify/components/tm-album/tm-album.vue create mode 100644 tm-vuetify/components/tm-alerts/tm-alerts.vue create mode 100644 tm-vuetify/components/tm-avatar/tm-avatar.vue create mode 100644 tm-vuetify/components/tm-avatarCrop/tm-avatarCrop.vue create mode 100644 tm-vuetify/components/tm-avatarGroup/tm-avatarGroup.vue create mode 100644 tm-vuetify/components/tm-badges/tm-badges.vue create mode 100644 tm-vuetify/components/tm-banners/tm-banners.vue create mode 100644 tm-vuetify/components/tm-bottomnavigation/tm-bottomnavigation.vue create mode 100644 tm-vuetify/components/tm-button/tm-button.vue create mode 100644 tm-vuetify/components/tm-calendar/tm-calendar.vue create mode 100644 tm-vuetify/components/tm-calendarView/tm-calendarView.vue create mode 100644 tm-vuetify/components/tm-card/tm-card.vue create mode 100644 tm-vuetify/components/tm-cartBarFood/tm-cartBarFood.vue create mode 100644 tm-vuetify/components/tm-cartCellListFood/tm-cartCellListFood.vue create mode 100644 tm-vuetify/components/tm-checkbox/tm-checkbox.vue create mode 100644 tm-vuetify/components/tm-choujiang/tm-choujiang.vue create mode 100644 tm-vuetify/components/tm-choujiangGame/tm-choujiangGame.vue create mode 100644 tm-vuetify/components/tm-choujiangGrid/tm-choujiangGrid.vue create mode 100644 tm-vuetify/components/tm-col/tm-col.vue create mode 100644 tm-vuetify/components/tm-countdown/tm-countdown.vue create mode 100644 tm-vuetify/components/tm-coupon/tm-coupon.vue create mode 100644 tm-vuetify/components/tm-dialog/tm-dialog.vue create mode 100644 tm-vuetify/components/tm-divider/tm-divider.vue create mode 100644 tm-vuetify/components/tm-dragGrid/tm-dragGrid.vue create mode 100644 tm-vuetify/components/tm-dragList/tm-dragList.vue create mode 100644 tm-vuetify/components/tm-dropDownMenu/doc.json create mode 100644 tm-vuetify/components/tm-dropDownMenu/tm-dropDownMenu.vue create mode 100644 tm-vuetify/components/tm-echarts/tm-echarts.vue create mode 100644 tm-vuetify/components/tm-empty/tm-empty.vue create mode 100644 tm-vuetify/components/tm-flop/requestAnimationFrame.js create mode 100644 tm-vuetify/components/tm-flop/tm-flop.vue create mode 100644 tm-vuetify/components/tm-flotbutton/tm-flotbutton.vue create mode 100644 tm-vuetify/components/tm-flowLayout/tm-flowLayout.vue create mode 100644 tm-vuetify/components/tm-form/tm-form.vue create mode 100644 tm-vuetify/components/tm-formGeneration/tm-formGeneration.vue create mode 100644 tm-vuetify/components/tm-fullView/tm-fullView.vue create mode 100644 tm-vuetify/components/tm-gap/tm-gap.vue create mode 100644 tm-vuetify/components/tm-grid/tm-grid.vue create mode 100644 tm-vuetify/components/tm-groupButton/tm-groupButton.vue create mode 100644 tm-vuetify/components/tm-groupcheckbox/tm-groupcheckbox.vue create mode 100644 tm-vuetify/components/tm-grouplist/tm-grouplist.vue create mode 100644 tm-vuetify/components/tm-groupradio/tm-groupradio.vue create mode 100644 tm-vuetify/components/tm-helpTips/tm-helpTips.vue create mode 100644 tm-vuetify/components/tm-icons/tm-icons.vue create mode 100644 tm-vuetify/components/tm-images/tm-images.vue create mode 100644 tm-vuetify/components/tm-input/tm-input.vue create mode 100644 tm-vuetify/components/tm-keyborad/tm-keyborad.vue create mode 100644 tm-vuetify/components/tm-listitem/tm-listitem.vue create mode 100644 tm-vuetify/components/tm-loadding/tm-loadding.vue create mode 100644 tm-vuetify/components/tm-lottie/tm-lottie.vue create mode 100644 tm-vuetify/components/tm-mapSelectedPoint/tm-mapSelectedPoint.vue create mode 100644 tm-vuetify/components/tm-maskFlow/tm-maskFlow.vue create mode 100644 tm-vuetify/components/tm-menu/tm-menu.vue create mode 100644 tm-vuetify/components/tm-menubars/tm-menubars.vue create mode 100644 tm-vuetify/components/tm-message/tm-message.vue create mode 100644 tm-vuetify/components/tm-monthCalendar/tm-monthCalendar.vue create mode 100644 tm-vuetify/components/tm-more/tm-more.vue create mode 100644 tm-vuetify/components/tm-pagination/tm-pagination.vue create mode 100644 tm-vuetify/components/tm-password/tm-password.vue create mode 100644 tm-vuetify/components/tm-pickers/tm-pickers.vue create mode 100644 tm-vuetify/components/tm-pickersCity/tm-pickersCity.vue create mode 100644 tm-vuetify/components/tm-pickersCityView/tm-pickersCityView.vue create mode 100644 tm-vuetify/components/tm-pickersDate/tm-pickersDate.vue create mode 100644 tm-vuetify/components/tm-pickersDateView/tm-pickersDateView - 副本 (2).vue create mode 100644 tm-vuetify/components/tm-pickersDateView/tm-pickersDateView - 副本.vue create mode 100644 tm-vuetify/components/tm-pickersDateView/tm-pickersDateView.vue create mode 100644 tm-vuetify/components/tm-pickersView/tm-pickersView.vue create mode 100644 tm-vuetify/components/tm-pickersView/tm-pickersViewsss.vue create mode 100644 tm-vuetify/components/tm-position/tm-position.vue create mode 100644 tm-vuetify/components/tm-poup/tm-poup.vue create mode 100644 tm-vuetify/components/tm-propress/tm-propress.vue create mode 100644 tm-vuetify/components/tm-propressRound/tm-propressRound.vue create mode 100644 tm-vuetify/components/tm-pullBottom/tm-pullBottom.vue create mode 100644 tm-vuetify/components/tm-quickCity/tm-quickCity.vue create mode 100644 tm-vuetify/components/tm-quickIndex/tm-quickIndex.vue create mode 100644 tm-vuetify/components/tm-radio/tm-radio.vue create mode 100644 tm-vuetify/components/tm-rate/tm-rate.vue create mode 100644 tm-vuetify/components/tm-ratio/tm-ratio.vue create mode 100644 tm-vuetify/components/tm-render/tm-render - 副本.vue create mode 100644 tm-vuetify/components/tm-render/tm-render.vue create mode 100644 tm-vuetify/components/tm-row/tm-row.vue create mode 100644 tm-vuetify/components/tm-scroll/tm-scroll.vue create mode 100644 tm-vuetify/components/tm-search/tm-search.vue create mode 100644 tm-vuetify/components/tm-segTabs/tm-segTabs.vue create mode 100644 tm-vuetify/components/tm-shareSheet/tm-shareSheet.vue create mode 100644 tm-vuetify/components/tm-sheet/tm-sheet.vue create mode 100644 tm-vuetify/components/tm-signBoard/tm-signBoard.vue create mode 100644 tm-vuetify/components/tm-skeleton/tm-skeleton.vue create mode 100644 tm-vuetify/components/tm-slider/tm-slider.vue create mode 100644 tm-vuetify/components/tm-sliderNav/tm-sliderNav.vue create mode 100644 tm-vuetify/components/tm-sliders/tm-sliders.vue create mode 100644 tm-vuetify/components/tm-stepper/tm-stepper.vue create mode 100644 tm-vuetify/components/tm-steps/tm-steps.vue create mode 100644 tm-vuetify/components/tm-stepsItem/tm-stepsItem.vue create mode 100644 tm-vuetify/components/tm-sticky/tm-sticky.vue create mode 100644 tm-vuetify/components/tm-swiper/tm-swiper.vue create mode 100644 tm-vuetify/components/tm-swiperList/tm-swiperList.vue create mode 100644 tm-vuetify/components/tm-swiperListItem/tm-swiperListItem.vue create mode 100644 tm-vuetify/components/tm-switch/tm-switch.vue create mode 100644 tm-vuetify/components/tm-switchList/tm-switchList.vue create mode 100644 tm-vuetify/components/tm-table/tm-table.vue create mode 100644 tm-vuetify/components/tm-tabs/tm-tabs.vue create mode 100644 tm-vuetify/components/tm-tags/tm-tags.vue create mode 100644 tm-vuetify/components/tm-timeline/tm-timeline.vue create mode 100644 tm-vuetify/components/tm-translate/tm-translate.vue create mode 100644 tm-vuetify/components/tm-tree/tm-tree.vue create mode 100644 tm-vuetify/components/tm-treeSelect/tm-treeSelect.vue create mode 100644 tm-vuetify/components/tm-upload/tm-upload.vue create mode 100644 tm-vuetify/components/tm-uploadfile/tm-uploadfile.vue create mode 100644 tm-vuetify/components/tm-verificationImg/tm-verificationImg.vue create mode 100644 tm-vuetify/components/tm-vuetify/说明.md create mode 100644 tm-vuetify/components/tm-weekbar/tm-weekbar.vue create mode 100644 tm-vuetify/index.js create mode 100644 tm-vuetify/license.md create mode 100644 tm-vuetify/mian.min.css create mode 100644 tm-vuetify/package.json create mode 100644 tm-vuetify/readme.md create mode 100644 tm-vuetify/scss/fonts/fontawesome_base64.css create mode 100644 tm-vuetify/scss/fonts/mdi_base64.css create mode 100644 tm-vuetify/scss/iconfonts/demo.css create mode 100644 tm-vuetify/scss/iconfonts/iconfont.css create mode 100644 tm-vuetify/scss/iconfonts/iconfont.js create mode 100644 tm-vuetify/scss/iconfonts/iconfont.json create mode 100644 tm-vuetify/scss/iconfonts/iconfont.ttf create mode 100644 tm-vuetify/scss/iconfonts/index.html create mode 100644 tm-vuetify/scss/theme.css create mode 100644 tm-vuetify/scss/theme/amber.css create mode 100644 tm-vuetify/scss/theme/blue-grey.css create mode 100644 tm-vuetify/scss/theme/blue.css create mode 100644 tm-vuetify/scss/theme/brown.css create mode 100644 tm-vuetify/scss/theme/cyan.css create mode 100644 tm-vuetify/scss/theme/deep-orange.css create mode 100644 tm-vuetify/scss/theme/deep-purple.css create mode 100644 tm-vuetify/scss/theme/green.css create mode 100644 tm-vuetify/scss/theme/indigo.css create mode 100644 tm-vuetify/scss/theme/light-blue.css create mode 100644 tm-vuetify/scss/theme/light-green.css create mode 100644 tm-vuetify/scss/theme/lime.css create mode 100644 tm-vuetify/scss/theme/orange.css create mode 100644 tm-vuetify/scss/theme/pink.css create mode 100644 tm-vuetify/scss/theme/primary.css create mode 100644 tm-vuetify/scss/theme/purple.css create mode 100644 tm-vuetify/scss/theme/red.css create mode 100644 tm-vuetify/scss/theme/teal.css create mode 100644 tm-vuetify/scss/theme/yellow.css create mode 100644 tm-vuetify/tool/config/config.js create mode 100644 tm-vuetify/tool/function/calendar.js create mode 100644 tm-vuetify/tool/function/choujianggailv.js create mode 100644 tm-vuetify/tool/function/clipboardJS.js create mode 100644 tm-vuetify/tool/function/color.js create mode 100644 tm-vuetify/tool/function/crender/bezier-curve/core/bezierCurveToPolyline.js create mode 100644 tm-vuetify/tool/function/crender/bezier-curve/core/path2d.js create mode 100644 tm-vuetify/tool/function/crender/bezier-curve/core/polylineToBezierCurve.js create mode 100644 tm-vuetify/tool/function/crender/bezier-curve/index.js create mode 100644 tm-vuetify/tool/function/crender/class/crender.class.js create mode 100644 tm-vuetify/tool/function/crender/class/graph.class.js create mode 100644 tm-vuetify/tool/function/crender/class/style.class.js create mode 100644 tm-vuetify/tool/function/crender/color/config/keywords.js create mode 100644 tm-vuetify/tool/function/crender/color/index.js create mode 100644 tm-vuetify/tool/function/crender/config/graphs.js create mode 100644 tm-vuetify/tool/function/crender/crender.min.js create mode 100644 tm-vuetify/tool/function/crender/graph/path2d.js create mode 100644 tm-vuetify/tool/function/crender/graph/ring.js create mode 100644 tm-vuetify/tool/function/crender/index.js create mode 100644 tm-vuetify/tool/function/crender/plugin/canvas.js create mode 100644 tm-vuetify/tool/function/crender/plugin/util.js create mode 100644 tm-vuetify/tool/function/crender/transition/config/curves.js create mode 100644 tm-vuetify/tool/function/crender/transition/index.js create mode 100644 tm-vuetify/tool/function/dayjs/dayjs.min.js create mode 100644 tm-vuetify/tool/function/dayjs/index.js create mode 100644 tm-vuetify/tool/function/dayjs/isBetween.min.js create mode 100644 tm-vuetify/tool/function/dayjs/relativeTime.min.js create mode 100644 tm-vuetify/tool/function/dayjs/toObject.min.js create mode 100644 tm-vuetify/tool/function/dayjs/zh-cn.min.js create mode 100644 tm-vuetify/tool/function/deepClone.js create mode 100644 tm-vuetify/tool/function/deepMerge.js create mode 100644 tm-vuetify/tool/function/echarts.min.js create mode 100644 tm-vuetify/tool/function/findCnChart.js create mode 100644 tm-vuetify/tool/function/getParent.js create mode 100644 tm-vuetify/tool/function/getParentAls.js create mode 100644 tm-vuetify/tool/function/getParentAttr.js create mode 100644 tm-vuetify/tool/function/guid.js create mode 100644 tm-vuetify/tool/function/js-search.min.js create mode 100644 tm-vuetify/tool/function/lottie.js create mode 100644 tm-vuetify/tool/function/md5.js create mode 100644 tm-vuetify/tool/function/mixin.js create mode 100644 tm-vuetify/tool/function/objToString.js create mode 100644 tm-vuetify/tool/function/phaser.min.js create mode 100644 tm-vuetify/tool/function/preview.js create mode 100644 tm-vuetify/tool/function/random.js create mode 100644 tm-vuetify/tool/function/randomArray.js create mode 100644 tm-vuetify/tool/function/signBoard.js create mode 100644 tm-vuetify/tool/function/sleep.js create mode 100644 tm-vuetify/tool/function/test.js create mode 100644 tm-vuetify/tool/function/theme.js create mode 100644 tm-vuetify/tool/function/toast.js create mode 100644 tm-vuetify/tool/function/trim.js create mode 100644 tm-vuetify/tool/function/uni-echarts-canvas.js create mode 100644 tm-vuetify/tool/function/upload.js create mode 100644 tm-vuetify/tool/function/util.js create mode 100644 tm-vuetify/tool/function/vuex.js create mode 100644 tm-vuetify/tool/function/wxshare.js create mode 100644 tm-vuetify/tool/mixin/mixin.js create mode 100644 tm-vuetify/tool/request/index.js create mode 100644 tm-vuetify/tool/store/tm-vuetify.js create mode 100644 tm-vuetify/tool/util/area.js create mode 100644 tm-vuetify/tool/util/city.js create mode 100644 tm-vuetify/tool/util/emitter.js create mode 100644 tm-vuetify/tool/util/province.js create mode 100644 uni.scss create mode 100644 uni_modules/lsj-upload/changelog.md create mode 100644 uni_modules/lsj-upload/components/lsj-upload/LsjFile.js create mode 100644 uni_modules/lsj-upload/components/lsj-upload/lsj-upload.vue create mode 100644 uni_modules/lsj-upload/hybrid/html/js/vue.min.js create mode 100644 uni_modules/lsj-upload/hybrid/html/uploadFile.html create mode 100644 uni_modules/lsj-upload/package.json create mode 100644 uni_modules/lsj-upload/readme.md create mode 100644 uni_modules/uni-config-center/changelog.md create mode 100644 uni_modules/uni-config-center/package.json create mode 100644 uni_modules/uni-config-center/readme.md create mode 100644 uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center/index.js create mode 100644 uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center/package.json create mode 100644 uni_modules/uni-id-common/changelog.md create mode 100644 uni_modules/uni-id-common/package.json create mode 100644 uni_modules/uni-id-common/readme.md create mode 100644 uni_modules/uni-id-common/uniCloud/cloudfunctions/common/uni-id-common/index.js create mode 100644 uni_modules/uni-id-common/uniCloud/cloudfunctions/common/uni-id-common/package.json create mode 100644 uni_modules/uni-upgrade-center-app/changelog.md create mode 100644 uni_modules/uni-upgrade-center-app/images/app_update_close.png create mode 100644 uni_modules/uni-upgrade-center-app/images/bg_top.png create mode 100644 uni_modules/uni-upgrade-center-app/package.json create mode 100644 uni_modules/uni-upgrade-center-app/pages/upgrade-popup.vue create mode 100644 uni_modules/uni-upgrade-center-app/pages_init.json create mode 100644 uni_modules/uni-upgrade-center-app/readme.md create mode 100644 uni_modules/uni-upgrade-center-app/uniCloud/cloudfunctions/temp.png create mode 100644 uni_modules/uni-upgrade-center-app/uniCloud/database/db_init.json create mode 100644 uni_modules/uni-upgrade-center-app/utils/call-check-version.js create mode 100644 uni_modules/uni-upgrade-center-app/utils/check-update.js create mode 100644 uni_modules/z-paging/changelog.md create mode 100644 uni_modules/z-paging/components/z-paging-cell/z-paging-cell.vue create mode 100644 uni_modules/z-paging/components/z-paging-empty-view/z-paging-empty-view.vue create mode 100644 uni_modules/z-paging/components/z-paging-swiper-item/z-paging-swiper-item.vue create mode 100644 uni_modules/z-paging/components/z-paging-swiper/z-paging-swiper.vue create mode 100644 uni_modules/z-paging/components/z-paging/components/z-paging-load-more.vue create mode 100644 uni_modules/z-paging/components/z-paging/components/z-paging-refresh.vue create mode 100644 uni_modules/z-paging/components/z-paging/config/index.js create mode 100644 uni_modules/z-paging/components/z-paging/css/z-paging-main.css create mode 100644 uni_modules/z-paging/components/z-paging/css/z-paging-static.css create mode 100644 uni_modules/z-paging/components/z-paging/js/modules/back-to-top.js create mode 100644 uni_modules/z-paging/components/z-paging/js/modules/data-handle.js create mode 100644 uni_modules/z-paging/components/z-paging/js/modules/empty.js create mode 100644 uni_modules/z-paging/components/z-paging/js/modules/i18n.js create mode 100644 uni_modules/z-paging/components/z-paging/js/modules/load-more.js create mode 100644 uni_modules/z-paging/components/z-paging/js/modules/nvue.js create mode 100644 uni_modules/z-paging/components/z-paging/js/modules/refresher.js create mode 100644 uni_modules/z-paging/components/z-paging/js/modules/scroller.js create mode 100644 uni_modules/z-paging/components/z-paging/js/modules/virtual-list.js create mode 100644 uni_modules/z-paging/components/z-paging/js/z-paging-config.js create mode 100644 uni_modules/z-paging/components/z-paging/js/z-paging-constant.js create mode 100644 uni_modules/z-paging/components/z-paging/js/z-paging-enum.js create mode 100644 uni_modules/z-paging/components/z-paging/js/z-paging-i18n.js create mode 100644 uni_modules/z-paging/components/z-paging/js/z-paging-interceptor.js create mode 100644 uni_modules/z-paging/components/z-paging/js/z-paging-main.js create mode 100644 uni_modules/z-paging/components/z-paging/js/z-paging-mixin.js create mode 100644 uni_modules/z-paging/components/z-paging/js/z-paging-static.js create mode 100644 uni_modules/z-paging/components/z-paging/js/z-paging-utils.js create mode 100644 uni_modules/z-paging/components/z-paging/wxs/z-paging-renderjs.js create mode 100644 uni_modules/z-paging/components/z-paging/wxs/z-paging-wxs.wxs create mode 100644 uni_modules/z-paging/components/z-paging/z-paging.vue create mode 100644 uni_modules/z-paging/package.json create mode 100644 uni_modules/z-paging/readme.md create mode 100644 utils/app.js create mode 100644 utils/auth.js create mode 100644 utils/imageCache.js create mode 100644 utils/index.js create mode 100644 utils/network.js create mode 100644 utils/permission.js create mode 100644 utils/random.js create mode 100644 utils/storage.js create mode 100644 utils/throttle.js create mode 100644 utils/update.js create mode 100644 utils/utils.js create mode 100644 vue.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..958c4ab --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +unpackage/ +config/halo.config.js +config/ad.config.js +package-lock.json \ No newline at end of file diff --git a/.hbuilderx/launch.json b/.hbuilderx/launch.json new file mode 100644 index 0000000..ee5be77 --- /dev/null +++ b/.hbuilderx/launch.json @@ -0,0 +1,20 @@ +{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/ + // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数 + "version": "0.0", + "configurations": [{ + "app-plus" : + { + "launchtype" : "local" + }, + "default" : + { + "launchtype" : "local" + }, + "mp-weixin" : + { + "launchtype" : "local" + }, + "type" : "uniCloud" + } + ] +} diff --git a/App.vue b/App.vue new file mode 100644 index 0000000..cb0f4c6 --- /dev/null +++ b/App.vue @@ -0,0 +1,77 @@ + + + diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..dbd0f7e --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,3 @@ +# 更新日志 + +## 暂无更新记录 \ No newline at end of file diff --git a/GIT_README.md b/GIT_README.md new file mode 100644 index 0000000..34b30a2 --- /dev/null +++ b/GIT_README.md @@ -0,0 +1,19 @@ +# Git管理同步配置 + +#### 同时推送Gitee和Github +找到项目目录下的`.git`文件夹,打开`config`文件,修改相关代码: +原始代码: +```bash + [remote "origin"] + url = https://gitee.com/ialley-workshop-open/uni-halo.git + fetch = +refs/heads/*:refs/remotes/origin/* +``` +修改后的代码: +```bash +[remote "github"] + url = https://github.com/ialley-workshop-open/uni-halo.git + fetch = +refs/heads/*:refs/remotes/github/* +[remote "gitee"] + url = https://gitee.com/ialley-workshop-open/uni-halo.git + fetch = +refs/heads/*:refs/remotes/gitee/* +``` \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8564f29 --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2018 RuoYi + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e418d52 --- /dev/null +++ b/README.md @@ -0,0 +1,76 @@ +
+ + + +
uni-halo 基于Halo一款现代化的开源博客/CMS系统API开发的多端系统,值得一试。
+ 作者博客 + 文档地址 + Gitee仓库 + Github仓库 +
' + prism.highlight(text, prism.languages[lang], lang).replace(/token /g, 'hl-') + '
l.reach&&(l.reach=j);var C=y.prev;L&&(C=I(t,C,L),k+=L.length),z(t,C,x);var _=new W(o,g?M.tokenize(O,g):O,v,O);y=I(t,C,_),N&&I(t,y,N),1"+a.content+""+a.tag+">"},!u.document)return u.addEventListener&&(M.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(M.highlight(r,M.languages[t],t)),a&&u.close()},!1)),M;var e=M.util.currentScript();function t(){M.manual||M.highlightAll()}if(e&&(M.filename=e.src,e.hasAttribute("data-manual")&&(M.manual=!0)),!M.manual){var r=document.readyState;"loading"===r||"interactive"===r&&e&&e.defer?document.addEventListener("DOMContentLoaded",t):window.requestAnimationFrame?window.requestAnimationFrame(t):window.setTimeout(t,16)}return M}(_self);export default Prism;"undefined"!=typeof global&&(global.Prism=Prism); +Prism.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/,name:/[^\s<>'"]+/}},cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(a,e){var s={};s["language-"+e]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[e]},s.cdata=/^$/i;var n={"included-cdata":{pattern://i,inside:s}};n["language-"+e]={pattern:/[\s\S]+/,inside:Prism.languages[e]};var t={};t[a]={pattern:RegExp("(<__[^]*?>)(?:))*\\]\\]>|(?!)".replace(/__/g,function(){return a}),"i"),lookbehind:!0,greedy:!0,inside:n},Prism.languages.insertBefore("markup","cdata",t)}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml; +!function(e){var t=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\((?!\s*\))\s*)(?:[^()]|\((?:[^()]|\([^()]*\))*\))+?(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|(?:[^\\\\\r\n()\"']|\\\\[^])*)\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:RegExp("[^{}\\s](?:[^{};\"']|"+t.source+")*?(?=\\s*\\{)"),string:{pattern:t,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var s=e.languages.markup;s&&(s.tag.addInlined("style","css"),e.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/(^|["'\s])style\s*=\s*(?:"[^"]*"|'[^']*')/i,lookbehind:!0,inside:{"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{style:{pattern:/(["'])[\s\S]+(?=["']$)/,lookbehind:!0,alias:"language-css",inside:e.languages.css},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},"attr-name":/^style/i}}},s.tag))}(Prism); +Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,boolean:/\b(?:true|false)\b/,function:/\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}; +Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|(?:get|set)(?=\s*[\[$\w\xA0-\uFFFF])|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,function:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-flags":/[a-z]+$/,"regex-delimiter":/^\/|\/$/}},"function-variable":{pattern:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.js=Prism.languages.javascript; diff --git a/components/mp-html/components/mp-html/img-cache/index.js b/components/mp-html/components/mp-html/img-cache/index.js new file mode 100644 index 0000000..d920f03 --- /dev/null +++ b/components/mp-html/components/mp-html/img-cache/index.js @@ -0,0 +1,138 @@ +const data = { + name: 'imgcache', + prefix: 'imgcache_' +} +function ImgCache (vm) { + this.vm = vm // 保存实例在其他周期使用 + this.i = 0 // 用于标记第几张图 + vm.imgCache = { + get list () { + return uni + .getStorageInfoSync() + .keys.filter((key) => key.startsWith(data.prefix)) + .map((key) => key.split(data.prefix)[1]) + }, + get (url) { + return uni.getStorageSync(data.prefix + url) + }, + delete (url) { + const path = uni.getStorageSync(data.prefix + url) + if (!path) return false + plus.io.resolveLocalFileSystemURL(path, (entry) => { + entry.remove() + }) + uni.removeStorageSync(data.prefix + url) + return true + }, + async add (url) { + const filename = await download(url) + if (filename) { + uni.setStorageSync(data.prefix + url, filename) + return 'file://' + plus.io.convertLocalFileSystemURL(filename) + } + return null + }, + clear () { + uni + .getStorageInfoSync() + .keys.filter((key) => key.startsWith(data.prefix)) + .forEach((key) => { + uni.removeStorageSync(key) + }) + + plus.io.resolveLocalFileSystemURL(`_doc/${data.name}/`, (entry) => { + entry.removeRecursively( + (entry) => { + console.log(`${data.name}缓存删除成功`, entry) + }, + (e) => { + console.log(`${data.name}缓存删除失败`, e) + } + ) + }) + } + } +} + +// #ifdef APP-PLUS +ImgCache.prototype.onParse = function (node, parser) { + // 启用本插件 && 解析图片标签 && 拥有src属性 && 是网络图片 + if ( + this.vm.ImgCache && + node.name === 'img' && + node.attrs.src && + /^https?:\/\//.test(node.attrs.src) + ) { + const src = node.attrs.src + node.attrs.src = '' + node.attrs.i = this.vm.imgList.length + this.i++ + parser.expose() + + async function getUrl (path) { + if (await resolveFile(path)) return path + const filename = await download(src) + filename && uni.setStorageSync(data.prefix + src, filename) + return filename + } + + uni.getStorage({ + key: data.prefix + src, + success: async (res) => { + const path = await getUrl(res.data) + const url = path + ? 'file://' + plus.io.convertLocalFileSystemURL(path) + : src + node.attrs.src = url + this.vm.imgList[node.attrs.i] = path || src + }, + fail: async () => { + const path = await getUrl() + const url = path + ? 'file://' + plus.io.convertLocalFileSystemURL(path) + : src + node.attrs.src = url + this.vm.imgList[node.attrs.i] = path || src + } + }) + } +} + +const taskQueue = new Set() + +function download (url) { + return new Promise((resolve) => { + if (taskQueue.has(url)) return + taskQueue.add(url) + const suffix = /.+\.(jpg|jpeg|png|bmp|gif|webp)/.exec(url) + const name = `${makeid(8)}_${Date.now()}${suffix ? '.' + suffix[1] : ''}` + const task = plus.downloader.createDownload( + url, + { filename: `_doc/${data.name}/${name}` }, + (download, status) => { + taskQueue.delete(url) + resolve(status === 200 ? download.filename : null) + } + ) + task.start() + }) +} + +// 判断文件存在 +function resolveFile (url) { + return new Promise((resolve) => { + plus.io.resolveLocalFileSystemURL(url, resolve, () => resolve(null)) + }) +} + +// 生成uuid +function makeid (length) { + let result = '' + const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * characters.length)) + } + return result +} +// #endif + +export default ImgCache diff --git a/components/mp-html/components/mp-html/markdown/index.js b/components/mp-html/components/mp-html/markdown/index.js new file mode 100644 index 0000000..8900403 --- /dev/null +++ b/components/mp-html/components/mp-html/markdown/index.js @@ -0,0 +1,34 @@ +/** + * @fileoverview markdown 插件 + * Include marked (https://github.com/markedjs/marked) + * Include github-markdown-css (https://github.com/sindresorhus/github-markdown-css) + */ +import marked from './marked.min' +let index = 0 + +function Markdown (vm) { + this.vm = vm + vm._ids = {} +} + +Markdown.prototype.onUpdate = function (content) { + if (this.vm.markdown) { + return marked(content) + } +} + +Markdown.prototype.onParse = function (node, vm) { + if (vm.options.markdown) { + // 中文 id 需要转换,否则无法跳转 + if (vm.options.useAnchor && node.attrs && /[\u4e00-\u9fa5]/.test(node.attrs.id)) { + const id = 't' + index++ + this.vm._ids[node.attrs.id] = id + node.attrs.id = id + } + if (node.name === 'p' || node.name === 'table' || node.name === 'tr' || node.name === 'th' || node.name === 'td' || node.name === 'blockquote' || node.name === 'pre' || node.name === 'code') { + node.attrs.class = `md-${node.name} ${node.attrs.class || ''}` + } + } +} + +export default Markdown diff --git a/components/mp-html/components/mp-html/markdown/marked.min.js b/components/mp-html/components/mp-html/markdown/marked.min.js new file mode 100644 index 0000000..2efcf53 --- /dev/null +++ b/components/mp-html/components/mp-html/markdown/marked.min.js @@ -0,0 +1,6 @@ +/*! + * marked - a markdown parser + * Copyright (c) 2011-2020, Christopher Jeffrey. (MIT Licensed) + * https://github.com/markedjs/marked + */ +function t(){"use strict";function i(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function n(e){return c[e]}var e,t=(function(t){function e(){return{baseUrl:null,breaks:!1,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1}}t.exports={defaults:e(),getDefaults:e,changeDefaults:function(e){t.exports.defaults=e}}}(e={exports:{}}),e.exports),r=(t.defaults,t.getDefaults,t.changeDefaults,/[&<>"']/),l=/[&<>"']/g,a=/[<>"']|&(?!#?\w+;)/,o=/[<>"']|&(?!#?\w+;)/g,c={"&":"&","<":"<",">":">",'"':""","'":"'"};var u=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function h(e){return e.replace(u,function(e,t){return"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""})}var g=/(^|[^\[])\^/g;var f=/[^\w:]/g,d=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;var k={},b=/^[^:]+:\/*[^/]*$/,m=/^([^:]+:)[\s\S]*$/,x=/^([^:]+:\/*[^/]*)[\s\S]*$/;function w(e,t){k[" "+e]||(b.test(e)?k[" "+e]=e+"/":k[" "+e]=v(e,"/",!0));var n=-1===(e=k[" "+e]).indexOf(":");return"//"===t.substring(0,2)?n?t:e.replace(m,"$1")+t:"/"===t.charAt(0)?n?t:e.replace(x,"$1")+t:e+t}function v(e,t,n){var r=e.length;if(0===r)return"";for(var i=0;it)n.splice(t);else for(;n.length>=1,e+=e;return n+e},q=t.defaults,O=v,C=R,U=_,j=T;function E(e,t,n){var r=t.href,i=t.title?U(t.title):null,t=e[1].replace(/\\([\[\]])/g,"$1");return"!"!==e[0].charAt(0)?{type:"link",raw:n,href:r,title:i,text:t}:{type:"image",raw:n,href:r,title:i,text:U(t)}}var D=function(){function e(e){this.options=e||q}var t=e.prototype;return t.space=function(e){e=this.rules.block.newline.exec(e);if(e)return 1=n.length?e.slice(n.length):e}).join("\n")}(n,t[3]||"");return{type:"code",raw:n,lang:t[2]&&t[2].trim(),text:e}}},t.heading=function(e){e=this.rules.block.heading.exec(e);if(e)return{type:"heading",raw:e[0],depth:e[1].length,text:e[2]}},t.nptable=function(e){e=this.rules.block.nptable.exec(e);if(e){var t={type:"table",header:C(e[1].replace(/^ *| *\| *$/g,"")),align:e[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:e[3]?e[3].replace(/\n$/,"").split("\n"):[],raw:e[0]};if(t.header.length===t.align.length){for(var n=t.align.length,r=0;r ?/gm,"");return{type:"blockquote",raw:t[0],text:e}}},t.list=function(e){e=this.rules.block.list.exec(e);if(e){for(var t,n,r,i,s,l=e[0],a=e[2],o=1g[0].length||3/i.test(e[0])&&(t=!1),!n&&/^<(pre|code|kbd|script)(\s|>)/i.test(e[0])?n=!0:n&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(e[0])&&(n=!1),{type:this.options.sanitize?"text":"html",raw:e[0],inLink:t,inRawBlock:n,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(e[0]):U(e[0]):e[0]}},t.link=function(e){var t=this.rules.inline.link.exec(e);if(t){e=j(t[2],"()");-1$/,"$1"))&&e.replace(this.rules.inline._escapes,"$1"),title:r&&r.replace(this.rules.inline._escapes,"$1")},t[0])}},t.reflink=function(e,t){if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){e=(n[2]||n[1]).replace(/\s+/g," ");if((e=t[e.toLowerCase()])&&e.href)return E(n,e,n[0]);var n=n[0].charAt(0);return{type:"text",raw:n,text:n}}},t.strong=function(e,t,n){void 0===n&&(n="");var r=this.rules.inline.strong.start.exec(e);if(r&&(!r[1]||r[1]&&(""===n||this.rules.inline.punctuation.exec(n)))){t=t.slice(-1*e.length);var i,s="**"===r[0]?this.rules.inline.strong.endAst:this.rules.inline.strong.endUnd;for(s.lastIndex=0;null!=(r=s.exec(t));)if(i=this.rules.inline.strong.middle.exec(t.slice(0,r.index+3)))return{type:"strong",raw:e.slice(0,i[0].length),text:e.slice(2,i[0].length-2)}}},t.em=function(e,t,n){void 0===n&&(n="");var r=this.rules.inline.em.start.exec(e);if(r&&(!r[1]||r[1]&&(""===n||this.rules.inline.punctuation.exec(n)))){t=t.slice(-1*e.length);var i,s="*"===r[0]?this.rules.inline.em.endAst:this.rules.inline.em.endUnd;for(s.lastIndex=0;null!=(r=s.exec(t));)if(i=this.rules.inline.em.middle.exec(t.slice(0,r.index+2)))return{type:"em",raw:e.slice(0,i[0].length),text:e.slice(1,i[0].length-1)}}},t.codespan=function(e){var t=this.rules.inline.code.exec(e);if(t){var n=t[2].replace(/\n/g," "),r=/[^ ]/.test(n),e=n.startsWith(" ")&&n.endsWith(" ");return r&&e&&(n=n.substring(1,n.length-1)),n=U(n,!0),{type:"codespan",raw:t[0],text:n}}},t.br=function(e){e=this.rules.inline.br.exec(e);if(e)return{type:"br",raw:e[0]}},t.del=function(e){e=this.rules.inline.del.exec(e);if(e)return{type:"del",raw:e[0],text:e[2]}},t.autolink=function(e,t){e=this.rules.inline.autolink.exec(e);if(e){var n,t="@"===e[2]?"mailto:"+(n=U(this.options.mangle?t(e[1]):e[1])):n=U(e[1]);return{type:"link",raw:e[0],text:n,href:t,tokens:[{type:"text",raw:n,text:n}]}}},t.url=function(e,t){var n,r,i,s;if(n=this.rules.inline.url.exec(e)){if("@"===n[2])i="mailto:"+(r=U(this.options.mangle?t(n[0]):n[0]));else{for(;s=n[0],n[0]=this.rules.inline._backpedal.exec(n[0])[0],s!==n[0];);r=U(n[0]),i="www."===n[1]?"http://"+r:r}return{type:"link",raw:n[0],text:r,href:i,tokens:[{type:"text",raw:r,text:r}]}}},t.inlineText=function(e,t,n){e=this.rules.inline.text.exec(e);if(e){n=t?this.options.sanitize?this.options.sanitizer?this.options.sanitizer(e[0]):U(e[0]):e[0]:U(this.options.smartypants?n(e[0]):e[0]);return{type:"text",raw:e[0],text:n}}},e}(),R=$,T=z,$=A,z={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6}) +([^\n]*?)(?: +#+)? *(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?! {0,3}bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)|(?!script|pre|style)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,nptable:R,table:R,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html)[^\n]+)*)/,text:/^[^\n]+/,_label:/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,_title:/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/};z.def=T(z.def).replace("label",z._label).replace("title",z._title).getRegex(),z.bullet=/(?:[*+-]|\d{1,9}[.)])/,z.item=/^( *)(bull) ?[^\n]*(?:\n(?! *bull ?)[^\n]*)*/,z.item=T(z.item,"gm").replace(/bull/g,z.bullet).getRegex(),z.listItemStart=T(/^( *)(bull)/).replace("bull",z.bullet).getRegex(),z.list=T(z.list).replace(/bull/g,z.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+z.def.source+")").getRegex(),z._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",z._comment=/|$)/,z.html=T(z.html,"i").replace("comment",z._comment).replace("tag",z._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),z.paragraph=T(z._paragraph).replace("hr",z.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)").replace("tag",z._tag).getRegex(),z.blockquote=T(z.blockquote).replace("paragraph",z.paragraph).getRegex(),z.normal=$({},z),z.gfm=$({},z.normal,{nptable:"^ *([^|\\n ].*\\|.*)\\n {0,3}([-:]+ *\\|[-| :]*)(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)",table:"^ *\\|(.+)\\n {0,3}\\|?( *[-:]+[-| :]*)(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"}),z.gfm.nptable=T(z.gfm.nptable).replace("hr",z.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)").replace("tag",z._tag).getRegex(),z.gfm.table=T(z.gfm.table).replace("hr",z.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)").replace("tag",z._tag).getRegex(),z.pedantic=$({},z.normal,{html:T("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?\\1> *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",z._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,fences:R,paragraph:T(z.normal._paragraph).replace("hr",z.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",z.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()});R={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:R,tag:"^comment|^[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",strong:{start:/^(?:(\*\*(?=[*punctuation]))|\*\*)(?![\s])|__/,middle:/^\*\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*\*$|^__(?![\s])((?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?)__$/,endAst:/[^punctuation\s]\*\*(?!\*)|[punctuation]\*\*(?!\*)(?:(?=[punctuation_\s]|$))/,endUnd:/[^\s]__(?!_)(?:(?=[punctuation*\s])|$)/},em:{start:/^(?:(\*(?=[punctuation]))|\*)(?![*\s])|_/,middle:/^\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*$|^_(?![_\s])(?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?_$/,endAst:/[^punctuation\s]\*(?!\*)|[punctuation]\*(?!\*)(?:(?=[punctuation_\s]|$))/,endUnd:/[^\s]_(?!_)(?:(?=[punctuation*\s])|$)/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:R,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\?@\\[\\]`^{|}~"};R.punctuation=T(R.punctuation).replace(/punctuation/g,R._punctuation).getRegex(),R._blockSkip="\\[[^\\]]*?\\]\\([^\\)]*?\\)|`[^`]*?`|<[^>]*?>",R._overlapSkip="__[^_]*?__|\\*\\*\\[^\\*\\]*?\\*\\*",R._comment=T(z._comment).replace("(?:--\x3e|$)","--\x3e").getRegex(),R.em.start=T(R.em.start).replace(/punctuation/g,R._punctuation).getRegex(),R.em.middle=T(R.em.middle).replace(/punctuation/g,R._punctuation).replace(/overlapSkip/g,R._overlapSkip).getRegex(),R.em.endAst=T(R.em.endAst,"g").replace(/punctuation/g,R._punctuation).getRegex(),R.em.endUnd=T(R.em.endUnd,"g").replace(/punctuation/g,R._punctuation).getRegex(),R.strong.start=T(R.strong.start).replace(/punctuation/g,R._punctuation).getRegex(),R.strong.middle=T(R.strong.middle).replace(/punctuation/g,R._punctuation).replace(/overlapSkip/g,R._overlapSkip).getRegex(),R.strong.endAst=T(R.strong.endAst,"g").replace(/punctuation/g,R._punctuation).getRegex(),R.strong.endUnd=T(R.strong.endUnd,"g").replace(/punctuation/g,R._punctuation).getRegex(),R.blockSkip=T(R._blockSkip,"g").getRegex(),R.overlapSkip=T(R._overlapSkip,"g").getRegex(),R._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,R._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,R._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,R.autolink=T(R.autolink).replace("scheme",R._scheme).replace("email",R._email).getRegex(),R._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,R.tag=T(R.tag).replace("comment",R._comment).replace("attribute",R._attribute).getRegex(),R._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,R._href=/<(?:\\[<>]?|[^\s<>\\])*>|[^\s\x00-\x1f]*/,R._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,R.link=T(R.link).replace("label",R._label).replace("href",R._href).replace("title",R._title).getRegex(),R.reflink=T(R.reflink).replace("label",R._label).getRegex(),R.reflinkSearch=T(R.reflinkSearch,"g").replace("reflink",R.reflink).replace("nolink",R.nolink).getRegex(),R.normal=$({},R),R.pedantic=$({},R.normal,{strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:T(/^!?\[(label)\]\((.*?)\)/).replace("label",R._label).getRegex(),reflink:T(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",R._label).getRegex()}),R.gfm=$({},R.normal,{escape:T(R.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\'+(n?e:V(e,!0))+"\n":""+(n?e:V(e,!0))+"\n"},t.blockquote=function(e){return"\n"+e+"\n"},t.html=function(e){return e},t.heading=function(e,t,n,r){return this.options.headerIds?"'+e+"\n":""+e+"\n"},t.hr=function(){return this.options.xhtml?"\n":"\n"},t.list=function(e,t,n){var r=t?"ol":"ul";return"<"+r+(t&&1!==n?' start="'+n+'"':"")+">\n"+e+""+r+">\n"},t.listitem=function(e){return""+e+"\n"},t.checkbox=function(e){return" "},t.paragraph=function(e){return""+e+"\n"},t.table=function(e,t){return"\n\n"+e+"\n"+(t=t&&""+t+"")+"\n"},t.tablerow=function(e){return"\n"+e+"\n"},t.tablecell=function(e,t){var n=t.header?"th":"td";return(t.align?"<"+n+' align="'+t.align+'">':"<"+n+">")+e+""+n+">\n"},t.strong=function(e){return""+e+""},t.em=function(e){return""+e+""},t.codespan=function(e){return""+e+""},t.br=function(){return this.options.xhtml?"":""},t.del=function(e){return""+e+""},t.link=function(e,t,n){if(null===(e=G(this.options.sanitize,this.options.baseUrl,e)))return n;e='"+n+""},t.image=function(e,t,n){if(null===(e=G(this.options.sanitize,this.options.baseUrl,e)))return n;n='":">"},t.text=function(e){return e},e}(),J=function(){function e(){}var t=e.prototype;return t.strong=function(e){return e},t.em=function(e){return e},t.codespan=function(e){return e},t.del=function(e){return e},t.html=function(e){return e},t.text=function(e){return e},t.link=function(e,t,n){return""+n},t.image=function(e,t,n){return""+n},t.br=function(){return""},e}(),K=function(){function e(){this.seen={}}var t=e.prototype;return t.serialize=function(e){return e.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-")},t.getNextSafeSlug=function(e,t){var n=e,r=0;if(this.seen.hasOwnProperty(n))for(r=this.seen[e];n=e+"-"+ ++r,this.seen.hasOwnProperty(n););return t||(this.seen[e]=r,this.seen[n]=0),n},t.slug=function(e,t){void 0===t&&(t={});var n=this.serialize(e);return this.getNextSafeSlug(n,t.dryrun)},e}(),Q=t.defaults,Y=y,ee=function(){function n(e){this.options=e||Q,this.options.renderer=this.options.renderer||new H,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new J,this.slugger=new K}n.parse=function(e,t){return new n(t).parse(e)},n.parseInline=function(e,t){return new n(t).parseInline(e)};var e=n.prototype;return e.parse=function(e,t){void 0===t&&(t=!0);for(var n,r,i,s,l,a,o,c,u,p,h,g,f,d,k,b="",m=e.length,x=0;xAn error occurred:
'+(n?e:V(e,!0))+"
"+(n?e:V(e,!0))+"
\n"+e+"
"+e+"
"+re(e.message+"",!0)+"
&&sKHMwUJ}I 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 O1S_O#@c#e^fB)I@a@PR> literal 0 HcmV?d00001 diff --git a/static/summer.jpg b/static/summer.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c18059d6eb53ecbd18a1725eee8a6ec3c2be0a42 GIT binary patch literal 18367 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 O1S_O#@c#e^fB)I@a@PR> literal 0 HcmV?d00001 diff --git a/static/summer.jpg b/static/summer.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c18059d6eb53ecbd18a1725eee8a6ec3c2be0a42 GIT binary patch literal 18367 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
yM|Ne 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 O1S_O#@c#e^fB)I@a@PR> literal 0 HcmV?d00001 diff --git a/static/summer.jpg b/static/summer.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c18059d6eb53ecbd18a1725eee8a6ec3c2be0a42 GIT binary patch literal 18367 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