├── .eslintrc.json ├── .gitattributes ├── .github └── workflows │ └── ci.yml ├── .gitignore ├── LICENSE ├── Makefile ├── README.md ├── __init__.py ├── assets ├── css │ ├── galileo.scss │ └── includes │ │ ├── _content.scss │ │ ├── _dplayer.scss │ │ ├── _global.scss │ │ ├── _highlight.scss │ │ ├── _icon.scss │ │ ├── _index.scss │ │ ├── _normalize.scss │ │ ├── _var.scss │ │ └── _yue.scss ├── fontello-59cd00e4 │ ├── LICENSE.txt │ ├── README.txt │ ├── config.json │ ├── css │ │ ├── animation.css │ │ ├── gi-codes.css │ │ ├── gi-embedded.css │ │ ├── gi-ie7-codes.css │ │ ├── gi-ie7.css │ │ └── gi.css │ ├── demo.html │ └── font │ │ ├── gi.eot │ │ ├── gi.svg │ │ ├── gi.ttf │ │ ├── gi.woff │ │ └── gi.woff2 ├── js │ ├── dplayer.js │ ├── galileo.js │ └── katex.js └── statics │ ├── ExSearch │ ├── ExSearch-182e5a8868.css │ ├── ExSearch-493cb9cd89.js │ ├── iconfont.eot │ ├── iconfont.svg │ ├── iconfont.ttf │ ├── iconfont.woff │ ├── iconfont.woff2 │ └── jquery.min.js │ ├── auto-render.min.js │ ├── fonts │ ├── KaTeX_AMS-Regular.ttf │ ├── KaTeX_AMS-Regular.woff │ ├── KaTeX_AMS-Regular.woff2 │ ├── KaTeX_Caligraphic-Bold.ttf │ ├── KaTeX_Caligraphic-Bold.woff │ ├── KaTeX_Caligraphic-Bold.woff2 │ ├── KaTeX_Caligraphic-Regular.ttf │ ├── KaTeX_Caligraphic-Regular.woff │ ├── KaTeX_Caligraphic-Regular.woff2 │ ├── KaTeX_Fraktur-Bold.ttf │ ├── KaTeX_Fraktur-Bold.woff │ ├── KaTeX_Fraktur-Bold.woff2 │ ├── KaTeX_Fraktur-Regular.ttf │ ├── KaTeX_Fraktur-Regular.woff │ ├── KaTeX_Fraktur-Regular.woff2 │ ├── KaTeX_Main-Bold.ttf │ ├── KaTeX_Main-Bold.woff │ ├── KaTeX_Main-Bold.woff2 │ ├── KaTeX_Main-BoldItalic.ttf │ ├── KaTeX_Main-BoldItalic.woff │ ├── KaTeX_Main-BoldItalic.woff2 │ ├── KaTeX_Main-Italic.ttf │ ├── KaTeX_Main-Italic.woff │ ├── KaTeX_Main-Italic.woff2 │ ├── KaTeX_Main-Regular.ttf │ ├── KaTeX_Main-Regular.woff │ ├── KaTeX_Main-Regular.woff2 │ ├── KaTeX_Math-BoldItalic.ttf │ ├── KaTeX_Math-BoldItalic.woff │ ├── KaTeX_Math-BoldItalic.woff2 │ ├── KaTeX_Math-Italic.ttf │ ├── KaTeX_Math-Italic.woff │ ├── KaTeX_Math-Italic.woff2 │ ├── KaTeX_SansSerif-Bold.ttf │ ├── KaTeX_SansSerif-Bold.woff │ ├── KaTeX_SansSerif-Bold.woff2 │ ├── KaTeX_SansSerif-Italic.ttf │ ├── KaTeX_SansSerif-Italic.woff │ ├── KaTeX_SansSerif-Italic.woff2 │ ├── KaTeX_SansSerif-Regular.ttf │ ├── KaTeX_SansSerif-Regular.woff │ ├── KaTeX_SansSerif-Regular.woff2 │ ├── KaTeX_Script-Regular.ttf │ ├── KaTeX_Script-Regular.woff │ ├── KaTeX_Script-Regular.woff2 │ ├── KaTeX_Size1-Regular.ttf │ ├── KaTeX_Size1-Regular.woff │ ├── KaTeX_Size1-Regular.woff2 │ ├── KaTeX_Size2-Regular.ttf │ ├── KaTeX_Size2-Regular.woff │ ├── KaTeX_Size2-Regular.woff2 │ ├── KaTeX_Size3-Regular.ttf │ ├── KaTeX_Size3-Regular.woff │ ├── KaTeX_Size3-Regular.woff2 │ ├── KaTeX_Size4-Regular.ttf │ ├── KaTeX_Size4-Regular.woff │ ├── KaTeX_Size4-Regular.woff2 │ ├── KaTeX_Typewriter-Regular.ttf │ ├── KaTeX_Typewriter-Regular.woff │ └── KaTeX_Typewriter-Regular.woff2 │ ├── katex.min.css │ └── katex.min.js ├── gulpfile.js ├── locale └── zh-CN.json ├── package-lock.json ├── package.json ├── templates ├── archives.html ├── categories.html ├── includes │ ├── skeleton.html │ ├── skeleton_archive.html │ └── skeleton_content.html ├── index.html ├── page.html ├── post.html ├── sitemap.xml └── tags.html └── utils.py /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true 4 | }, 5 | "extends": "eslint:recommended", 6 | "parserOptions": { 7 | "ecmaVersion": 5 8 | }, 9 | "rules": { 10 | "indent": [ 11 | "error", 12 | 4 13 | ], 14 | "linebreak-style": [ 15 | "error", 16 | "windows" 17 | ], 18 | "quotes": [ 19 | "error", 20 | "single" 21 | ], 22 | "semi": [ 23 | "error", 24 | "always" 25 | ] 26 | } 27 | } -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.html linguist-language=Python -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | 8 | jobs: 9 | build: 10 | 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - uses: actions/checkout@v2 15 | 16 | - name: Set up Node 10 17 | uses: actions/setup-node@v1 18 | with: 19 | node-version: '10.x' 20 | 21 | - name: Build 22 | run: | 23 | make 24 | 25 | - name: Deploy Build 26 | uses: docker://peaceiris/gh-pages:v2 27 | env: 28 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 29 | PUBLISH_BRANCH: latest 30 | PUBLISH_DIR: ./Galileo 31 | with: 32 | emptyCommits: false 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | temp/ 2 | Galileo/ 3 | config.py 4 | dev.bat 5 | .vscode/ 6 | 7 | # Byte-compiled / optimized / DLL files 8 | __pycache__/ 9 | *.py[cod] 10 | *$py.class 11 | 12 | # C extensions 13 | *.so 14 | 15 | # Distribution / packaging 16 | .Python 17 | build/ 18 | develop-eggs/ 19 | dist/ 20 | downloads/ 21 | eggs/ 22 | .eggs/ 23 | lib/ 24 | lib64/ 25 | parts/ 26 | sdist/ 27 | var/ 28 | wheels/ 29 | pip-wheel-metadata/ 30 | share/python-wheels/ 31 | *.egg-info/ 32 | .installed.cfg 33 | *.egg 34 | MANIFEST 35 | 36 | # PyInstaller 37 | # Usually these files are written by a python script from a template 38 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 39 | *.manifest 40 | *.spec 41 | 42 | # Installer logs 43 | pip-log.txt 44 | pip-delete-this-directory.txt 45 | 46 | # Unit test / coverage reports 47 | htmlcov/ 48 | .tox/ 49 | .nox/ 50 | .coverage 51 | .coverage.* 52 | .cache 53 | nosetests.xml 54 | coverage.xml 55 | *.cover 56 | *.py,cover 57 | .hypothesis/ 58 | .pytest_cache/ 59 | 60 | # Translations 61 | *.mo 62 | *.pot 63 | 64 | # Django stuff: 65 | *.log 66 | local_settings.py 67 | db.sqlite3 68 | db.sqlite3-journal 69 | 70 | # Flask stuff: 71 | instance/ 72 | .webassets-cache 73 | 74 | # Scrapy stuff: 75 | .scrapy 76 | 77 | # Sphinx documentation 78 | docs/_build/ 79 | 80 | # PyBuilder 81 | target/ 82 | 83 | # Jupyter Notebook 84 | .ipynb_checkpoints 85 | 86 | # IPython 87 | profile_default/ 88 | ipython_config.py 89 | 90 | # pyenv 91 | .python-version 92 | 93 | # pipenv 94 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 95 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 96 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 97 | # install all needed dependencies. 98 | #Pipfile.lock 99 | 100 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 101 | __pypackages__/ 102 | 103 | # Celery stuff 104 | celerybeat-schedule 105 | celerybeat.pid 106 | 107 | # SageMath parsed files 108 | *.sage.py 109 | 110 | # Environments 111 | .env 112 | .venv 113 | env/ 114 | venv/ 115 | ENV/ 116 | env.bak/ 117 | venv.bak/ 118 | 119 | # Spyder project settings 120 | .spyderproject 121 | .spyproject 122 | 123 | # Rope project settings 124 | .ropeproject 125 | 126 | # mkdocs documentation 127 | /site 128 | 129 | # mypy 130 | .mypy_cache/ 131 | .dmypy.json 132 | dmypy.json 133 | 134 | # Pyre type checker 135 | .pyre/ 136 | 137 | # Logs 138 | logs 139 | *.log 140 | npm-debug.log* 141 | yarn-debug.log* 142 | yarn-error.log* 143 | lerna-debug.log* 144 | 145 | # Diagnostic reports (https://nodejs.org/api/report.html) 146 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 147 | 148 | # Runtime data 149 | pids 150 | *.pid 151 | *.seed 152 | *.pid.lock 153 | 154 | # Directory for instrumented libs generated by jscoverage/JSCover 155 | lib-cov 156 | 157 | # Coverage directory used by tools like istanbul 158 | coverage 159 | *.lcov 160 | 161 | # nyc test coverage 162 | .nyc_output 163 | 164 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 165 | .grunt 166 | 167 | # Bower dependency directory (https://bower.io/) 168 | bower_components 169 | 170 | # node-waf configuration 171 | .lock-wscript 172 | 173 | # Compiled binary addons (https://nodejs.org/api/addons.html) 174 | build/Release 175 | 176 | # Dependency directories 177 | node_modules/ 178 | jspm_packages/ 179 | 180 | # TypeScript v1 declaration files 181 | typings/ 182 | 183 | # TypeScript cache 184 | *.tsbuildinfo 185 | 186 | # Optional npm cache directory 187 | .npm 188 | 189 | # Optional eslint cache 190 | .eslintcache 191 | 192 | # Microbundle cache 193 | .rpt2_cache/ 194 | .rts2_cache_cjs/ 195 | .rts2_cache_es/ 196 | .rts2_cache_umd/ 197 | 198 | # Optional REPL history 199 | .node_repl_history 200 | 201 | # Output of 'npm pack' 202 | *.tgz 203 | 204 | # Yarn Integrity file 205 | .yarn-integrity 206 | 207 | # dotenv environment variables file 208 | .env 209 | .env.test 210 | 211 | # parcel-bundler cache (https://parceljs.org/) 212 | .cache 213 | 214 | # Next.js build output 215 | .next 216 | 217 | # Nuxt.js build / generate output 218 | .nuxt 219 | dist 220 | 221 | # Gatsby files 222 | .cache/ 223 | # Comment in the public line in if your project uses Gatsby and not Next.js 224 | # https://nextjs.org/blog/next-9-1#public-directory-support 225 | # public 226 | 227 | # vuepress build output 228 | .vuepress/dist 229 | 230 | # Serverless directories 231 | .serverless/ 232 | 233 | # FuseBox cache 234 | .fusebox/ 235 | 236 | # DynamoDB Local files 237 | .dynamodb/ 238 | 239 | # TernJS port file 240 | .tern-port 241 | 242 | # Stores VSCode versions used for testing VSCode extensions 243 | .vscode-test -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 AlanDecode 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. -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: build 2 | default: build 3 | 4 | node_modules: package.json 5 | npm install 6 | 7 | clean: node_modules 8 | gulp clean 9 | 10 | build: node_modules 11 | gulp 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Galileo 2 | 3 | A theme for [Maverick](https://github.com/AlanDecode/Maverick), designed for personal blog. 4 | 5 | [![Actions Status](https://github.com/AlanDecode/Maverick-Theme-Galileo/workflows/Build/badge.svg)](https://github.com/AlanDecode/Maverick-Theme-Galileo/actions) 6 | 7 | **Usage** 8 | 9 | Set `template` in Maverick configuration file as bellow: 10 | 11 | ```python 12 | template = { 13 | "name": "Galileo", 14 | "type": "git", 15 | "url": "https://github.com/AlanDecode/Maverick-Theme-Galileo.git", 16 | "branch": "latest" 17 | } 18 | ``` 19 | 20 | or just set: 21 | 22 | ```python 23 | template = "Galileo" 24 | ``` 25 | 26 | MIT © [AlanDecode](https://github.com/AlanDecode) 27 | -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """Galileo 3 | 4 | Default theme for Maverick 5 | """ 6 | 7 | from Maverick.Template import Template, Pager 8 | from Maverick.Content import ContentList, group_by_category, group_by_tagname 9 | from Maverick.Utils import logged_func, gen_hash, unify_joinpath, copytree 10 | from Maverick.Utils import safe_write, safe_read 11 | from .utils import tr, build_navs, build_links, filterPrefix 12 | 13 | import os 14 | import re 15 | import json 16 | import math 17 | 18 | 19 | def render(conf, posts, pages): 20 | """Override this 21 | """ 22 | Galileo(conf, posts, pages)() 23 | 24 | 25 | class Galileo(Template): 26 | def render(self): 27 | self._env.globals['tr'] = tr 28 | self._env.globals['len'] = len 29 | self._env.globals['build_navs'] = build_navs 30 | self._env.globals['build_links'] = build_links 31 | self._env.globals['get_path'] = filterPrefix 32 | 33 | try: 34 | from Maverick.Markdown import g_hooks 35 | g_hooks.add_hook('output_image', self.output_image) 36 | except BaseException: 37 | pass 38 | 39 | self.build_search_cache() 40 | self.gather_meta() 41 | self.build_posts() 42 | self.build_pages() 43 | 44 | # filter out hidden posts before building post list 45 | self._posts = ContentList( 46 | [item for item in self._posts if not item.skip]) 47 | self._pages = ContentList( 48 | [item for item in self._pages if not item.skip]) 49 | 50 | self.build_index() 51 | self.build_archives() 52 | self.build_categories() 53 | self.build_tags() 54 | 55 | # copy static files to build_dir 56 | def copy_assets(src, dist): 57 | source_dir = unify_joinpath(os.path.dirname(__file__), src) 58 | dist_dir = unify_joinpath(self._config.build_dir, dist) 59 | 60 | if not os.path.exists(source_dir): 61 | return 62 | 63 | if not os.path.exists(dist_dir): 64 | os.mkdir(dist_dir) 65 | copytree(source_dir, dist_dir) 66 | copy_assets('assets', 'assets') 67 | 68 | def output_image(self, image): 69 | figcaption = image['title'] or image['alt'] or '' 70 | 71 | src = image['src'] 72 | 73 | style = '' 74 | attr = '' 75 | if image['width'] != -1 and image['height'] != -1: 76 | style = 'style="flex: %s"' % str(image['width'] * 50 / image['height']) 77 | else: 78 | attr = 'size-undefined' 79 | 80 | if figcaption != "": 81 | figcaption = '
%s
' % figcaption 82 | 83 | return '
%s
' \ 84 | % (style, attr, image['width'], image['height'], src, figcaption) 85 | 86 | def gather_meta(self): 87 | self._tags = set() 88 | self._categories = set() 89 | for content in self._posts: 90 | meta = content.meta 91 | self._tags = set(meta["tags"]) | self._tags 92 | self._categories = set(meta["categories"]) | self._categories 93 | 94 | @logged_func('') 95 | def build_index(self): 96 | pager = Pager(self._posts, self._config.index_page_size) 97 | total_pages = pager.get_total_pages() 98 | 99 | for current_page, current_list in pager: 100 | _, local_path = self._router.gen("index", "", current_page) 101 | local_path += "index.html" 102 | 103 | template = self._env.get_template("index.html") 104 | output = template.render( 105 | content_list=current_list, 106 | current_page=current_page, 107 | max_pages=total_pages) 108 | safe_write(local_path, output) 109 | 110 | @logged_func('') 111 | def build_archives(self): 112 | pager = Pager(self._posts, self._config.archives_page_size) 113 | total_pages = pager.get_total_pages() 114 | 115 | for current_page, current_list in pager: 116 | _, local_path = self._router.gen("archives", "", current_page) 117 | local_path += "index.html" 118 | 119 | template = self._env.get_template("archives.html") 120 | output = template.render( 121 | content_list=current_list, 122 | current_page=current_page, 123 | max_pages=total_pages) 124 | safe_write(local_path, output) 125 | 126 | @logged_func('') 127 | def build_tags(self): 128 | for tag in self._tags: 129 | posts = self._posts.re_group(group_by_tagname(tag)) 130 | 131 | pager = Pager(posts, self._config.archives_page_size) 132 | total_pages = pager.get_total_pages() 133 | 134 | for current_page, current_list in pager: 135 | _, local_path = self._router.gen("tag", tag, current_page) 136 | local_path += "index.html" 137 | 138 | template = self._env.get_template("tags.html") 139 | output = template.render( 140 | tag_name=tag, 141 | content_list=current_list, 142 | current_page=current_page, 143 | max_pages=total_pages) 144 | safe_write(local_path, output) 145 | 146 | @logged_func('') 147 | def build_categories(self): 148 | for category in self._categories: 149 | posts = self._posts.re_group(group_by_category(category)) 150 | 151 | pager = Pager(posts, self._config.archives_page_size) 152 | total_pages = pager.get_total_pages() 153 | 154 | for current_page, current_list in pager: 155 | _, local_path = self._router.gen("category", category, current_page) 156 | local_path += "index.html" 157 | 158 | template = self._env.get_template("categories.html") 159 | output = template.render( 160 | cate_name=category, 161 | content_list=current_list, 162 | current_page=current_page, 163 | max_pages=total_pages) 164 | safe_write(local_path, output) 165 | 166 | @logged_func() 167 | def build_posts(self): 168 | total_posts = len(self._posts) 169 | for index in range(total_posts): 170 | content = self._posts[index] 171 | 172 | # find visible prev and next 173 | index_next = index 174 | content_next = None 175 | while content_next is None and index_next > 0: 176 | index_next -= 1 177 | if not self._posts[index_next].skip: 178 | content_next = self._posts[index_next] 179 | 180 | index_prev = index 181 | content_prev = None 182 | while content_prev is None and index_prev < total_posts-1: 183 | index_prev += 1 184 | if not self._posts[index_prev].skip: 185 | content_prev = self._posts[index_prev] 186 | 187 | meta = content.meta 188 | _, local_path = self._router.gen_by_meta(meta) 189 | local_path += "index.html" 190 | 191 | template = self._env.get_template("post.html") 192 | output = template.render( 193 | content=content, 194 | content_prev=content_prev, 195 | content_next=content_next 196 | ) 197 | safe_write(local_path, output) 198 | print('Finished: ' + content.get_meta('title')) 199 | 200 | @logged_func() 201 | def build_pages(self): 202 | total_pages = len(self._pages) 203 | for index in range(total_pages): 204 | content = self._pages[index] 205 | content_next = self._pages[index-1] if index > 0 else None 206 | content_prev = self._posts[index + 207 | 1] if index < total_pages-1 else None 208 | 209 | _, local_path = self._router.gen_by_content(content) 210 | local_path += "index.html" 211 | 212 | template = self._env.get_template("page.html") 213 | output = template.render( 214 | content=content, 215 | content_prev=content_prev, 216 | content_next=content_next 217 | ) 218 | safe_write(local_path, output) 219 | print('Finished: ' + content.get_meta('title')) 220 | 221 | @logged_func() 222 | def build_search_cache(self): 223 | """build search cache json 224 | """ 225 | def render_search_cache(post_list, page_list): 226 | router = self._router 227 | 228 | def strip(text): 229 | r = re.compile(r'<[^>]+>', re.S) 230 | return r.sub('', text) 231 | 232 | def gen_entry(content): 233 | entry = { 234 | "title": content.get_meta('title'), 235 | "date": str(content.get_meta('date')), 236 | "path": router.gen_permalink_by_content(content), 237 | "text": strip(content.parsed), 238 | "categories": [], 239 | "tags": [] 240 | } 241 | if (content.get_meta('layout') == 'post'): 242 | for cate in content.get_meta('categories'): 243 | entry['categories'].append({ 244 | "name": cate, 245 | "slug": cate, 246 | "permalink": router.gen_permalink('category', cate, 1) 247 | }) 248 | for tag in content.get_meta('tags'): 249 | entry['tags'].append({ 250 | "name": tag, 251 | "slug": tag, 252 | "permalink": router.gen_permalink('tag', tag, 1) 253 | }) 254 | return entry 255 | 256 | posts = [gen_entry(post) for post in post_list if not post.skip] 257 | pages = [gen_entry(page) for page in page_list if not page.skip] 258 | 259 | cache = json.dumps({ 260 | "posts": posts, 261 | "pages": pages 262 | }) 263 | 264 | return cache 265 | 266 | cache_str = render_search_cache(self._posts, self._pages) 267 | search_cache_hash = gen_hash(cache_str) 268 | safe_write(unify_joinpath( 269 | self._config.build_dir, search_cache_hash + '.json'), cache_str) 270 | 271 | self._env.globals['search_cache_hash'] = search_cache_hash 272 | -------------------------------------------------------------------------------- /assets/css/galileo.scss: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | 3 | /** 4 | * author: 熊猫小A 5 | */ 6 | 7 | @import "includes/normalize"; 8 | @import "includes/var"; 9 | 10 | * { 11 | box-sizing: border-box; 12 | } 13 | 14 | html { 15 | font-size: 16px; 16 | background: #fff; 17 | } 18 | 19 | body { 20 | color: $black; 21 | font-family: $ga-font-sans; 22 | .container { 23 | width: 100%; 24 | max-width: $mainWidth; 25 | margin-left: auto; 26 | margin-right: auto; 27 | padding-left: $mainPadding; 28 | padding-right: $mainPadding; 29 | .wrapper { 30 | flex: 1; 31 | } 32 | } 33 | 34 | // @media screen and (min-width: $breakMiddle) { 35 | // .container { 36 | // max-width: 845px; 37 | // display: flex; 38 | // flex-direction: row; 39 | // .wrapper { 40 | // margin-top: 4rem; 41 | // max-width: 623px; 42 | // min-width: 623px; 43 | // } 44 | // } 45 | // } 46 | } 47 | 48 | .ga-mono { 49 | font-family: $ga-font-mono; 50 | } 51 | 52 | @mixin a-highlight { 53 | text-decoration: none; 54 | position: relative; 55 | 56 | &:hover { 57 | background: $yellow; 58 | } 59 | } 60 | 61 | a[no-style] { 62 | color: inherit!important; 63 | text-decoration: none!important; 64 | border: none!important; 65 | &:hover { 66 | background: none!important; 67 | } 68 | } 69 | 70 | .brand { 71 | white-space: nowrap!important; 72 | text-overflow: ellipsis!important; 73 | overflow: hidden!important; 74 | } 75 | 76 | @import "includes/yue"; 77 | @import "includes/highlight"; 78 | @import "includes/global"; 79 | @import "includes/index"; 80 | @import "includes/content"; 81 | @import "includes/icon"; 82 | @import "includes/dplayer"; 83 | .dplayer { 84 | margin-bottom: 1.24em; 85 | } -------------------------------------------------------------------------------- /assets/css/includes/_content.scss: -------------------------------------------------------------------------------- 1 | .ga-content { 2 | main > & { 3 | padding-top: 2rem; 4 | } 5 | h1.ga-post_title { 6 | margin-bottom: 0; 7 | } 8 | span.ga-post_meta { 9 | font-size: 0.9rem; 10 | color: $faded-black-light; 11 | display: block; 12 | margin-bottom: 1.5rem; 13 | white-space: nowrap; 14 | overflow-x: auto; 15 | span::after { 16 | content: " / "; 17 | } 18 | span:last-of-type::after { 19 | display: none; 20 | } 21 | a.category { 22 | color: $faded-black-light; 23 | &::before { 24 | display: none; 25 | } 26 | } 27 | } 28 | div#ga-tags { 29 | margin-top: 1.24rem; 30 | font-size: 0.95rem; 31 | span a { 32 | color: $faded-black-light; 33 | } 34 | span { 35 | display: inline-block; 36 | margin-right: 0.5rem; 37 | color: $faded-black-light; 38 | } 39 | } 40 | 41 | div.links { 42 | display: flex; 43 | flex-flow: row wrap; 44 | justify-content: flex-start; 45 | padding-top: 1em; 46 | margin-left: -15px; 47 | width: calc(100% + 15px); 48 | margin-bottom: 1.5em; 49 | .board-item { 50 | position: relative; 51 | background: white; 52 | box-shadow: 0 0 20px 2px rgba(0, 0, 0, 0.1); 53 | transition: all 0.3s; 54 | overflow: hidden; 55 | display: flex; 56 | flex-flow: column nowrap; 57 | justify-content: flex-start; 58 | border: none !important; 59 | &.hover { 60 | transform: scale(0.95); 61 | } 62 | &::before { 63 | display: none; 64 | } 65 | @media screen and (min-width: 768px) { 66 | &:hover { 67 | transform: scale(0.97); 68 | border: none !important; 69 | } 70 | } 71 | .board-thumb { 72 | position: relative; 73 | width: 100%; 74 | padding-top: 100%; 75 | img { 76 | position: absolute; 77 | top: 0; 78 | left: 0; 79 | width: 100%; 80 | height: 100%; 81 | object-fit: cover; 82 | .lazyload-img & { 83 | opacity: 0; 84 | } 85 | margin: 0; 86 | padding: 0; 87 | transition: 0.2s ease-in-out opacity; 88 | } 89 | } 90 | .board-title { 91 | padding: 8px 0 !important; 92 | font-size: 1.2em !important; 93 | overflow: hidden !important; 94 | white-space: nowrap !important; 95 | text-align: center !important; 96 | color: $black !important; 97 | font-weight: 700 !important; 98 | border: none; 99 | &:hover { 100 | border: none; 101 | } 102 | } 103 | margin-left: 15px; 104 | margin-bottom: 15px; 105 | @media screen and (max-width: 767px) { 106 | /* 3个 */ 107 | width: calc(33.33333333% - 15px) 108 | } 109 | @media screen and (min-width: 768px) { 110 | /* 4个 */ 111 | width: calc(25% - 15px) 112 | } 113 | @media screen and (max-width: 450px) { 114 | /* 2个 */ 115 | width: calc(50% - 15px) 116 | } 117 | } 118 | } 119 | 120 | .ga-content_body > figure { 121 | @media screen and (max-width: $breakSmall) { 122 | width: calc(100% + #{2*$mainPadding}); 123 | margin-left: -$mainPadding; 124 | } 125 | } 126 | 127 | div.photos { 128 | figure { 129 | margin: 2.5px; 130 | flex: 1; 131 | @media screen and (max-width: 767px) { 132 | figcaption { 133 | display: none; 134 | } 135 | } 136 | &:first-child { 137 | margin-left: 0; 138 | } 139 | &:last-child { 140 | margin-right: 0; 141 | } 142 | img { 143 | margin: 0; 144 | } 145 | figcaption { 146 | position: absolute; 147 | left: 0; 148 | right: 0; 149 | bottom: 0; 150 | width: auto; 151 | margin: 0; 152 | padding: 60px 0 10px; 153 | color: #fff; 154 | background-image: linear-gradient( 155 | 180deg, 156 | hsla(0, 0%, 100%, 0) 0, 157 | rgba(0, 0, 0, 0.03) 26%, 158 | rgba(0, 0, 0, 0.4) 71%, 159 | rgba(0, 0, 0, 0.5) 160 | ); 161 | opacity: 0.6; 162 | transition: opacity 0.3s $animationTimingFunc; 163 | } 164 | &:hover figcaption { 165 | opacity: 1; 166 | } 167 | } 168 | display: flex; 169 | flex-wrap: wrap; 170 | @media screen and (max-width: $breakSmall) { 171 | width: calc(100% + #{2*$mainPadding}); 172 | margin-left: -$mainPadding; 173 | } 174 | & + *:not(.photos) { 175 | margin-top: 1.24rem; 176 | } 177 | } 178 | 179 | div.photoset + *:not(.photoset) { 180 | margin-top: 1.24rem; 181 | } 182 | } 183 | 184 | #ga-content_pager { 185 | margin-bottom: 5rem; 186 | display: flex; 187 | flex-direction: row; 188 | justify-content: space-between; 189 | > div { 190 | padding-top: 2.5rem; 191 | width: calc(50% - 1rem); 192 | display: flex; 193 | flex-direction: column; 194 | justify-content: flex-start; 195 | align-items: center; 196 | text-align: center; 197 | position: relative; 198 | h3 { 199 | margin: 0; 200 | } 201 | a { 202 | display: block; 203 | color: $black; 204 | font-weight: bold; 205 | font-size: 1.2rem; 206 | } 207 | p { 208 | margin: 0; 209 | margin-top: 0.8rem; 210 | font-size: 1rem; 211 | color: rgba(0, 0, 0, 0.42); 212 | line-height: 1.4; 213 | } 214 | &::before { 215 | position: absolute; 216 | left: 50%; 217 | transform: translateX(-50%); 218 | top: 0.4rem; 219 | font-size: 14px; 220 | padding: 0.2em 0.5em; 221 | color: rgba(0, 0, 0, 0.2); 222 | border: 1px solid rgba(0, 0, 0, 0.1); 223 | border-radius: 4px; 224 | } 225 | &.next { 226 | &::before { 227 | content: "Next"; 228 | } 229 | &::after { 230 | content: ""; 231 | width: 1px; 232 | height: calc(100% - 1rem); 233 | background: #ddd; 234 | position: absolute; 235 | right: -1rem; 236 | top: 0.5rem; 237 | } 238 | } 239 | &.prev { 240 | &::before { 241 | content: "Prev"; 242 | } 243 | } 244 | } 245 | @media screen and (max-width: 767.5px) { 246 | flex-direction: column; 247 | > div { 248 | width: 100%; 249 | text-align: left; 250 | align-items: flex-start; 251 | &::before { 252 | left: 0; 253 | transform: translateX(0); 254 | } 255 | &::after { 256 | display: none; 257 | } 258 | &:first-child { 259 | padding-bottom: 0.8rem; 260 | margin-bottom: 0.8rem; 261 | border-bottom: 1px solid #ddd; 262 | } 263 | } 264 | } 265 | } 266 | 267 | @media screen and (max-width: $breakSmall) { 268 | .ga-section { 269 | margin-bottom: 3rem; 270 | } 271 | } -------------------------------------------------------------------------------- /assets/css/includes/_global.scss: -------------------------------------------------------------------------------- 1 | /* 2 | Global elements 3 | */ 4 | 5 | #ga-header { 6 | margin: 3rem 0 6rem; 7 | position: relative; 8 | text-align: center; 9 | &::before { 10 | content: ""; 11 | width: 100%; 12 | position: absolute; 13 | height: 2px; 14 | background: rgba(0,0,0,.05); 15 | left: 0; 16 | bottom: -3rem; 17 | } 18 | @media screen and (max-width: $mainWidth) { 19 | &::before { 20 | width: calc(100% + 40px); 21 | left: -20px; 22 | } 23 | } 24 | div[first] { 25 | // aside#ga-logo { 26 | // a { 27 | // position: relative; 28 | // display: block; 29 | // width: 60px; 30 | // height: 60px; 31 | // margin-right: 1rem; 32 | // img { 33 | // position: absolute; 34 | // width: 100%; 35 | // height: 100%; 36 | // object-fit: cover; 37 | // } 38 | // } 39 | // } 40 | aside#ga-brand { 41 | flex: 1; 42 | h1 { 43 | font-size: 1.95rem; 44 | margin-top: 0; 45 | margin-bottom: 0.5rem; 46 | a { 47 | color: $black; 48 | text-decoration: none; 49 | display: block; 50 | } 51 | } 52 | p { 53 | margin: 0; 54 | line-height: 1.35; 55 | color: $faded-black-light; 56 | font-weight: 300; 57 | } 58 | 59 | } 60 | } 61 | div[second] { 62 | nav { 63 | font-size: 1.1rem; 64 | // &.social-links { 65 | // font-size: 0.9rem; 66 | // display: none; 67 | // } 68 | .separator { 69 | display: inline-block; 70 | margin: 0 8px; 71 | } 72 | ul { 73 | margin: 0; 74 | margin-top: 1.5rem; 75 | list-style: none; 76 | padding: 0; 77 | white-space: nowrap; 78 | overflow-x: auto; 79 | overflow-y: hidden; 80 | li { 81 | display: inline; 82 | } 83 | } 84 | a { 85 | color: $faded-black; 86 | text-decoration: none; 87 | border: none 88 | } 89 | } 90 | } 91 | } 92 | 93 | // @media screen and (min-width: $breakMiddle) { 94 | // #ga-header { 95 | // &::before { 96 | // display: none; 97 | // } 98 | // position: sticky; 99 | // top: 4rem; 100 | // height: max-content; 101 | // max-width: 137px; 102 | // width: 137px; 103 | // margin-left: 45px; 104 | // padding-left: 35px; 105 | // border-left: 2px dotted rgba(0,0,0,.05); 106 | // div[first] { 107 | // flex-direction: column; 108 | // align-items: flex-start; 109 | // } 110 | // div[first] aside#ga-logo { 111 | // display: none; 112 | // } 113 | // div[first] aside#ga-brand { 114 | // display: flex; 115 | // flex-direction: row; 116 | // width: 100%; 117 | // justify-content: flex-start; 118 | // } 119 | // div[first] aside#ga-brand h1 { 120 | // margin-bottom: 0; 121 | // writing-mode: vertical-lr; 122 | // font-size: 2.5rem; 123 | // line-height: 1; 124 | // } 125 | // div[first] aside#ga-brand p { 126 | // writing-mode: vertical-lr; 127 | // white-space: nowrap; 128 | // height: max-content; 129 | // padding-left: 10px; 130 | // margin-left: 10px; 131 | // border-left: 1px solid rgba(0,0,0,.05); 132 | // font-size: 1.2rem; 133 | // letter-spacing: 0.1em; 134 | // } 135 | // div[second] nav { 136 | // .separator { 137 | // display: none; 138 | // } 139 | // &.social-links { 140 | // border-top: 2px solid rgba(0,0,0,0.1); 141 | // display: block; 142 | // } 143 | // ul { 144 | // display: block; 145 | // } 146 | // ul li { 147 | // display: block; 148 | // margin-bottom: 1rem; 149 | // } 150 | // &.navs { 151 | // ul { 152 | // padding-left: 1.5rem; 153 | // list-style: square; 154 | // li { 155 | // display: list-item; 156 | // } 157 | // } 158 | // } 159 | // } 160 | // } 161 | // } 162 | 163 | #ga-footer { 164 | font-size: 0.95rem; 165 | line-height: $contentLineHeight; 166 | color: $faded-black; 167 | section:first-child { 168 | display: flex; 169 | flex-direction: row; 170 | justify-content: space-between; 171 | border: 1px solid $faded-black-light; 172 | border-left: none; 173 | border-right: none; 174 | margin-bottom: .5rem; 175 | font-size: 0.8rem; 176 | padding: 0.2rem 0; 177 | } 178 | section:nth-child(2) { 179 | p { 180 | margin: 0.05rem 0; 181 | } 182 | margin-bottom: 2rem; 183 | } 184 | .copyright { 185 | display: flex; 186 | justify-content: space-between; 187 | @media screen and (max-width: $breakSmall) { 188 | flex-direction: column; 189 | } 190 | } 191 | .social-links { 192 | ul { 193 | list-style: none; 194 | padding: 0; 195 | margin: 0; 196 | display: inline; 197 | .separator { 198 | display: inline-block; 199 | margin: 0 8px; 200 | } 201 | } 202 | li { 203 | display: inline; 204 | a { 205 | color: $black; 206 | text-decoration: none; 207 | } 208 | } 209 | } 210 | } 211 | 212 | :not(.dplayer) a.ga-highlight { 213 | @include a-highlight() 214 | } 215 | 216 | .bili-player { 217 | width: 100%; 218 | border: 2px solid rgba(0,0,0,.1); 219 | } 220 | 221 | #bg { 222 | position: fixed; 223 | left: 0; 224 | top: 0; 225 | right: 0; 226 | bottom: 0; 227 | background-repeat: no-repeat; 228 | background-size: cover; 229 | background-position: center; 230 | opacity: .04; 231 | z-index: -1; 232 | } -------------------------------------------------------------------------------- /assets/css/includes/_highlight.scss: -------------------------------------------------------------------------------- 1 | .highlight .hll { background-color: #ffffcc } 2 | .highlight .c { color: #8f5902; font-style: italic } /* Comment */ 3 | .highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */ 4 | .highlight .g { color: #000000 } /* Generic */ 5 | .highlight .k { color: #204a87; font-weight: bold } /* Keyword */ 6 | .highlight .l { color: #000000 } /* Literal */ 7 | .highlight .n { color: #000000 } /* Name */ 8 | .highlight .o { color: #ce5c00; font-weight: bold } /* Operator */ 9 | .highlight .x { color: #000000 } /* Other */ 10 | .highlight .p { color: #000000; font-weight: bold } /* Punctuation */ 11 | .highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */ 12 | .highlight .cp { color: #8f5902; font-style: italic } /* Comment.Preproc */ 13 | .highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */ 14 | .highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ 15 | .highlight .gd { color: #a40000 } /* Generic.Deleted */ 16 | .highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ 17 | .highlight .gr { color: #ef2929 } /* Generic.Error */ 18 | .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ 19 | .highlight .gi { color: #00A000 } /* Generic.Inserted */ 20 | .highlight .go { color: #000000; font-style: italic } /* Generic.Output */ 21 | .highlight .gp { color: #8f5902 } /* Generic.Prompt */ 22 | .highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */ 23 | .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ 24 | .highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */ 25 | .highlight .kc { color: #204a87; font-weight: bold } /* Keyword.Constant */ 26 | .highlight .kd { color: #204a87; font-weight: bold } /* Keyword.Declaration */ 27 | .highlight .kn { color: #204a87; font-weight: bold } /* Keyword.Namespace */ 28 | .highlight .kp { color: #204a87; font-weight: bold } /* Keyword.Pseudo */ 29 | .highlight .kr { color: #204a87; font-weight: bold } /* Keyword.Reserved */ 30 | .highlight .kt { color: #204a87; font-weight: bold } /* Keyword.Type */ 31 | .highlight .ld { color: #000000 } /* Literal.Date */ 32 | .highlight .m { color: #0000cf; font-weight: bold } /* Literal.Number */ 33 | .highlight .s { color: #4e9a06 } /* Literal.String */ 34 | .highlight .na { color: #c4a000 } /* Name.Attribute */ 35 | .highlight .nb { color: #204a87 } /* Name.Builtin */ 36 | .highlight .nc { color: #000000 } /* Name.Class */ 37 | .highlight .no { color: #000000 } /* Name.Constant */ 38 | .highlight .nd { color: #5c35cc; font-weight: bold } /* Name.Decorator */ 39 | .highlight .ni { color: #ce5c00 } /* Name.Entity */ 40 | .highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */ 41 | .highlight .nf { color: #000000 } /* Name.Function */ 42 | .highlight .nl { color: #f57900 } /* Name.Label */ 43 | .highlight .nn { color: #000000 } /* Name.Namespace */ 44 | .highlight .nx { color: #000000 } /* Name.Other */ 45 | .highlight .py { color: #000000 } /* Name.Property */ 46 | .highlight .nt { color: #204a87; font-weight: bold } /* Name.Tag */ 47 | .highlight .nv { color: #000000 } /* Name.Variable */ 48 | .highlight .ow { color: #204a87; font-weight: bold } /* Operator.Word */ 49 | .highlight .w { color: #f8f8f8; text-decoration: underline } /* Text.Whitespace */ 50 | .highlight .mf { color: #0000cf; font-weight: bold } /* Literal.Number.Float */ 51 | .highlight .mh { color: #0000cf; font-weight: bold } /* Literal.Number.Hex */ 52 | .highlight .mi { color: #0000cf; font-weight: bold } /* Literal.Number.Integer */ 53 | .highlight .mo { color: #0000cf; font-weight: bold } /* Literal.Number.Oct */ 54 | .highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */ 55 | .highlight .sc { color: #4e9a06 } /* Literal.String.Char */ 56 | .highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */ 57 | .highlight .s2 { color: #4e9a06 } /* Literal.String.Double */ 58 | .highlight .se { color: #4e9a06 } /* Literal.String.Escape */ 59 | .highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */ 60 | .highlight .si { color: #4e9a06 } /* Literal.String.Interpol */ 61 | .highlight .sx { color: #4e9a06 } /* Literal.String.Other */ 62 | .highlight .sr { color: #4e9a06 } /* Literal.String.Regex */ 63 | .highlight .s1 { color: #4e9a06 } /* Literal.String.Single */ 64 | .highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */ 65 | .highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */ 66 | .highlight .vc { color: #000000 } /* Name.Variable.Class */ 67 | .highlight .vg { color: #000000 } /* Name.Variable.Global */ 68 | .highlight .vi { color: #000000 } /* Name.Variable.Instance */ 69 | .highlight .il { color: #0000cf; font-weight: bold } /* Literal.Number.Integer.Long */ -------------------------------------------------------------------------------- /assets/css/includes/_icon.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'gi'; 3 | font-weight: normal; 4 | font-style: normal; 5 | } 6 | @font-face { 7 | font-family: 'gi'; 8 | src: url('data:application/octet-stream;base64,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') format('woff'), 9 | url('data:application/octet-stream;base64,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') format('truetype'); 10 | } 11 | /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ 12 | /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ 13 | /* 14 | @media screen and (-webkit-min-device-pixel-ratio:0) { 15 | @font-face { 16 | font-family: 'gi'; 17 | src: url('../font/gi.svg?46324547#gi') format('svg'); 18 | } 19 | } 20 | */ 21 | 22 | [class^="gi-"]:before, [class*=" gi-"]:before { 23 | font-family: "gi"; 24 | font-style: normal; 25 | font-weight: normal; 26 | speak: none; 27 | 28 | display: inline-block; 29 | text-decoration: inherit; 30 | width: 1em; 31 | margin-right: .2em; 32 | text-align: center; 33 | /* opacity: .8; */ 34 | 35 | /* For safety - reset parent styles, that can break glyph codes*/ 36 | font-variant: normal; 37 | text-transform: none; 38 | 39 | /* fix buttons height, for twitter bootstrap */ 40 | line-height: 1em; 41 | 42 | /* Animation center compensation - margins should be symmetric */ 43 | /* remove if not needed */ 44 | margin-left: .2em; 45 | 46 | /* you can be more comfortable with increased icons size */ 47 | /* font-size: 120%; */ 48 | 49 | /* Uncomment for 3D effect */ 50 | /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ 51 | } 52 | .gi-twitter:before { content: '\f099'; } /* '' */ 53 | .gi-github:before { content: '\f09b'; } /* '' */ 54 | .gi-instagram:before { content: '\f16d'; } /* '' */ 55 | .gi-weibo:before { content: '\f18a'; } /* '' */ 56 | .gi-slack:before { content: '\f198'; } /* '' */ -------------------------------------------------------------------------------- /assets/css/includes/_index.scss: -------------------------------------------------------------------------------- 1 | 2 | .ga-section { 3 | position: relative; 4 | margin-bottom: 5rem; 5 | padding-top: 2.5rem; 6 | &::before { 7 | display: block; 8 | content: ""; 9 | width: 1.5rem; 10 | height: 1.5rem; 11 | background: $yellow; 12 | position: absolute; 13 | left: 0; 14 | top: 4px; 15 | } 16 | main > &::after { 17 | content: attr(data-title); 18 | font-family: $ga-font-mono; 19 | position: absolute; 20 | left: 2rem; 21 | top:0; 22 | font-size: 2rem; 23 | font-weight: bold; 24 | line-height: 1; 25 | } 26 | &#ga-post_list { 27 | margin-bottom: 4rem; 28 | } 29 | &#ga-pager { 30 | text-align: center; 31 | padding: 0; 32 | margin-bottom: 4rem; 33 | font-size: 0; 34 | > * { 35 | font-size: 1rem; 36 | } 37 | &::before { 38 | display: none; 39 | } 40 | a { 41 | color: $black; 42 | display: inline-block; 43 | &[prev] { 44 | margin-right: 0.5rem; 45 | } 46 | &[next] { 47 | margin-left: 0.5rem; 48 | } 49 | } 50 | } 51 | &#ga-post_list, &#ga-external_links, &#ga-archive_list, &#ga-about { 52 | blockquote { 53 | font-size: 0.95rem; 54 | margin-bottom: .67rem; 55 | margin-left: 0; 56 | padding-left: 0; 57 | font-weight: 300; 58 | &::before { 59 | display: none; 60 | } 61 | } 62 | > ul { 63 | list-style: none; 64 | padding: 0; 65 | > li { 66 | margin-bottom: 2rem; 67 | h1 { 68 | font-size: 1.35rem; 69 | line-height: 1.5; 70 | } 71 | a { 72 | color: $black; 73 | } 74 | footer { 75 | display: flex; 76 | flex-direction: row; 77 | justify-content: space-between; 78 | font-size: 0.95rem; 79 | } 80 | span.ga-read_more::before { 81 | content: "→ "; 82 | font-family: $ga-font-mono; 83 | } 84 | time { 85 | color: $faded-black-light; 86 | font-size: 0.85rem; 87 | white-space: nowrap; 88 | &::before { 89 | content: "/* "; 90 | } 91 | &::after { 92 | content: " */"; 93 | } 94 | } 95 | } 96 | } 97 | } 98 | &#ga-archive_list { 99 | padding-top: 3rem; 100 | > ul > li { 101 | margin-bottom: 1.3rem; 102 | display: flex; 103 | flex-direction: row; 104 | justify-content: space-between; 105 | align-items: center; 106 | h1 { 107 | margin: 0; 108 | } 109 | @media screen and (max-width: $breakSmall) { 110 | flex-direction: column; 111 | align-items: flex-start; 112 | margin-bottom: 1.15rem; 113 | h1 { 114 | margin-bottom: 0.75rem; 115 | font-size: 1.15rem; 116 | } 117 | } 118 | } 119 | } 120 | &#ga-external_links { 121 | > ul { 122 | margin-left: 1.5rem; 123 | > li { 124 | margin-bottom: 0.5rem; 125 | line-height: $contentLineHeight; 126 | position: relative; 127 | &::before { 128 | content: "→ "; 129 | position: absolute; 130 | left: -1.5rem; 131 | font-family: $ga-font-mono; 132 | } 133 | a { 134 | font-size: 1rem; 135 | border-bottom: 2px solid rgba($color: $yellow, $alpha: 0.45); 136 | } 137 | } 138 | } 139 | } 140 | } 141 | -------------------------------------------------------------------------------- /assets/css/includes/_normalize.scss: -------------------------------------------------------------------------------- 1 | /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ 2 | 3 | /* Document 4 | ========================================================================== */ 5 | 6 | /** 7 | * 1. Correct the line height in all browsers. 8 | * 2. Prevent adjustments of font size after orientation changes in iOS. 9 | */ 10 | 11 | html { 12 | line-height: 1.15; /* 1 */ 13 | -webkit-text-size-adjust: 100%; /* 2 */ 14 | } 15 | 16 | /* Sections 17 | ========================================================================== */ 18 | 19 | /** 20 | * Remove the margin in all browsers. 21 | */ 22 | 23 | body { 24 | margin: 0; 25 | } 26 | 27 | /** 28 | * Render the `main` element consistently in IE. 29 | */ 30 | 31 | main { 32 | display: block; 33 | } 34 | 35 | /** 36 | * Correct the font size and margin on `h1` elements within `section` and 37 | * `article` contexts in Chrome, Firefox, and Safari. 38 | */ 39 | 40 | h1 { 41 | font-size: 2em; 42 | margin: 0.67em 0; 43 | } 44 | 45 | /* Grouping content 46 | ========================================================================== */ 47 | 48 | /** 49 | * 1. Add the correct box sizing in Firefox. 50 | * 2. Show the overflow in Edge and IE. 51 | */ 52 | 53 | hr { 54 | box-sizing: content-box; /* 1 */ 55 | height: 0; /* 1 */ 56 | overflow: visible; /* 2 */ 57 | } 58 | 59 | /** 60 | * 1. Correct the inheritance and scaling of font size in all browsers. 61 | * 2. Correct the odd `em` font sizing in all browsers. 62 | */ 63 | 64 | pre { 65 | font-family: monospace, monospace; /* 1 */ 66 | font-size: 1em; /* 2 */ 67 | } 68 | 69 | /* Text-level semantics 70 | ========================================================================== */ 71 | 72 | /** 73 | * Remove the gray background on active links in IE 10. 74 | */ 75 | 76 | a { 77 | background-color: transparent; 78 | } 79 | 80 | /** 81 | * 1. Remove the bottom border in Chrome 57- 82 | * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. 83 | */ 84 | 85 | abbr[title] { 86 | border-bottom: none; /* 1 */ 87 | text-decoration: underline; /* 2 */ 88 | text-decoration: underline dotted; /* 2 */ 89 | } 90 | 91 | /** 92 | * Add the correct font weight in Chrome, Edge, and Safari. 93 | */ 94 | 95 | b, 96 | strong { 97 | font-weight: bolder; 98 | } 99 | 100 | /** 101 | * 1. Correct the inheritance and scaling of font size in all browsers. 102 | * 2. Correct the odd `em` font sizing in all browsers. 103 | */ 104 | 105 | code, 106 | kbd, 107 | samp { 108 | font-family: monospace, monospace; /* 1 */ 109 | font-size: 1em; /* 2 */ 110 | } 111 | 112 | /** 113 | * Add the correct font size in all browsers. 114 | */ 115 | 116 | small { 117 | font-size: 80%; 118 | } 119 | 120 | /** 121 | * Prevent `sub` and `sup` elements from affecting the line height in 122 | * all browsers. 123 | */ 124 | 125 | sub, 126 | sup { 127 | font-size: 75%; 128 | line-height: 0; 129 | position: relative; 130 | vertical-align: baseline; 131 | } 132 | 133 | sub { 134 | bottom: -0.25em; 135 | } 136 | 137 | sup { 138 | top: -0.5em; 139 | } 140 | 141 | /* Embedded content 142 | ========================================================================== */ 143 | 144 | /** 145 | * Remove the border on images inside links in IE 10. 146 | */ 147 | 148 | img { 149 | border-style: none; 150 | } 151 | 152 | /* Forms 153 | ========================================================================== */ 154 | 155 | /** 156 | * 1. Change the font styles in all browsers. 157 | * 2. Remove the margin in Firefox and Safari. 158 | */ 159 | 160 | button, 161 | input, 162 | optgroup, 163 | select, 164 | textarea { 165 | font-family: inherit; /* 1 */ 166 | font-size: 100%; /* 1 */ 167 | line-height: 1.15; /* 1 */ 168 | margin: 0; /* 2 */ 169 | } 170 | 171 | /** 172 | * Show the overflow in IE. 173 | * 1. Show the overflow in Edge. 174 | */ 175 | 176 | button, 177 | input { /* 1 */ 178 | overflow: visible; 179 | } 180 | 181 | /** 182 | * Remove the inheritance of text transform in Edge, Firefox, and IE. 183 | * 1. Remove the inheritance of text transform in Firefox. 184 | */ 185 | 186 | button, 187 | select { /* 1 */ 188 | text-transform: none; 189 | } 190 | 191 | /** 192 | * Correct the inability to style clickable types in iOS and Safari. 193 | */ 194 | 195 | button, 196 | [type="button"], 197 | [type="reset"], 198 | [type="submit"] { 199 | -webkit-appearance: button; 200 | } 201 | 202 | /** 203 | * Remove the inner border and padding in Firefox. 204 | */ 205 | 206 | button::-moz-focus-inner, 207 | [type="button"]::-moz-focus-inner, 208 | [type="reset"]::-moz-focus-inner, 209 | [type="submit"]::-moz-focus-inner { 210 | border-style: none; 211 | padding: 0; 212 | } 213 | 214 | /** 215 | * Restore the focus styles unset by the previous rule. 216 | */ 217 | 218 | button:-moz-focusring, 219 | [type="button"]:-moz-focusring, 220 | [type="reset"]:-moz-focusring, 221 | [type="submit"]:-moz-focusring { 222 | outline: 1px dotted ButtonText; 223 | } 224 | 225 | /** 226 | * Correct the padding in Firefox. 227 | */ 228 | 229 | fieldset { 230 | padding: 0.35em 0.75em 0.625em; 231 | } 232 | 233 | /** 234 | * 1. Correct the text wrapping in Edge and IE. 235 | * 2. Correct the color inheritance from `fieldset` elements in IE. 236 | * 3. Remove the padding so developers are not caught out when they zero out 237 | * `fieldset` elements in all browsers. 238 | */ 239 | 240 | legend { 241 | box-sizing: border-box; /* 1 */ 242 | color: inherit; /* 2 */ 243 | display: table; /* 1 */ 244 | max-width: 100%; /* 1 */ 245 | padding: 0; /* 3 */ 246 | white-space: normal; /* 1 */ 247 | } 248 | 249 | /** 250 | * Add the correct vertical alignment in Chrome, Firefox, and Opera. 251 | */ 252 | 253 | progress { 254 | vertical-align: baseline; 255 | } 256 | 257 | /** 258 | * Remove the default vertical scrollbar in IE 10+. 259 | */ 260 | 261 | textarea { 262 | overflow: auto; 263 | } 264 | 265 | /** 266 | * 1. Add the correct box sizing in IE 10. 267 | * 2. Remove the padding in IE 10. 268 | */ 269 | 270 | [type="checkbox"], 271 | [type="radio"] { 272 | box-sizing: border-box; /* 1 */ 273 | padding: 0; /* 2 */ 274 | } 275 | 276 | /** 277 | * Correct the cursor style of increment and decrement buttons in Chrome. 278 | */ 279 | 280 | [type="number"]::-webkit-inner-spin-button, 281 | [type="number"]::-webkit-outer-spin-button { 282 | height: auto; 283 | } 284 | 285 | /** 286 | * 1. Correct the odd appearance in Chrome and Safari. 287 | * 2. Correct the outline style in Safari. 288 | */ 289 | 290 | [type="search"] { 291 | -webkit-appearance: textfield; /* 1 */ 292 | outline-offset: -2px; /* 2 */ 293 | } 294 | 295 | /** 296 | * Remove the inner padding in Chrome and Safari on macOS. 297 | */ 298 | 299 | [type="search"]::-webkit-search-decoration { 300 | -webkit-appearance: none; 301 | } 302 | 303 | /** 304 | * 1. Correct the inability to style clickable types in iOS and Safari. 305 | * 2. Change font properties to `inherit` in Safari. 306 | */ 307 | 308 | ::-webkit-file-upload-button { 309 | -webkit-appearance: button; /* 1 */ 310 | font: inherit; /* 2 */ 311 | } 312 | 313 | /* Interactive 314 | ========================================================================== */ 315 | 316 | /* 317 | * Add the correct display in Edge, IE 10+, and Firefox. 318 | */ 319 | 320 | details { 321 | display: block; 322 | } 323 | 324 | /* 325 | * Add the correct display in all browsers. 326 | */ 327 | 328 | summary { 329 | display: list-item; 330 | } 331 | 332 | /* Misc 333 | ========================================================================== */ 334 | 335 | /** 336 | * Add the correct display in IE 10+. 337 | */ 338 | 339 | template { 340 | display: none; 341 | } 342 | 343 | /** 344 | * Add the correct display in IE 10. 345 | */ 346 | 347 | [hidden] { 348 | display: none; 349 | } -------------------------------------------------------------------------------- /assets/css/includes/_var.scss: -------------------------------------------------------------------------------- 1 | $yellow: #FFCA27; 2 | $red: #FF6238; 3 | $black: #333333; 4 | $faded-black: rgba($color: $black, $alpha: 0.9); 5 | $faded-black-light: rgba($color: $black, $alpha: 0.6); 6 | 7 | $animationTimingFunc: cubic-bezier(.25,.46,.45,.94); 8 | 9 | $ga-font-sans: -apple-system, system-ui, sans-serif; 10 | $ga-font-mono: 'Fira Code', $ga-font-sans; 11 | $contentLineHeight: 1.7; 12 | 13 | $mainWidth: 660px; 14 | $mainPadding: 20px; 15 | 16 | $breakSmall: 767.5px; 17 | $breakMiddle: 920px; 18 | -------------------------------------------------------------------------------- /assets/css/includes/_yue.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * yue.css 3 | * 4 | * yue.css is designed for readable content. 5 | * 6 | * Copyright (c) 2013 - 2017 by Hsiaoming Yang. 7 | */ 8 | 9 | .yue { 10 | line-height: $contentLineHeight; 11 | letter-spacing: 0.01em; 12 | .ga-content_body { 13 | font-family: 'Droid Serif', $ga-font-sans; 14 | } 15 | } 16 | 17 | .yue ::-moz-selection { 18 | background-color: $yellow; 19 | } 20 | 21 | .yue ::selection { 22 | background-color: $yellow; 23 | } 24 | .yue h1, 25 | .yue h2, 26 | .yue h3, 27 | .yue h4, 28 | .yue h5, 29 | .yue h6 { 30 | font-family: $ga-font-sans; 31 | } 32 | .yue h1 { 33 | font-size: 1.7em; 34 | margin: 0.67em 0; 35 | } 36 | .yue > h1 { 37 | margin-top: 0; 38 | font-size: 1.7em; 39 | } 40 | .yue h2 { 41 | font-size: 1.5em; 42 | margin: 0.83em 0; 43 | } 44 | .yue h3 { 45 | font-size: 1.17em; 46 | margin: 1em 0; 47 | } 48 | .yue h4, 49 | .yue h5, 50 | .yue h6 { 51 | font-size: 1em; 52 | margin: 1.6em 0 1em 0; 53 | } 54 | .yue h6 { 55 | font-weight: 500; 56 | } 57 | .yue p { 58 | margin-top: 0; 59 | margin-bottom: 1.24em; 60 | } 61 | .yue .notice { 62 | padding: 0.5rem; 63 | background: rgba($color: $yellow, $alpha: 0.05); 64 | margin-bottom: 1.24em; 65 | } 66 | .yue a { 67 | word-wrap: break-word; 68 | color: $black; 69 | border-bottom: 2px solid rgba($color: $yellow, $alpha: 0.45); 70 | @include a-highlight() 71 | } 72 | 73 | .yue .dplayer-menu .dplayer-menu-item a { 74 | border: none; 75 | background: none; 76 | } 77 | 78 | .yue strong, 79 | .yue b { 80 | font-weight: 700; 81 | color: #000; 82 | } 83 | .yue em{ 84 | font-style: italic; 85 | color: #000; 86 | } 87 | .yue sup { 88 | margin-left: 4px; 89 | } 90 | .yue sup > a[href^="#fn"] { 91 | &::before { 92 | display: none 93 | } 94 | display: inline-flex; 95 | justify-content: center; 96 | align-items: center; 97 | width: 16px; 98 | height: 16px; 99 | padding: 4px; 100 | background-color: rgba(0,0,0,.18); 101 | color: #fff!important; 102 | border-radius: 14px; 103 | &:hover { 104 | background-color: $black; 105 | } 106 | border-bottom: 0; 107 | font-size: 12px; 108 | text-emphasis: none; 109 | } 110 | .yue i { 111 | font-style: normal; 112 | } 113 | .yue img { 114 | max-width: 100%; 115 | height: auto; 116 | margin: 0.2em 0; 117 | display: block; 118 | margin-right: auto; 119 | margin-left: auto; 120 | } 121 | .yue a img { 122 | /* Remove border on IE */ 123 | border: none; 124 | } 125 | .yue figure { 126 | position: relative; 127 | clear: both; 128 | outline: 0; 129 | margin: 10px 0 30px; 130 | padding: 0; 131 | min-height: 100px; 132 | &.pswp-item { 133 | cursor: pointer; 134 | } 135 | } 136 | .yue figure img { 137 | display: block; 138 | max-width: 100%; 139 | margin: auto auto 4px; 140 | box-sizing: border-box; 141 | } 142 | .yue figure figcaption { 143 | position: relative; 144 | width: 100%; 145 | text-align: center; 146 | left: 0; 147 | margin-top: 10px; 148 | font-weight: 400; 149 | font-size: 14px; 150 | color: $faded-black; 151 | } 152 | .yue hr { 153 | display: block; 154 | width: 14%; 155 | margin: 40px auto 34px; 156 | border: 0 none; 157 | border-top: 3px solid #dededc; 158 | } 159 | .yue blockquote { 160 | margin: 0 0 1.64em 0; 161 | padding-left: 2.2em; 162 | color: #666664; 163 | position: relative; 164 | &::before { 165 | position: absolute; 166 | top: -4px; 167 | left: 0; 168 | content: "\201c"; 169 | font: 700 58px/1 "Droid Serif",serif; 170 | color: rgba(0,0,0,.1); 171 | } 172 | } 173 | .yue ul, 174 | .yue ol { 175 | margin: 0 0 24px 6px; 176 | padding-left: 16px; 177 | } 178 | .yue ul { 179 | list-style-type: square; 180 | } 181 | .yue ol { 182 | list-style-type: decimal; 183 | } 184 | .yue li { 185 | margin-bottom: 0.2em; 186 | } 187 | .yue li ul, 188 | .yue li ol { 189 | margin-top: 0; 190 | margin-bottom: 0; 191 | margin-left: 14px; 192 | } 193 | .yue li ul { 194 | list-style-type: disc; 195 | } 196 | .yue li ul ul { 197 | list-style-type: circle; 198 | } 199 | .yue li p { 200 | margin: 0.4em 0 0.6em; 201 | } 202 | .yue .unstyled { 203 | list-style-type: none; 204 | margin: 0; 205 | padding: 0; 206 | } 207 | .yue code, 208 | .yue tt { 209 | color: #808080; 210 | font-size: 0.96em; 211 | background-color: #f9f9f7; 212 | padding: 1px 2px; 213 | border-radius: 3px; 214 | font-family: $ga-font-mono; 215 | word-wrap: break-word; 216 | } 217 | .yue pre { 218 | margin: 1.64em 0; 219 | padding: 10px; 220 | border: none; 221 | overflow: auto; 222 | line-height: 1.5; 223 | font-size: 0.9em; 224 | font-family: $ga-font-mono; 225 | color: #4c4c4c; 226 | background-color: #f9f9f7; 227 | } 228 | .yue pre code, 229 | .yue pre tt { 230 | color: #4c4c4c; 231 | background: none; 232 | padding: 0; 233 | } 234 | .yue table { 235 | width: 100%; 236 | max-width: 100%; 237 | border-collapse: collapse; 238 | border-spacing: 0; 239 | margin-bottom: 1.5em; 240 | font-size: 0.96em; 241 | box-sizing: border-box; 242 | } 243 | .yue th, 244 | .yue td { 245 | text-align: left; 246 | padding: 4px 8px 4px 10px; 247 | border: 1px solid #dadada; 248 | } 249 | .yue td { 250 | vertical-align: top; 251 | } 252 | .yue tr:nth-child(even) { 253 | background-color: #efefee; 254 | } 255 | .yue iframe { 256 | display: block; 257 | max-width: 100%; 258 | margin-bottom: 30px; 259 | } 260 | .yue figure iframe { 261 | margin: auto; 262 | } 263 | .yue table pre { 264 | margin: 0; 265 | padding: 0; 266 | border: none; 267 | background: none; 268 | } 269 | 270 | .yue .footnotes li a::before { 271 | display: none; 272 | } 273 | 274 | [lang^="zh"] .yue p, 275 | [lang^="ja"] .yue p { 276 | text-justify: inter-ideographic; 277 | } 278 | 279 | [lang^="zh"] .yue em, 280 | [lang^="ja"] .yue em { 281 | font-style: normal; 282 | text-emphasis: dot #555; 283 | text-emphasis-position: under right; 284 | } -------------------------------------------------------------------------------- /assets/fontello-59cd00e4/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Font license info 2 | 3 | 4 | ## Font Awesome 5 | 6 | Copyright (C) 2016 by Dave Gandy 7 | 8 | Author: Dave Gandy 9 | License: SIL () 10 | Homepage: http://fortawesome.github.com/Font-Awesome/ 11 | 12 | 13 | -------------------------------------------------------------------------------- /assets/fontello-59cd00e4/README.txt: -------------------------------------------------------------------------------- 1 | This webfont is generated by http://fontello.com open source project. 2 | 3 | 4 | ================================================================================ 5 | Please, note, that you should obey original font licenses, used to make this 6 | webfont pack. Details available in LICENSE.txt file. 7 | 8 | - Usually, it's enough to publish content of LICENSE.txt file somewhere on your 9 | site in "About" section. 10 | 11 | - If your project is open-source, usually, it will be ok to make LICENSE.txt 12 | file publicly available in your repository. 13 | 14 | - Fonts, used in Fontello, don't require a clickable link on your site. 15 | But any kind of additional authors crediting is welcome. 16 | ================================================================================ 17 | 18 | 19 | Comments on archive content 20 | --------------------------- 21 | 22 | - /font/* - fonts in different formats 23 | 24 | - /css/* - different kinds of css, for all situations. Should be ok with 25 | twitter bootstrap. Also, you can skip style and assign icon classes 26 | directly to text elements, if you don't mind about IE7. 27 | 28 | - demo.html - demo file, to show your webfont content 29 | 30 | - LICENSE.txt - license info about source fonts, used to build your one. 31 | 32 | - config.json - keeps your settings. You can import it back into fontello 33 | anytime, to continue your work 34 | 35 | 36 | Why so many CSS files ? 37 | ----------------------- 38 | 39 | Because we like to fit all your needs :) 40 | 41 | - basic file, .css - is usually enough, it contains @font-face 42 | and character code definitions 43 | 44 | - *-ie7.css - if you need IE7 support, but still don't wish to put char codes 45 | directly into html 46 | 47 | - *-codes.css and *-ie7-codes.css - if you like to use your own @font-face 48 | rules, but still wish to benefit from css generation. That can be very 49 | convenient for automated asset build systems. When you need to update font - 50 | no need to manually edit files, just override old version with archive 51 | content. See fontello source code for examples. 52 | 53 | - *-embedded.css - basic css file, but with embedded WOFF font, to avoid 54 | CORS issues in Firefox and IE9+, when fonts are hosted on the separate domain. 55 | We strongly recommend to resolve this issue by `Access-Control-Allow-Origin` 56 | server headers. But if you ok with dirty hack - this file is for you. Note, 57 | that data url moved to separate @font-face to avoid problems with 2 | 3 | 4 | 278 | 279 | 291 | 292 | 293 |
294 |

gi font demo

295 | 298 |
299 |
300 |
301 |
gi-twitter0xf099
302 |
gi-github0xf09b
303 |
gi-instagram0xf16d
304 |
gi-weibo0xf18a
305 |
306 |
307 |
gi-slack0xf198
308 |
309 |
310 | 311 | 312 | -------------------------------------------------------------------------------- /assets/fontello-59cd00e4/font/gi.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanDecode/Maverick-Theme-Galileo/128feed69533e86a9ec5f18407f481c8339da203/assets/fontello-59cd00e4/font/gi.eot -------------------------------------------------------------------------------- /assets/fontello-59cd00e4/font/gi.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Copyright (C) 2019 by original authors @ fontello.com 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /assets/fontello-59cd00e4/font/gi.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanDecode/Maverick-Theme-Galileo/128feed69533e86a9ec5f18407f481c8339da203/assets/fontello-59cd00e4/font/gi.ttf -------------------------------------------------------------------------------- /assets/fontello-59cd00e4/font/gi.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanDecode/Maverick-Theme-Galileo/128feed69533e86a9ec5f18407f481c8339da203/assets/fontello-59cd00e4/font/gi.woff -------------------------------------------------------------------------------- /assets/fontello-59cd00e4/font/gi.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanDecode/Maverick-Theme-Galileo/128feed69533e86a9ec5f18407f481c8339da203/assets/fontello-59cd00e4/font/gi.woff2 -------------------------------------------------------------------------------- /assets/js/galileo.js: -------------------------------------------------------------------------------- 1 | ; console.log(" %c Maverick & Galileo By AlanDecode %c https://www.imalan.cn/ ", "color: #fadfa3; background: #23b7e5; padding:5px;", "padding:5px;"); 2 | 3 | document.addEventListener('DOMContentLoaded', function () { 4 | (function () { 5 | var domain = document.domain; 6 | var els = document.getElementsByTagName('a'); 7 | for (var index = 0; index < els.length; index++) { 8 | var element = els[index]; 9 | var target = element.getAttribute('target'); 10 | if (typeof target === 'undefined' || (target != '' && target != '_self')) { 11 | if (element.hostname != domain) { 12 | element.setAttribute('target', '_blank'); 13 | } 14 | } 15 | } 16 | 17 | window.setInterval(function () { 18 | var times = new Date().getTime() - Date.parse(site_build_date); 19 | times = Math.floor(times / 1000); // convert total milliseconds into total seconds 20 | var days = Math.floor(times / (60 * 60 * 24)); //separate days 21 | times %= 60 * 60 * 24; //subtract entire days 22 | var hours = Math.floor(times / (60 * 60)); //separate hours 23 | times %= 60 * 60; //subtract entire hours 24 | var minutes = Math.floor(times / 60); //separate minutes 25 | times %= 60; //subtract entire minutes 26 | var seconds = Math.floor(times / 1); // remainder is seconds 27 | document.getElementById('ga-uptime').innerHTML = days + ' D ' + hours + ' H ' + minutes + ' M ' + seconds + ' S ' 28 | }, 1000); 29 | })(); 30 | 31 | (function () { 32 | var figureEls = document.querySelectorAll('figure[size-undefined]'); 33 | 34 | for (var index = 0; index < figureEls.length; index++) { 35 | var figure = figureEls[index]; 36 | 37 | var img = new Image(); 38 | img.src = figure.getElementsByTagName('img')[0].src; 39 | img.parentFigure = figure; 40 | 41 | img.onload = function () { 42 | var parent = this.parentFigure; 43 | parent.removeAttribute('size-undefined'); 44 | var w = parseFloat(this.width); 45 | var h = parseFloat(this.height); 46 | parent.style.flexGrow = String(w * 50 / h); 47 | }; 48 | } 49 | })(); 50 | 51 | (function () { 52 | var tuneBilibili = function () { 53 | var iframes = document.getElementsByTagName('iframe'); 54 | 55 | for (var index = 0; index < iframes.length; index++) { 56 | var iframe = iframes[index]; 57 | var src = iframe.src; 58 | 59 | if (typeof src === 'string' && src.indexOf('player.bilibili.com') > -1) { 60 | iframe.classList.add('bili-player'); 61 | 62 | if (src.indexOf('&high_quality') < 0) { 63 | src += '&high_quality=1'; // enable high quality 64 | iframe.setAttribute('src', src); 65 | } 66 | 67 | // by default 9:16 68 | var height = iframe.clientWidth * 0.5625; 69 | 70 | // is aspect ratio is explicitly specified 71 | if (iframe.getAttribute('data-ratio') != undefined) 72 | height = parseFloat(iframe.getAttribute('data-ratio')) * iframe.clientWidth; 73 | 74 | // show control panel with screen wider than 540 75 | if (window.innerWidth >= 540) 76 | height += 120; 77 | 78 | iframe.style.height = height + "px"; 79 | } 80 | } 81 | }; 82 | 83 | tuneBilibili(); 84 | window.addEventListener('resize', tuneBilibili); 85 | })(); 86 | 87 | // init all DPlayer 88 | (function () { 89 | var dplayers = document.getElementsByClassName('dplayer'); 90 | for (var index = 0; index < dplayers.length; index++) { 91 | var el = dplayers[index]; 92 | if (!el.hasAttribute('data-url')) 93 | continue; 94 | 95 | var options = { 96 | container: el, 97 | autoplay: el.dataset.autoplay || false, 98 | theme: el.dataset.theme || '#b7daff', 99 | loop: el.dataset.loop || false, 100 | lang: el.dataset.lang || navigator.language.toLowerCase(), 101 | screenshot: el.dataset.screenshot || false, 102 | hotkey: el.dataset.hotkey || true, 103 | preload: el.dataset.hotkey || 'auto', 104 | volume: 0.7, 105 | mutex: el.dataset.mutex || true, 106 | video: { 107 | url: el.dataset.url, 108 | pic: el.dataset.pic || '', 109 | thumbnails: el.dataset.thumbnails || '', 110 | type: el.dataset.type || 'auto', 111 | } 112 | } 113 | 114 | if (typeof el.dataset.subtitle === 'string') { 115 | options.subtitle = JSON.parse(el.dataset.subtitle) 116 | } 117 | if (typeof el.dataset.danmaku === 'string') { 118 | options.danmaku = JSON.parse(el.dataset.danmaku) 119 | } 120 | if (typeof el.dataset.highlight === 'string') { 121 | options.highlight = JSON.parse(el.dataset.highlight) 122 | } 123 | 124 | var contextmenu = []; 125 | if (typeof el.dataset.contextmenu === 'string') { 126 | contextmenu = JSON.parse(el.dataset.contextmenu) 127 | } 128 | contextmenu.push({ 129 | text: 'Maverick', 130 | link: 'https://github.com/AlanDecode/Maverick', 131 | }, { 132 | text: 'AlanDecode', 133 | link: 'https://www.imalan.cn', 134 | }); 135 | options.contextmenu = contextmenu; 136 | 137 | new DPlayer(options); 138 | } 139 | })(); 140 | }); 141 | -------------------------------------------------------------------------------- /assets/js/katex.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanDecode/Maverick-Theme-Galileo/128feed69533e86a9ec5f18407f481c8339da203/assets/js/katex.js -------------------------------------------------------------------------------- /assets/statics/ExSearch/ExSearch-182e5a8868.css: -------------------------------------------------------------------------------- 1 | .es-modal-open{position:fixed;width:100%}.ins-search{color:#444;display:none}.ins-search.show{display:block}.ins-search.show .ins-search-container{-webkit-transform:translateY(20px);transform:translateY(20px);opacity:0;-webkit-animation:exsearch-fade-in .3s;animation:exsearch-fade-in .3s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.ins-search.show::before{content:"";position:fixed;top:0;left:0;width:100%;height:100%;z-index:101;background:rgba(0,0,0,.67)}.ins-selectable{cursor:pointer}.ins-search-container{position:fixed}.ins-input-wrapper{position:relative}.ins-search-input{width:100%;border:none;outline:0;font-size:16px;-webkit-box-shadow:none;box-shadow:none;font-weight:200;border-radius:0;background:#fff;line-height:20px;-webkit-box-sizing:border-box;box-sizing:border-box;padding:12px 28px 12px 20px;border-bottom:1px solid #e2e2e2;font-family:"Microsoft Yahei Light","Microsoft Yahei",Helvetica,Arial,sans-serif}.ins-close{top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);right:6px;width:30px;height:30px;font-size:16px;position:absolute;text-align:center;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ins-close:hover{color:#006bde}.ins-search-container{left:50%;top:100px;z-index:101;bottom:100px;-webkit-box-sizing:border-box;box-sizing:border-box;width:540px;margin-left:-270px}@media screen and (max-width:559px),screen and (max-height:479px){.ins-search-container{top:0;left:0;margin:0;width:100%;height:100%;max-height:100vh;background:#f7f7f7}}.ins-section-wrapper{left:0;right:0;top:45px;bottom:0;overflow-y:auto;-webkit-overflow-scrolling:touch;position:absolute}.ins-section-container{position:relative;background:#f7f7f7}.ins-section{font-size:14px;line-height:16px}.ins-section .ins-search-item,.ins-section .ins-section-header{padding:8px 15px}.ins-section .ins-section-header{color:#9a9a9a!important;border-bottom:1px solid #e2e2e2}.ins-section .ins-slug{margin-left:5px;color:#9a9a9a!important}.ins-section .ins-slug::before{content:'('}.ins-section .ins-slug::after{content:')'}.ins-section .ins-search-item .ins-search-preview,.ins-section .ins-search-item div.header{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ins-section .ins-search-item div.header .iconfont{margin-right:4px}.ins-section .ins-search-item .ins-search-preview{height:18px;font-size:12px;color:#9a9a9a!important;margin:5px 0 0 20px}.ins-section .ins-search-item.active,.ins-section .ins-search-item:hover{color:#fff!important;background:#006bde}.ins-section .ins-search-item.active .ins-search-preview,.ins-section .ins-search-item.active .ins-slug,.ins-section .ins-search-item:hover .ins-search-preview,.ins-section .ins-search-item:hover .ins-slug{color:#fff!important}.ins-section .ins-search-item .search-keyword{color:#555;font-size:14px;font-weight:700}@-webkit-keyframes exsearch-fade-in{0%{-webkit-transform:translateY(20px);transform:translateY(20px);opacity:0}100%{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes exsearch-fade-in{0%{-webkit-transform:translateY(20px);transform:translateY(20px);opacity:0}100%{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@font-face{font-family:iconfont;src:url(iconfont.eot?t=1550575887587);src:url(iconfont.eot?t=1550575887587#iefix) format("embedded-opentype"),url("data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAOQAAsAAAAAB+gAAANDAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDMgqDCII+ATYCJAMUCwwABCAFhG0HRRvHBhFVnBvIfiTYuMz1r7SKRrj0Jnggvb43mVl8ihWY3ROQK0GnPaKEWd21aYAAArp+/5d+SteADNA2jFavvuXOtlda2vEYhyiAH/AbdDhuic+zt5zW3jwpwAQD2hvbInGBFAA3jF15EcchAE9iyUY0t7b14URhjBOAmDR+7HCcqSAKxTJOBPaSpSpRrMOGU1uu3QLW+p8XPykUTtCwSYyTusa0jKL+S9bfq9KwDAZJA2M8O8BWgQSyAQViRqlzEjJMZiPxVH6nqAc8caKhfcn6suKb8feqZUGV7kjtaSZBoil/HsKOUe4NQD1MKfiSZRNI+LKCQINvBoGAv1fFL+YUGwCegAMYC6xBjODX0hBoaMEeYd7egR4LvU8+Sh91zMgYfXxl1ljzaZzc86Df6QfLHq68b9yb7+l/+nKsY++VMp/DGbcft/icuhSjdl1c+OhT3+PP+tOv7idfBne5+nrcrl7d3d03V3ofOhZu3348xe+oGWXzPnJiJNhVeq0M0TdXzDRijYEpN8+fv9R2UddvtoVb3E4Z6Ix16EeqjJaulm69S8e/gaGb+ZZ0SSvffNcTMnpCil5vSVNaxAcZz1R8vO25GY+Pf6aex3yHD7s4dvczD504NO74Abzb2BMHzYPuYweom+q/Lv+E3CdP5O/zdev88d61ed7gHfz6xo3XhANgGUqTBpRLLP5b32FIzf8rQ/2q/zm9FADPNnj6IX57qil85SoU0b/JUyZYlitRJdBkU7KcchdKxHYEipmYEdwa/IaqP+IN5M046pDW5SBwEhJDw0EMJE6IZIpiZMPGSzHsnOrgKctxtZcgzpiYB5DpAyD4+0Lj6wokfz+KYvzBJtQ/7PyT8ORqvaWX1Mavtg55QEXFm9pSK7YsYRVUnlDfRe6SEp95g/NthNIoyWaOUHBjzPCPOguBiZ2WdACnQQhNxukOZYiaEMwmjrnsSVGp5WCliQO5ACqk8EZaJU1ht32wyr3/BGp3Qs7V1FV4b8Dx2s5JKpK0oByVqlXdtZzjPdQyQcAIczSJHMAgEASNmPJBHSgFkaZH3NiIzVbcVhnNr5YPUMCaMB5iSxNSKGETduTzesZaVHDTUmiPCbcCgwEA") format("woff2"),url(iconfont.woff?t=1550575887587) format("woff"),url(iconfont.ttf?t=1550575887587) format("truetype"),url(iconfont.svg?t=1550575887587#iconfont) format("svg")}.iconfont{font-family:iconfont!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-tag:before{content:"\e880"}.icon-folder:before{content:"\e68a"}.icon-close:before{content:"\e62b"}.icon-file:before{content:"\efc0"} -------------------------------------------------------------------------------- /assets/statics/ExSearch/ExSearch-493cb9cd89.js: -------------------------------------------------------------------------------- 1 | console.log(" %c ExSearch %c https://blog.imalan.cn/archives/261/ ","color: #fadfa3; background: #23b7e5; padding:5px;","padding:5px;"),$("body").append(''),function(n){var e={TRANSLATION:{POSTS:"Posts",PAGES:"Pages",CATEGORIES:"Categories",TAGS:"Tags",UNTITLED:"(Untitled)"},ROOT_URL:ExSearchConfig.root,CONTENT_URL:ExSearchConfig.api};n.INSIGHT_CONFIG=e}(window);var ModalHelper={scrollTop:0,beforeModal:function(){ModalHelper.scrollTop=document.scrollingElement.scrollTop,document.body.classList.add("es-modal-open"),document.body.style.top=-ModalHelper.scrollTop+"px"},closeModal:function(){document.body.classList.remove("es-modal-open"),document.scrollingElement.scrollTop=ModalHelper.scrollTop}};!function(i,c){var t=i(".ins-search"),n=t.find(".ins-search-input"),r=t.find(".ins-section-wrapper"),o=t.find(".ins-section-container");function l(n,e,t,a,r){return i("
").addClass("ins-selectable").addClass("ins-search-item").append(i("
").addClass("header").append(i("").addClass("iconfont").addClass("icon-"+n)).append(null!=e&&""!=e?e:c.TRANSLATION.UNTITLED).append(t?i("").addClass("ins-slug").text(t):null)).append(a?i("

").addClass("ins-search-preview").html(a):null).attr("data-url",r)}function a(n,e,t){var a,r,o,s=d(n);if(0===t.length)return null;switch(a=c.TRANSLATION[e],e){case"POSTS":case"PAGES":r=t.map(function(t){var n=20 '+n+" ")}),a=a?a.slice(n,n+80):t.text.slice(0,80),l("file",t.title,null,a,c.ROOT_URL+t.path)});break;case"CATEGORIES":case"TAGS":r=t.map(function(n){return l("CATEGORIES"===e?"folder":"tag",n.name,n.slug,null,n.permalink)});break;default:return null}return(o=a,i("

").addClass("ins-section").append(i("
").addClass("ins-section-header").text(o))).append(r)}function u(n,e){var t={};n.pages.concat(n.posts).forEach(function(n){n[e]&&n[e].forEach(function(n){t[n.name]=n})});var a=[];for(var e in t)a.push(t[e]);return a}function d(n){return n.split(" ").filter(function(n){return!!n}).map(function(n){return n.toUpperCase()})}function p(n,a,e){var t=d(n);return t.filter(function(t){return 0e+r.scrollTop()&&r.scrollTop(a-r[0].clientHeight),t<0&&r.scrollTop(n.position().top)}}(i(e[a]))}function T(n){n&&n.length&&(location.href=n.attr("data-url"))}t.parent().remove(".ins-search"),i("body").append(t),i.getJSON(c.CONTENT_URL,function(e){"#ins-search"===location.hash.trim()&&(t.addClass("show"),ModalHelper.beforeModal()),n.on("input",function(){var n=i(this).val();!function(n,e){for(var t in o.empty(),e)o.append(a(n,t.toUpperCase(),e[t]))}(n,s(e,n))}),n.trigger("input")}),i(document).on("click focus",".search-form-input",function(){t.addClass("show"),ModalHelper.beforeModal(),document.scrollingElement.scrollTop=0,t.find(".ins-search-input").focus()}).on("click",".ins-search-item",function(){"function"==typeof ExSearchCall?ExSearchCall(i(this)):T(i(this))}).on("click",".ins-close",function(){t.removeClass("show"),ModalHelper.closeModal()}).on("keydown",function(n){if(t.hasClass("show"))switch(n.keyCode){case 27:t.removeClass("show"),ModalHelper.closeModal();break;case 38:h(-1);break;case 40:h(1);break;case 13:var e=o.find(".ins-selectable.active").eq(0);"function"==typeof ExSearchCall?ExSearchCall(e):T(e)}})}(jQuery,window.INSIGHT_CONFIG); -------------------------------------------------------------------------------- /assets/statics/ExSearch/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanDecode/Maverick-Theme-Galileo/128feed69533e86a9ec5f18407f481c8339da203/assets/statics/ExSearch/iconfont.eot -------------------------------------------------------------------------------- /assets/statics/ExSearch/iconfont.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | Created by iconfont 9 | 10 | 11 | 12 | 13 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /assets/statics/ExSearch/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanDecode/Maverick-Theme-Galileo/128feed69533e86a9ec5f18407f481c8339da203/assets/statics/ExSearch/iconfont.ttf -------------------------------------------------------------------------------- /assets/statics/ExSearch/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanDecode/Maverick-Theme-Galileo/128feed69533e86a9ec5f18407f481c8339da203/assets/statics/ExSearch/iconfont.woff -------------------------------------------------------------------------------- /assets/statics/ExSearch/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlanDecode/Maverick-Theme-Galileo/128feed69533e86a9ec5f18407f481c8339da203/assets/statics/ExSearch/iconfont.woff2 -------------------------------------------------------------------------------- /assets/statics/auto-render.min.js: -------------------------------------------------------------------------------- 1 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("katex")):"function"==typeof define&&define.amd?define(["katex"],t):"object"==typeof exports?exports.renderMathInElement=t(require("katex")):e.renderMathInElement=t(e.katex)}("undefined"!=typeof self?self:this,function(e){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=1)}([function(t,r){t.exports=e},function(e,t,r){"use strict";r.r(t);var n=r(0),o=r.n(n),a=function(e,t,r){for(var n=r,o=0,a=e.length;n.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathdefault{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-weight:700;font-style:italic}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;vertical-align:bottom;position:relative}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;vertical-align:bottom;font-size:1px;width:2px;min-width:2px}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{width:0;position:relative}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{display:inline-block;border:0 solid;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline{display:inline-block;width:100%;border-bottom-style:dashed}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .op-limits>.vlist-t{text-align:center}.katex .accent>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{display:block;position:absolute;width:100%;height:inherit;fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex svg path{stroke:none}.katex img{border-style:none;min-width:0;min-height:0;max-width:none;max-height:none}.katex .stretchy{width:100%;display:block;position:relative;overflow:hidden}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{width:100%;position:relative;overflow:hidden}.katex .halfarrow-left{position:absolute;left:0;width:50.2%;overflow:hidden}.katex .halfarrow-right{position:absolute;right:0;width:50.2%;overflow:hidden}.katex .brace-left{position:absolute;left:0;width:25.1%;overflow:hidden}.katex .brace-center{position:absolute;left:25%;width:50%;overflow:hidden}.katex .brace-right{position:absolute;right:0;width:25.1%;overflow:hidden}.katex .x-arrow-pad{padding:0 .5em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{box-sizing:border-box;border:.04em solid}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{text-align:left} 2 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable linebreak-style */ 2 | /* eslint-disable no-undef */ 3 | var gulp = require('gulp'); 4 | var sass = require('gulp-sass'); 5 | var prefix = require('gulp-autoprefixer'); 6 | var minify = require('gulp-clean-css'); 7 | var rev = require('gulp-rev'); 8 | var revCollector = require('gulp-rev-collector'); 9 | var concat = require('gulp-concat'); 10 | var uglify = require('gulp-uglify'); 11 | var del = require('del'); 12 | 13 | var prefixerOptions = { 14 | overrideBrowserslist: ['last 2 versions'] 15 | }; 16 | 17 | 18 | gulp.task('clean', function () { 19 | return del(['./Galileo']); 20 | }); 21 | 22 | 23 | // CSS 24 | gulp.task('css', function () { 25 | return gulp.src('./assets/css/galileo.scss') 26 | .pipe(sass()) 27 | .pipe(prefix(prefixerOptions)) 28 | .pipe(minify()) 29 | .pipe(rev()) 30 | .pipe(gulp.dest('./Galileo/assets/')) 31 | .pipe(rev.manifest()) 32 | .pipe(gulp.dest('./temp/rev/css')); 33 | }); 34 | 35 | //JS 36 | gulp.task('js', function () { 37 | return gulp.src(['./assets/js/dplayer.js', './assets/js/galileo.js']) 38 | .pipe(concat('galileo.js')) 39 | .pipe(uglify()) 40 | .pipe(rev()) 41 | .pipe(gulp.dest('./Galileo/assets/')) 42 | .pipe(rev.manifest()) 43 | .pipe(gulp.dest('./temp/rev/js')); 44 | }); 45 | 46 | gulp.task('md5', function () { 47 | return gulp.src(['./temp/rev/**/*.json', './templates/**/*ml']) 48 | .pipe(revCollector()) 49 | .pipe(gulp.dest('./Galileo/templates/')); 50 | }); 51 | 52 | gulp.task('move', function () { 53 | gulp.src(['./locale/*']) 54 | .pipe(gulp.dest('./Galileo/locale/')); 55 | gulp.src(['./utils.py', './__init__.py', './LICENSE', './README.md']) 56 | .pipe(gulp.dest('./Galileo/')); 57 | return gulp.src(['./assets/statics/**/*'], {base: './assets/statics/'}) 58 | .pipe(gulp.dest('./Galileo/assets/')); 59 | }); 60 | 61 | gulp.task('default', gulp.series('clean', gulp.parallel('css', 'js'), 'md5', 'move')); 62 | -------------------------------------------------------------------------------- /locale/zh-CN.json: -------------------------------------------------------------------------------- 1 | { 2 | "Read More": "阅读全文", 3 | "Search": "搜索", 4 | "No More": "没有了", 5 | "This is the oldest one.": "这是最旧的文章", 6 | "This is the latest one.": "这是最新的文章", 7 | "Catch me: ": "抓住我:", 8 | "Category": "分类", 9 | "Tag": "标签", 10 | "Archives": "归档" 11 | } 12 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "del": "^3.0.0", 4 | "eslint": "^5.12.1", 5 | "gulp": "^4.0.0", 6 | "gulp-autoprefixer": "^6.0.0", 7 | "gulp-clean-css": "^4.0.0", 8 | "gulp-concat": "^2.6.1", 9 | "gulp-rev": "^9.0.0", 10 | "gulp-rev-collector": "^1.3.1", 11 | "gulp-sass": "^4.0.2", 12 | "gulp-uglify": "^3.0.1", 13 | "jsonfile": "^5.0.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /templates/archives.html: -------------------------------------------------------------------------------- 1 | {% extends "includes/skeleton_archive.html" %} 2 | 3 | {% macro seo_title() %}{{ tr('Archives') }} - {{ fp(config.site_name) }}{% endmacro %} 4 | {% block title %}{{ seo_title() }}{% endblock title %} 5 | {% block og_title %}{{ seo_title() }}{% endblock %} 6 | {% block og_description %}{{ seo_title() }}{% endblock %} 7 | {% block og_url %}{{ Router.gen_permalink('archives', '', current_page) }}{% endblock %} 8 | {% block twitter_title %}{{ seo_title() }}{% endblock %} 9 | 10 | {% block more_section %} 11 | 12 |
13 |
    14 | {% for content in content_list %} 15 |
  • 16 |

    {{ content.meta['title'] }}

    17 | 20 |
  • 21 | {% endfor %} 22 |
23 |
24 | 25 |
26 | {% if current_page > 1 %} 27 | Prev 28 | {% endif %} 29 | Page {{ current_page }} of {{ max_pages }} 30 | {% if current_page < max_pages %} 31 | Next 32 | {% endif %} 33 |
34 | 35 | {% endblock more_section %} -------------------------------------------------------------------------------- /templates/categories.html: -------------------------------------------------------------------------------- 1 | {% extends "includes/skeleton_archive.html" %} 2 | 3 | {% macro seo_title() %}{{ tr('Category') }}: {{ cate_name }} - {{ fp(config.site_name) }}{% endmacro %} 4 | {% block title %}{{ seo_title() }}{% endblock title %} 5 | {% block og_title %}{{ seo_title() }}{% endblock %} 6 | {% block og_description %}{{ seo_title() }}{% endblock %} 7 | {% block og_url %}{{ Router.gen_permalink('category', cate_name, current_page) }}{% endblock %} 8 | {% block twitter_title %}{{ seo_title() }}{% endblock %} 9 | 10 | {% block more_section %} 11 | 12 |
13 |
    14 | {% for content in content_list %} 15 |
  • 16 |

    {{ content.meta['title'] }}

    17 | 20 |
  • 21 | {% endfor %} 22 |
23 |
24 | 25 |
26 | {% if current_page > 1 %} 27 | Prev 28 | {% endif %} 29 | Page {{ current_page }} of {{ max_pages }} 30 | {% if current_page < max_pages %} 31 | Next 32 | {% endif %} 33 |
34 | 35 | {% endblock more_section %} -------------------------------------------------------------------------------- /templates/includes/skeleton.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 25 | {% block head %}{% endblock %} 26 | 27 | {{ fp(config.head_addon) }} 28 | 29 | 30 | 31 | {% if config.background_img != "" %} 32 |
33 | {% endif %} 34 |
35 |
36 |
37 | 41 |
42 |
43 | 46 |
47 |
48 |
49 | {% block main %}{% endblock %} 50 |
51 |
52 | 53 | {{ fp(config.site_name) }} 54 |
55 |
56 | 60 | 68 |
69 | 72 | 73 |
74 |
75 |
76 |
77 | 78 | 79 | 80 | 90 | 91 | 92 | 93 | 94 | 95 | {{ fp(config.body_addon) }} 96 | 97 | -------------------------------------------------------------------------------- /templates/includes/skeleton_archive.html: -------------------------------------------------------------------------------- 1 | {% extends "includes/skeleton.html" %} 2 | 3 | {% block head %} 4 | {% block title %}{% endblock %} 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | {% endblock head %} 18 | 19 | {% block main %} 20 |
21 | {% block more_section %}{% endblock more_section %} 22 |
23 | {% endblock main %} 24 | -------------------------------------------------------------------------------- /templates/includes/skeleton_content.html: -------------------------------------------------------------------------------- 1 | {% extends "includes/skeleton.html" %} 2 | 3 | {% macro seo_title(content, config) -%} 4 | {{ content.get_meta('title') }} - {{ fp(config.site_name) }} 5 | {%- endmacro %} 6 | 7 | {% block head %} 8 | {{ seo_title(content, config) }} 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | {% endblock head %} 23 | 24 | {% block main %} 25 |
26 |
27 |
28 |

{{ content.get_meta('title') }}

29 | 45 |
46 | {{ content.parsed }} 47 |
48 |
49 | {% block more_content %}{% endblock more_content %} 50 |
51 | 52 | {% block more_section %}{% endblock more_section %} 53 | 54 | {% if config.valine['enable'] and content.get_meta('comment') %} 55 | 60 | 61 |
62 | {% endif %} 63 | 64 |
65 | {% endblock main %} -------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends "includes/skeleton_archive.html" %} 2 | 3 | {% macro seo_title() %}{{ fp(config.site_name) }}{% endmacro %} 4 | {% block title %}{{ seo_title() }}{% endblock title %} 5 | {% block og_title %}{{ seo_title() }}{% endblock %} 6 | {% block og_description %}{{ fp(config.description) }}{% endblock %} 7 | {% block og_url %}{{ Router.gen_permalink('index', '', current_page) }}{% endblock %} 8 | {% block twitter_title %}{{ seo_title() }}{% endblock %} 9 | 10 | {% block more_section %} 11 | 12 |
13 |
    14 | {% for content in content_list %} 15 |
  • 16 |
    17 |

    {{ content.meta['title'] }}

    18 | {% if content.meta['showfull'] %} 19 |
    {{ content.parsed }}
    20 | {% else %} 21 |
    {{ content.excerpt }}
    22 | {% endif %} 23 | 29 |
    30 |
  • 31 | {% endfor %} 32 |
33 |
34 | 35 |
36 | {% if current_page > 1 %} 37 | Prev 38 | {% endif %} 39 | Page {{ current_page }} of {{ max_pages }} 40 | {% if current_page < max_pages %} 41 | Next 42 | {% endif %} 43 |
44 | 45 | 54 | 55 | {% endblock more_section %} -------------------------------------------------------------------------------- /templates/page.html: -------------------------------------------------------------------------------- 1 | {% extends "includes/skeleton_content.html" %} 2 | -------------------------------------------------------------------------------- /templates/post.html: -------------------------------------------------------------------------------- 1 | {% extends "includes/skeleton_content.html" %} 2 | 3 | {% block more_section %} 4 |
5 | {% if not content_next is none %} 6 | 10 | {% else %} 11 | 15 | {% endif %} 16 | {% if not content_prev is none %} 17 | 21 | {% else %} 22 | 26 | {% endif %} 27 |
28 | {% endblock more_section %} 29 | 30 | {% block more_content -%} 31 |
32 | {% for tag in content.get_meta('tags') %} 33 | 34 | #{{- tag -}} 35 | 36 | {% endfor %} 37 |
38 | 39 | {%- endblock more_content %} -------------------------------------------------------------------------------- /templates/sitemap.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | {% for page in page_list %} 8 | 9 | {{ Router.gen_permalink_by_content(page) }} 10 | {{ page.get_meta('date').format('YYYY-MM-DD') }} 11 | always 12 | 0.8 13 | 14 | {% endfor %} 15 | {% for post in post_list %} 16 | 17 | {{ Router.gen_permalink_by_content(post) }} 18 | {{ post.get_meta('date').format('YYYY-MM-DD') }} 19 | always 20 | 0.5 21 | 22 | {% endfor %} 23 | -------------------------------------------------------------------------------- /templates/tags.html: -------------------------------------------------------------------------------- 1 | {% extends "includes/skeleton_archive.html" %} 2 | 3 | {% macro seo_title() %}{{ tr('Tag') }}: {{ tag_name }} - {{ fp(config.site_name) }}{% endmacro %} 4 | {% block title %}{{ seo_title() }}{% endblock title %} 5 | {% block og_title %}{{ seo_title() }}{% endblock %} 6 | {% block og_description %}{{ seo_title() }}{% endblock %} 7 | {% block og_url %}{{ Router.gen_permalink('tag', tag_name, current_page) }}{% endblock %} 8 | {% block twitter_title %}{{ seo_title() }}{% endblock %} 9 | 10 | {% block more_section %} 11 | 12 |
13 |
    14 | {% for content in content_list %} 15 |
  • 16 |

    {{ content.meta['title'] }}

    17 | 20 |
  • 21 | {% endfor %} 22 |
23 |
24 | 25 |
26 | {% if current_page > 1 %} 27 | Prev 28 | {% endif %} 29 | Page {{ current_page }} of {{ max_pages }} 30 | {% if current_page < max_pages %} 31 | Next 32 | {% endif %} 33 |
34 | 35 | {% endblock more_section %} -------------------------------------------------------------------------------- /utils.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """Utils for Galileo 3 | """ 4 | 5 | import os 6 | import json 7 | from Maverick.Config import g_conf 8 | from Maverick.Utils import unify_joinpath, safe_read, filterPlaceholders 9 | 10 | translation = None 11 | 12 | 13 | def tr(str, locale="english"): 14 | """translation support 15 | 16 | translate str according to translation file 17 | """ 18 | global translation 19 | if translation is None: 20 | path = unify_joinpath(os.path.dirname( 21 | __file__) + '/locale', g_conf.language+".json") 22 | translation = json.loads(safe_read(path) or '{}') 23 | 24 | return translation.get(str, str) 25 | 26 | 27 | def build_links(links): 28 | fp = filterPlaceholders 29 | str = '·'.join(['
  • %s
  • ' 30 | % (fp(item['name']), fp(item['url']), fp(item['icon']), fp(item['name'])) for item in links]) 31 | return '
      %s
    ' % str 32 | 33 | 34 | def build_navs(navs): 35 | fp = filterPlaceholders 36 | list = ['
  • %s
  • ' 37 | % (fp(item['url']), fp(item['target']), fp(item['name'])) for item in navs] 38 | list.append( 39 | '
  • %s
  • ' % tr('Search')) 40 | return '
      %s
    ' % ('·'.join(list)) 41 | 42 | 43 | def filterPrefix(url: str): 44 | """replace prefix with `/`, to fix Valine view counting 45 | """ 46 | return url.replace(g_conf.site_prefix, "/") 47 | --------------------------------------------------------------------------------