diff --git a/themes/archie-zola/.gitignore b/themes/archie-zola/.gitignore
new file mode 100644
index 0000000..697e5de
--- /dev/null
+++ b/themes/archie-zola/.gitignore
@@ -0,0 +1,3 @@
+public/
+.vscode/
+.DS_Store
\ No newline at end of file
diff --git a/themes/archie-zola/CODE_OF_CONDUCT.md b/themes/archie-zola/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..e048552
--- /dev/null
+++ b/themes/archie-zola/CODE_OF_CONDUCT.md
@@ -0,0 +1,128 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+We as members, contributors, and leaders pledge to make participation in our
+community a harassment-free experience for everyone, regardless of age, body
+size, visible or invisible disability, ethnicity, sex characteristics, gender
+identity and expression, level of experience, education, socio-economic status,
+nationality, personal appearance, race, religion, or sexual identity
+and orientation.
+
+We pledge to act and interact in ways that contribute to an open, welcoming,
+diverse, inclusive, and healthy community.
+
+## Our Standards
+
+Examples of behavior that contributes to a positive environment for our
+community include:
+
+* Demonstrating empathy and kindness toward other people
+* Being respectful of differing opinions, viewpoints, and experiences
+* Giving and gracefully accepting constructive feedback
+* Accepting responsibility and apologizing to those affected by our mistakes,
+ and learning from the experience
+* Focusing on what is best not just for us as individuals, but for the
+ overall community
+
+Examples of unacceptable behavior include:
+
+* The use of sexualized language or imagery, and sexual attention or
+ advances of any kind
+* Trolling, insulting or derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or email
+ address, without their explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Enforcement Responsibilities
+
+Community leaders are responsible for clarifying and enforcing our standards of
+acceptable behavior and will take appropriate and fair corrective action in
+response to any behavior that they deem inappropriate, threatening, offensive,
+or harmful.
+
+Community leaders have the right and responsibility to remove, edit, or reject
+comments, commits, code, wiki edits, issues, and other contributions that are
+not aligned to this Code of Conduct, and will communicate reasons for moderation
+decisions when appropriate.
+
+## Scope
+
+This Code of Conduct applies within all community spaces, and also applies when
+an individual is officially representing the community in public spaces.
+Examples of representing our community include using an official e-mail address,
+posting via an official social media account, or acting as an appointed
+representative at an online or offline event.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported to the community leaders responsible for enforcement at
+xxkeith@outlook.com.
+All complaints will be reviewed and investigated promptly and fairly.
+
+All community leaders are obligated to respect the privacy and security of the
+reporter of any incident.
+
+## Enforcement Guidelines
+
+Community leaders will follow these Community Impact Guidelines in determining
+the consequences for any action they deem in violation of this Code of Conduct:
+
+### 1. Correction
+
+**Community Impact**: Use of inappropriate language or other behavior deemed
+unprofessional or unwelcome in the community.
+
+**Consequence**: A private, written warning from community leaders, providing
+clarity around the nature of the violation and an explanation of why the
+behavior was inappropriate. A public apology may be requested.
+
+### 2. Warning
+
+**Community Impact**: A violation through a single incident or series
+of actions.
+
+**Consequence**: A warning with consequences for continued behavior. No
+interaction with the people involved, including unsolicited interaction with
+those enforcing the Code of Conduct, for a specified period of time. This
+includes avoiding interactions in community spaces as well as external channels
+like social media. Violating these terms may lead to a temporary or
+permanent ban.
+
+### 3. Temporary Ban
+
+**Community Impact**: A serious violation of community standards, including
+sustained inappropriate behavior.
+
+**Consequence**: A temporary ban from any sort of interaction or public
+communication with the community for a specified period of time. No public or
+private interaction with the people involved, including unsolicited interaction
+with those enforcing the Code of Conduct, is allowed during this period.
+Violating these terms may lead to a permanent ban.
+
+### 4. Permanent Ban
+
+**Community Impact**: Demonstrating a pattern of violation of community
+standards, including sustained inappropriate behavior, harassment of an
+individual, or aggression toward or disparagement of classes of individuals.
+
+**Consequence**: A permanent ban from any sort of public interaction within
+the community.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage],
+version 2.0, available at
+https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
+
+Community Impact Guidelines were inspired by [Mozilla's code of conduct
+enforcement ladder](https://github.com/mozilla/diversity).
+
+[homepage]: https://www.contributor-covenant.org
+
+For answers to common questions about this code of conduct, see the FAQ at
+https://www.contributor-covenant.org/faq. Translations are available at
+https://www.contributor-covenant.org/translations.
diff --git a/themes/archie-zola/LICENSE b/themes/archie-zola/LICENSE
new file mode 100644
index 0000000..02da9cc
--- /dev/null
+++ b/themes/archie-zola/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2022 Keith
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/themes/archie-zola/README.md b/themes/archie-zola/README.md
new file mode 100644
index 0000000..2e70cbd
--- /dev/null
+++ b/themes/archie-zola/README.md
@@ -0,0 +1,228 @@
+# archie-zola
+
+A zola theme forked from [https://github.com/athul/archie](https://github.com/athul/archie)
+
+## Demo
+
+The Main branch source code hosted on [https://archie-zola.netlify.app](https://archie-zola.netlify.app)
+
+### ScreenShot
+
+
+
+
+
+## Installation
+
+First download this theme to your themes directory:
+
+```bash
+cd themes
+git clone https://github.com/XXXMrG/archie-zola.git
+```
+
+or add as a git submodule:
+
+```bash
+git submodule add https://github.com/XXXMrG/archie-zola.git themes/archie-zola
+```
+
+and then enable it in your config.toml:
+
+```toml
+theme = "archie-zola"
+```
+
+## Update
+
+If this is the first time you've checked out a repository containing this submodule, you need to initialize the submodules:
+
+```bash
+git submodule update --init
+```
+
+If your project contains multiple submodules, this command initializes all of them.
+
+Then, update all submodule:
+
+```bash
+git submodule update --remote
+```
+
+Finally, check your commit and push it.
+
+## Feature
+
+- Pagination
+- Tags
+- Auto Dark Mode(based on system theme)
+- Dark/Light Mode toggle
+- Google Analytics Script
+- Meta Tags For Individual Pages
+- Support Latex.
+
+in the planning stage:
+
+- [ ] Custom CSS & JS
+- [ ] Twitter Cards & Youtube video
+
+## Config
+
+### Customize ` ` tags
+
+The following TOML and YAML code will yiled two ` ` tags, ` `, ` `.
+
+TOML:
+
+```toml
+title = "post title"
+description = "post desc"
+date = "2023-01-01"
+
+[extra]
+meta = [
+ {property = "og:title", content = "the og title"},
+ {property = "og:description", content = "the og description"},
+]
+```
+
+YAML:
+
+```yaml
+title: "post title"
+description: "post desc"
+date: "2023-01-01"
+extra:
+ meta:
+ - property: "og:title"
+ content: "the og title"
+ - property: "og:description"
+ content: "the og description"
+```
+
+If the `og:title`, the `og:description`, or the "description" are not set, the page's title and description will be used. That is, the following TOML code generates ` `, ` `, and ` ` as default values.
+
+```toml
+title = "post title"
+description = "post desc"
+date = "2023-01-01"
+```
+
+### Theme config
+
+Cause Zola limited custom config must under the `extra` field, so there are some different with the origin theme:
+
+Demo website config.toml:
+
+```toml
+# control dark mode: auto | dark | toggle
+mode = "toggle"
+
+# subtitle will show under the title in index page
+subtitle = "A zola theme forked from [archie](https://github.com/athul/archie)"
+
+# if set true, will use external CDN resource to load font and js file
+useCDN = false
+
+favicon = "/icon/favicon.png"
+
+# show in the footer
+copyright = "keith"
+
+# config your Google Analysis ID
+ga = "XXXX-XXXXX"
+
+# optional: config your i18n entry
+[extra.translations]
+languages = [{name = "en", url = "/"}]
+
+# config multi-language menu and other text
+[[extra.translations.en]]
+show_more = "Read more ⟶"
+previous_page = "← Previous"
+next_page = "Next →"
+posted_on = "on "
+posted_by = "Published by"
+read_time = "minute read"
+all_tags = "All tags"
+menus = [
+ { name = "Home", url = "/", weight = 2 },
+ { name = "All posts", url = "/posts", weight = 2 },
+ { name = "About", url = "/about", weight = 3 },
+ { name = "Tags", url = "/tags", weight = 4 },
+]
+
+# config social icon info in the footer
+[[extra.social]]
+icon = "github"
+name = "GitHub"
+url = "https://github.com/XXXMrG/archie-zola"
+
+[[extra.social]]
+icon = "twitter"
+name = "Twitter"
+url = "https://github.com/your-name/"
+
+[[extra.social]]
+icon = "gitlab"
+name = "GitLab"
+url = "https://gitlab.com/your-name/"
+
+```
+
+### Latex math formula support
+
+This theme support latex math formula, by using [KaTeX](https://katex.org/).
+
+You can enable it by add `katex_enable = true` in the `extra` section of config.toml:
+
+```toml
+[extra]
+katex_enable = true
+```
+
+After that, you can use latex math formula in your markdown file:
+
+```
+$$
+{x: \mathbf{Num},\ y: \mathbf{Num} \over x + y : \mathbf{Num} }\ (\text{N-Add})
+$$
+```
+
+You can also use inline and block-style:
+
+```
+1. \\( \KaTeX \\) inline
+2. \\[ \KaTeX \\]
+3. $$ \KaTeX $$
+```
+
+### Content config
+
+**In content/posts/\_index.md. I use Zola config: transparent = true to implement the pagination**
+
+In Zola, you can use config in the \_index.md to control pagination and sort post list:
+
+```toml
+paginate_by = 3
+sort_by = "date"
+
+[taxonomies]
+tags = ["FE", "Rust"]
+
+[extra]
+author = { name = "XXXMRG", social= "https://github.com/XXXMrG" }
+```
+
+## Extension
+
+Follow this [doc](https://www.getzola.org/documentation/themes/extending-a-theme/) to extend theme.
+
+## Contributing
+
+Thank you very much for considering contributing to this project!
+
+We appreciate any form of contribution:
+
+- New issues (feature requests, bug reports, questions, ideas, ...)
+- Pull requests (documentation improvements, code improvements, new features, ...)
diff --git a/themes/archie-zola/config.toml b/themes/archie-zola/config.toml
new file mode 100644
index 0000000..e1b775f
--- /dev/null
+++ b/themes/archie-zola/config.toml
@@ -0,0 +1,74 @@
+# The URL the site will be built for
+base_url = "//archie-zola.netlify.app/"
+
+# The site title and description; used in feeds by default.
+title = "archie-zola"
+description = "A zola theme forked from [archie](https://github.com/athul/archie)"
+
+# Whether to automatically compile all Sass files in the sass directory
+compile_sass = true
+
+# Whether to build a search index to be used later on by a JavaScript library
+build_search_index = false
+
+taxonomies = [{ name = "tags" }]
+
+default_language = "en"
+
+[markdown]
+# Whether to do syntax highlighting
+# Theme can be customised by setting the `highlight_theme` variable to a theme supported by Zola
+highlight_code = true
+
+highlight_theme = "OneHalfLight"
+
+[extra]
+
+# control dark mode: auto | dark | toggle
+mode = "toggle"
+
+# interal CDN resource
+useCDN = false
+
+favicon = "/icon/favicon.png"
+
+copyright = "keith"
+
+ga = "G-6YGDB8SLBT"
+
+katex_enable = true
+
+
+[extra.translations]
+languages = [{name = "en", url = "/"}]
+
+[[extra.translations.en]]
+show_more = "Read more ⟶"
+previous_page = "← Previous"
+next_page = "Next →"
+posted_on = "on "
+posted_by = "Published by"
+read_time = "minute read"
+all_tags = "All tags"
+menus = [
+ { name = "Home", url = "/", weight = 2 },
+ { name = "All posts", url = "/posts", weight = 2 },
+ { name = "About", url = "/about", weight = 3 },
+ { name = "Tags", url = "/tags", weight = 4 },
+]
+
+# config social icon info in the footer
+[[extra.social]]
+icon = "github"
+name = "GitHub"
+url = "https://github.com/XXXMrG/archie-zola"
+
+[[extra.social]]
+icon = "twitter"
+name = "Twitter"
+url = "https://github.com/XXXMrG/"
+
+[[extra.social]]
+icon = "gitlab"
+name = "GitLab"
+url = "https://gitlab.com/your-name/"
diff --git a/themes/archie-zola/content/_index.md b/themes/archie-zola/content/_index.md
new file mode 100644
index 0000000..c5ce724
--- /dev/null
+++ b/themes/archie-zola/content/_index.md
@@ -0,0 +1,5 @@
++++
+paginate_by = 3
+sort_by = "date"
++++
+
diff --git a/themes/archie-zola/content/custom/about.md b/themes/archie-zola/content/custom/about.md
new file mode 100644
index 0000000..dcb7836
--- /dev/null
+++ b/themes/archie-zola/content/custom/about.md
@@ -0,0 +1,17 @@
++++
+title = "About"
+date = "2022-05-12"
+path = "about"
++++
+
+## Zola at a Glance
+
+Zola is a static site generator (SSG), similar to [Hugo](https://gohugo.io/), [Pelican](https://blog.getpelican.com/), and [Jekyll](https://jekyllrb.com/) (for a comprehensive list of SSGs, please see [Jamstack](https://jamstack.org/generators)). It is written in [Rust](https://www.rust-lang.org/) and uses the [Tera](https://tera.netlify.com/) template engine, which is similar to [Jinja2](https://jinja.palletsprojects.com/en/2.10.x/), [Django templates](https://docs.djangoproject.com/en/2.2/topics/templates/), [Liquid](https://shopify.github.io/liquid/), and [Twig](https://twig.symfony.com/). Content is written in [CommonMark](https://commonmark.org/), a strongly defined, highly compatible specification of [Markdown](https://www.markdownguide.org/).
+
+SSGs use dynamic templates to transform content into static HTML pages. Static sites are thus very fast and require no databases, making them easy to host. A comparison between static and dynamic sites, such as WordPress, Drupal, and Django, can be found [here](https://dev.to/ashenmaster/static-vs-dynamic-sites-61f).
+
+To get a taste of Zola, please see the quick overview below.
+
+## First Steps with Zola
+
+Unlike some SSGs, Zola makes no assumptions regarding the structure of your site. In this overview, we'll be making a simple blog site.
\ No newline at end of file
diff --git a/themes/archie-zola/content/posts/_index.md b/themes/archie-zola/content/posts/_index.md
new file mode 100644
index 0000000..a1a4ccf
--- /dev/null
+++ b/themes/archie-zola/content/posts/_index.md
@@ -0,0 +1,6 @@
++++
+path = "posts"
+template = "posts.html"
+transparent = true
+sort_by = "date"
++++
\ No newline at end of file
diff --git a/themes/archie-zola/content/posts/cn-post.md b/themes/archie-zola/content/posts/cn-post.md
new file mode 100644
index 0000000..e70b5e4
--- /dev/null
+++ b/themes/archie-zola/content/posts/cn-post.md
@@ -0,0 +1,186 @@
++++
+title = "中文内容"
+date = "2022-05-12"
+description = "中文内容排版演示,这里是文章的描述信息"
+
+[taxonomies]
+tags = ["CN", "showcase"]
++++
+
+> [《故乡》](https://baike.baidu.com/item/%E6%95%85%E4%B9%A1/2679148) -- 鲁迅
+
+
+
+我冒着严寒,回到相隔二千余里,别了二十余年的故乡去。
+
+时候既然是深冬;渐近故乡时,天气又阴晦了,冷风吹进船舱中,呜呜的响,从篷隙向外一望,苍黄的天底下,远近横着几个萧索的荒村,没有一些活气。我的心禁不住悲凉起来了。
+
+阿!这不是我二十年来时时记得的故乡?
+
+我所记得的故乡全不如此。我的故乡好得多了。但要我记起他的美丽,说出他的佳处来,却又没有影像,没有言辞了。仿佛也就如此。于是我自己解释说:故乡本也如此,——虽然没有进步,也未必有如我所感的悲凉,这只是我自己心情的改变罢了,因为我这次回乡,本没有什么好心绪。
+
+我这次是专为了别他而来的。我们多年聚族而居的老屋,已经公同卖给别姓了,交屋的期限,只在本年,所以必须赶在正月初一以前,永别了熟识的老屋,而且远离了熟识的故乡,搬家到我在谋食的异地去。
+
+第二日清早晨我到了我家的门口了。瓦楞上许多枯草的断茎当风抖着,正在说明这老屋难免易主的原因。几房的本家大约已经搬走了,所以很寂静。我到了自家的房外,我的母亲早已迎着出来了,接着便飞出了八岁的侄儿宏儿。
+
+我的母亲很高兴,但也藏着许多凄凉的神情,教我坐下,歇息,喝茶,且不谈搬家的事。宏儿没有见过我,远远的对面站着只是看。
+
+但我们终于谈到搬家的事。我说外间的寓所已经租定了,又买了几件家具,此外须将家里所有的木器卖去,再去增添。母亲也说好,而且行李也略已齐集,木器不便搬运的,也小半卖去了,只是收不起钱来。
+
+“你休息一两天,去拜望亲戚本家一回,我们便可以走了。”母亲说。
+
+“是的。”
+
+“还有闰土,他每到我家来时,总问起你,很想见你一回面。我已经将你到家的大约日期通知他,他也许就要来了。”
+
+这时候,我的脑里忽然闪出一幅神异的图画来:深蓝的天空中挂着一轮金黄的圆月,下面是海边的沙地,都种着一望无际的碧绿的西瓜,其间有一个十一二岁的少年,项带银圈,手捏一柄钢叉,向一匹猹尽力的刺去,那猹却将身一扭,反从他的胯下逃走了。
+
+这少年便是闰土。我认识他时,也不过十多岁,离现在将有三十年了;那时我的父亲还在世,家景也好,我正是一个少爷。那一年,我家是一件大祭祀的值年。这祭祀,说是三十多年才能轮到一回,所以很郑重;正月里供祖像,供品很多,祭器很讲究,拜的人也很多,祭器也很要防偷去。我家只有一个忙月(我们这里给人做工的分三种:整年给一定人家做工的叫长工;按日给人做工的叫短工;自己也种地,只在过年过节以及收租时候来给一定人家做工的称忙月),忙不过来,他便对父亲说,可以叫他的儿子闰土来管祭器的。
+
+我的父亲允许了;我也很高兴,因为我早听到闰土这名字,而且知道他和我仿佛年纪,闰月生的,五行缺土,所以他的父亲叫他闰土。他是能装弶捉小鸟雀的。
+
+我于是日日盼望新年,新年到,闰土也就到了。好容易到了年末,有一日,母亲告诉我,闰土来了,我便飞跑的去看。他正在厨房里,紫色的圆脸,头戴一顶小毡帽,颈上套一个明晃晃的银项圈,这可见他的父亲十分爱他,怕他死去,所以在神佛面前许下愿心,用圈子将他套住了。他见人很怕羞,只是不怕我,没有旁人的时候,便和我说话,于是不到半日,我们便熟识了。
+
+我们那时候不知道谈些什么,只记得闰土很高兴,说是上城之后,见了许多没有见过的东西。
+
+第二日,我便要他捕鸟。他说:
+“这不能。须大雪下了才好。我们沙地上,下了雪,我扫出一块空地来,用短棒支起一个大竹匾,撒下秕谷,看鸟雀来吃时,我远远地将缚在棒上的绳子只一拉,那鸟雀就罩在竹匾下了。什么都有:稻鸡,角鸡,鹁鸪,蓝背……”
+
+我于是又很盼望下雪。
+
+闰土又对我说:
+
+“现在太冷,你夏天到我们这里来。我们日里到海边检贝壳去,红的绿的都有,鬼见怕也有,观音手也有。晚上我和爹管西瓜去,你也去。”
+
+“管贼吗?”
+
+“不是。走路的人口渴了摘一个瓜吃,我们这里是不算偷的。要管的是獾猪,刺猬,猹。月亮底下,你听,啦啦的响了,猹在咬瓜了。你便捏了胡叉,轻轻地走去……”
+
+我那时并不知道这所谓猹的是怎么一件东西——便是现在也没有知道——只是无端的觉得状如小狗而很凶猛。
+
+“他不咬人么?”
+
+“有胡叉呢。走到了,看见猹了,你便刺。这畜生很伶俐,倒向你奔来,反从胯下窜了。他的皮毛是油一般的滑……”
+
+我素不知道天下有这许多新鲜事:海边有如许五色的贝壳;西瓜有这样危险的经历,我先前单知道他在水果店里出卖罢了。
+
+“我们沙地里,潮汛要来的时候,就有许多跳鱼儿只是跳,都有青蛙似的两个脚……”
+
+阿!闰土的心里有无穷无尽的希奇的事,都是我往常的朋友所不知道的。他们不知道一些事,闰土在海边时,他们都和我一样只看见院子里高墙上的四角的天空。
+
+可惜正月过去了,闰土须回家里去,我急得大哭,他也躲到厨房里,哭着不肯出门,但终于被他父亲带走了。他后来还托他的父亲带给我一包贝壳和几支很好看的鸟毛,我也曾送他一两次东西,但从此没有再见面。
+
+现在我的母亲提起了他,我这儿时的记忆,忽而全都闪电似的苏生过来,似乎看到了我的美丽的故乡了。我应声说:
+
+“这好极!他,——怎样?……”
+
+“他?……他景况也很不如意……"母亲说着,便向房外看,"这些人又来了。说是买木器,顺手也就随便拿走的,我得去看看。”
+
+母亲站起身,出去了。门外有几个女人的声音。我便招宏儿走近面前,和他闲话:问他可会写字,可愿意出门。
+
+“我们坐火车去么?”
+
+“我们坐火车去。”
+
+“船呢?”
+
+“先坐船,……”
+
+“哈!这模样了!胡子这么长了!”一种尖利的怪声突然大叫起来。
+
+我吃了一吓,赶忙抬起头,却见一个凸颧骨,薄嘴唇,五十岁上下的女人站在我面前,两手搭在髀间,没有系裙,张着两脚,正像一个画图仪器里细脚伶仃的圆规。
+我愕然了。
+
+“不认识了么?我还抱过你咧!”
+
+我愈加愕然了。幸而我的母亲也就进来,从旁说:
+
+“他多年出门,统忘却了。你该记得罢,”便向着我说,“这是斜对门的杨二嫂,……开豆腐店的。”
+
+哦,我记得了。我孩子时候,在斜对门的豆腐店里确乎终日坐着一个杨二嫂,人都叫伊“豆腐西施”。但是擦着白粉,颧骨没有这么高,嘴唇也没有这么薄,而且终日坐着,我也从没有见过这圆规式的姿势。那时人说:因为伊,这豆腐店的买卖非常好。但这大约因为年龄的关系,我却并未蒙着一毫感化,所以竟完全忘却了。然而圆规很不平,显出鄙夷的神色,仿佛嗤笑法国人不知道拿破仑,美国人不知道华盛顿似的,冷笑说:
+
+“忘了?这真是贵人眼高……”
+
+“那有这事……我……”我惶恐着,站起来说。
+
+“那么,我对你说。迅哥儿,你阔了,搬动又笨重,你还要什么这些破烂木器,让我拿去罢。我们小户人家,用得着。”
+
+“我并没有阔哩。我须卖了这些,再去……”
+
+“阿呀呀,你放了道台了,还说不阔?你现在有三房姨太太;出门便是八抬的大轿,还说不阔?吓,什么都瞒不过我。”
+
+我知道无话可说了,便闭了口,默默的站着。
+
+“阿呀阿呀,真是愈有钱,便愈是一毫不肯放松,愈是一毫不肯放松,便愈有钱……”圆规一面愤愤的回转身,一面絮絮的说,慢慢向外走,顺便将我母亲的一副手套塞在裤腰里,出去了。
+
+此后又有近处的本家和亲戚来访问我。我一面应酬,偷空便收拾些行李,这样的过了三四天。
+
+一日是天气很冷的午后,我吃过午饭,坐着喝茶,觉得外面有人进来了,便回头去看。我看时,不由的非常出惊,慌忙站起身,迎着走去。
+
+这来的便是闰土。虽然我一见便知道是闰土,但又不是我这记忆上的闰土了。他身材增加了一倍;先前的紫色的圆脸,已经变作灰黄,而且加上了很深的皱纹;眼睛也像他父亲一样,周围都肿得通红,这我知道,在海边种地的人,终日吹着海风,大抵是这样的。他头上是一顶破毡帽,身上只一件极薄的棉衣,浑身瑟索着;手里提着一个纸包和一支长烟管,那手也不是我所记得的红活圆实的手,却又粗又笨而且开裂,像是松树皮了。
+
+我这时很兴奋,但不知道怎么说才好,只是说:
+
+“阿!闰土哥,——你来了?……”
+
+我接着便有许多话,想要连珠一般涌出:角鸡,跳鱼儿,贝壳,猹,……但又总觉得被什么挡着似的,单在脑里面回旋,吐不出口外去。
+
+他站住了,脸上现出欢喜和凄凉的神情;动着嘴唇,却没有作声。他的态度终于恭敬起来了,分明的叫道:
+
+“老爷!……”
+
+我似乎打了一个寒噤;我就知道,我们之间已经隔了一层可悲的厚障壁了。我也说不出话。
+
+他回过头去说,“水生,给老爷磕头。”便拖出躲在背后的孩子来,这正是一个廿年前的闰土,只是黄瘦些,颈子上没有银圈罢了。“这是第五个孩子,没有见过世面,躲躲闪闪……”
+
+母亲和宏儿下楼来了,他们大约也听到了声音。
+
+“老太太。信是早收到了。我实在喜欢的不得了,知道老爷回来……”闰土说。
+
+“阿,你怎的这样客气起来。你们先前不是哥弟称呼么?还是照旧:迅哥儿。”母亲高兴的说。
+
+“阿呀,老太太真是……这成什么规矩。那时是孩子,不懂事……”闰土说着,又叫水生上来打拱,那孩子却害羞,紧紧的只贴在他背后。
+
+“他就是水生?第五个?都是生人,怕生也难怪的;还是宏儿和他去走走。”母亲说。
+
+宏儿听得这话,便来招水生,水生却松松爽爽同他一路出去了。母亲叫闰土坐,他迟疑了一回,终于就了坐,将长烟管靠在桌旁,递过纸包来,说:
+
+“冬天没有什么东西了。这一点干青豆倒是自家晒在那里的,请老爷……”
+
+我问问他的景况。他只是摇头。
+
+“非常难。第六个孩子也会帮忙了,却总是吃不够……又不太平……什么地方都要钱,没有规定……收成又坏。种出东西来,挑去卖,总要捐几回钱,折了本;不去卖,又只能烂掉……”
+他只是摇头;脸上虽然刻着许多皱纹,却全然不动,仿佛石像一般。他大约只是觉得苦,却又形容不出,沉默了片时,便拿起烟管来默默的吸烟了。
+
+母亲问他,知道他的家里事务忙,明天便得回去;又没有吃过午饭,便叫他自己到厨下炒饭吃去。
+
+他出去了;母亲和我都叹息他的景况:多子,饥荒,苛税,兵,匪,官,绅,都苦得他像一个木偶人了。母亲对我说,凡是不必搬走的东西,尽可以送他,可以听他自己去拣择。
+下午,他拣好了几件东西:两条长桌,四个椅子,一副香炉和烛台,一杆抬秤。他又要所有的草灰(我们这里煮饭是烧稻草的,那灰,可以做沙地的肥料),待我们启程的时候,他用船来载去。
+
+夜间,我们又谈些闲天,都是无关紧要的话;第二天早晨,他就领了水生回去了。
+
+又过了九日,是我们启程的日期。闰土早晨便到了,水生没有同来,却只带着一个五岁的女儿管船只。我们终日很忙碌,再没有谈天的工夫。来客也不少,有送行的,有拿东西的,有送行兼拿东西的。待到傍晚我们上船的时候,这老屋里的所有破旧大小粗细东西,已经一扫而空了。
+
+我们的船向前走,两岸的青山在黄昏中,都装成了深黛颜色,连着退向船后梢去。
+
+宏儿和我靠着船窗,同看外面模糊的风景,他忽然问道:
+
+“大伯!我们什么时候回来?”
+
+“回来?你怎么还没有走就想回来了。”
+
+“可是,水生约我到他家玩去咧……”他睁着大的黑眼睛,痴痴的想。
+
+我和母亲也都有些惘然,于是又提起闰土来。母亲说,那豆腐西施的杨二嫂,自从我家收拾行李以来,本是每日必到的,前天伊在灰堆里,掏出十多个碗碟来,议论之后,便定说是闰土埋着的,他可以在运灰的时候,一齐搬回家里去;杨二嫂发见了这件事,自己很以为功,便拿了那狗气杀(这是我们这里养鸡的器具,木盘上面有着栅栏,内盛食料,鸡可以伸进颈子去啄,狗却不能,只能看着气死),飞也似的跑了,亏伊装着这么高底的小脚,竟跑得这样快。
+
+老屋离我愈远了;故乡的山水也都渐渐远离了我,但我却并不感到怎样的留恋。我只觉得我四面有看不见的高墙,将我隔成孤身,使我非常气闷;那西瓜地上的银项圈的小英雄的影像,我本来十分清楚,现在却忽地模糊了,又使我非常的悲哀。
+
+母亲和宏儿都睡着了。
+
+我躺着,听船底潺潺的水声,知道我在走我的路。我想:我竟与闰土隔绝到这地步了,但我们的后辈还是一气,宏儿不是正在想念水生么。我希望他们不再像我,又大家隔膜起来……然而我又不愿意他们因为要一气,都如我的辛苦展转而生活,也不愿意他们都如闰土的辛苦麻木而生活,也不愿意都如别人的辛苦恣睢而生活。他们应该有新的生活,为我们所未经生活过的。
+
+我想到希望,忽然害怕起来了。闰土要香炉和烛台的时候,我还暗地里笑他,以为他总是崇拜偶像,什么时候都不忘却。现在我所谓希望,不也是我自己手制的偶像么?只是他的愿望切近,我的愿望茫远罢了。
+
+我在朦胧中,眼前展开一片海边碧绿的沙地来,上面深蓝的天空中挂着一轮金黄的圆月。我想:希望是本无所谓有,无所谓无的。这正如地上的路;其实地上本没有路,走的人多了,也便成了路。
+
+一九二一年一月。
\ No newline at end of file
diff --git a/themes/archie-zola/content/posts/hello-archie.md b/themes/archie-zola/content/posts/hello-archie.md
new file mode 100644
index 0000000..a8b78db
--- /dev/null
+++ b/themes/archie-zola/content/posts/hello-archie.md
@@ -0,0 +1,184 @@
++++
+title = "Hello archie"
+date = "2022-05-14"
+description = "See how to config your archie theme"
+
+[taxonomies]
+tags = ["showcase"]
+
+[extra]
+author = { name = "XXXMRG", social= "https://github.com/XXXMrG" }
++++
+
+## Demo
+
+---
+
+The Main branch source code hosted on
+
+### ScreenShot
+
+
+
+
+
+## Installation
+
+---
+
+First download this theme to your themes directory:
+
+```bash
+cd themes
+git clone https://github.com/XXXMrG/archie-zola.git
+```
+
+or add as a git submodule:
+
+```bash
+git submodule add https://github.com/XXXMrG/archie-zola.git themes/archie-zola
+```
+
+and then enable it in your config.toml:
+
+```toml
+theme = "archie-zola"
+```
+
+## Feature
+
+---
+
+- Pagination
+- Tags
+- Auto Dark Mode(based on system theme)
+- Dark/Light Mode toggle
+
+in the planning stage:
+
+- [ ] Google Analytics Script
+- [ ] Custom CSS & JS
+- [ ] Twitter Cards & Youtube video
+
+## Config
+
+---
+
+### Theme config
+
+Cause Zola limited custom config must under the `extra` field, so there are some different with the origin theme:
+
+Demo website config.toml:
+
+```toml
+# control dark mode: auto | dark | toggle
+mode = "toggle"
+
+# subtitle will show under the title in index page
+subtitle = "A zola theme forked from [archie](https://github.com/athul/archie)"
+
+# if set true, will use external CDN resource to load font and js file
+useCDN = false
+
+favicon = "/icon/favicon.png"
+
+# show in the footer
+copyright = "keith"
+
+# config your Google Analysis ID
+ga = "XXXX-XXXXX"
+
+# optional: config your i18n entry
+[extra.translations]
+languages = [{name = "en", url = "/"}]
+
+# config multi-language menu and other text
+[[extra.translations.en]]
+show_more = "Read more ⟶"
+previous_page = "← Previous"
+next_page = "Next →"
+posted_on = "on "
+posted_by = "Published by"
+read_time = "minute read"
+all_tags = "All tags"
+menus = [
+ { name = "Home", url = "/", weight = 2 },
+ { name = "All posts", url = "/posts", weight = 2 },
+ { name = "About", url = "/about", weight = 3 },
+ { name = "Tags", url = "/tags", weight = 4 },
+]
+
+# config social icon info in the footer
+[[extra.social]]
+icon = "github"
+name = "GitHub"
+url = "https://github.com/XXXMrG/archie-zola"
+
+[[extra.social]]
+icon = "twitter"
+name = "Twitter"
+url = "https://github.com/your-name/"
+
+[[extra.social]]
+icon = "gitlab"
+name = "GitLab"
+url = "https://gitlab.com/your-name/"
+
+```
+
+### Latex math formula support
+
+This theme support latex math formula, by using [KaTeX](https://katex.org/).
+
+You can enable it by add `katex_enable = true` in the `extra` section of config.toml:
+
+```toml
+[extra]
+katex_enable = true
+```
+
+After that, you can use latex math formula in your markdown file:
+
+$$
+{x: \mathbf{Num},\ y: \mathbf{Num} \over x + y : \mathbf{Num} }\ (\text{N-Add})
+$$
+
+You can also use inline and block-style:
+
+1. \\( \KaTeX \\) inline
+2. \\[ \KaTeX \\]
+3. $$ \KaTeX $$
+
+### Content config
+
+**In content/posts/\_index.md. I use Zola config: transparent = true to implement the pagination**
+
+In Zola, you can use config in the \_index.md to control pagination and sort post list:
+
+```toml
+paginate_by = 3
+sort_by = "date"
+
+[taxonomies]
+tags = ["FE", "Rust"]
+
+[extra]
+author = { name = "XXXMRG", social= "https://github.com/XXXMrG" }
+```
+
+## Extension
+
+Follow this [doc](https://www.getzola.org/documentation/themes/extending-a-theme/) to extend theme.
+
+## Contributing
+
+---
+
+Thank you very much for considering contributing to this project!
+
+We appreciate any form of contribution:
+
+- New issues (feature requests, bug reports, questions, ideas, ...)
+- Pull requests (documentation improvements, code improvements, new features, ...)[^zolawebsite]
+
+[^zolawebsite]: Website: [zola](https://getzola.org), GitHub: [getzola/zola](https://github.com/getzola/zola)
diff --git a/themes/archie-zola/content/posts/lorem.md b/themes/archie-zola/content/posts/lorem.md
new file mode 100644
index 0000000..6c232f2
--- /dev/null
+++ b/themes/archie-zola/content/posts/lorem.md
@@ -0,0 +1,71 @@
++++
+title = "Lorem ipsum"
+date = "2022-05-13"
+description = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
+
+[taxonomies]
+tags = ["showcase"]
++++
+
+
+## Frigida quod
+
+Lorem markdownum manus Gangesque in [videns](http://nec.org/dum.php)? Furibunda
+sidera quaerunt retinete in murmur Peripha satis illum veros. Spectacula fulva,
+et trementi, sorori, novas deprendere pars. Renovare modo! Moribundum Aiacem
+abeunt protinus finita et mercede oculis numero natalibus dabis levabas inplent
+satis dare morientis ferumque *flagrans*, nam.
+
+> Deus [maiora euntem](http://trepidare.io/haec-vixque) amorem, [praetereunt
+> esse](http://liquitur-et.net/) requiro vivere vicit Lyrcea loca minuunt. Pater
+> viribus mota. Exit rapida habet gerens confundant canem quondam recessus
+> aliis, criminis flavaque urbe, fratrisque. Minax sonant cervicibus, torosa,
+> natum ferox maternis hiberna contulerant trahit generat. Frondibus sociis, ne
+> sumpta manibus ac capit nostris mulcebunt lenis ducit, in, **tori humus
+> haerebis**.
+
+Guttura in dextram tamen ubi pacis sanguine inridet. Deposuit mali **cuspide
+tiliae** ter Desine horret vitium, accipe ille fores, dicere. Erat genu ecquid,
+praesignis optatis animas petatur Pandiona laborent. Relinquit totam. Est manes,
+temptamenta adlevat Sminthea.
+
+```js
+ if (bash + 1 + netiquette) {
+ xhtmlWikiFile(suffixDrivePlatform, spider, commerceExtranet);
+ digitizeMonochromeCdma += rom;
+ barcraft = modem_wave_dial;
+ } else {
+ state_import = leopard - crt(read_domain_myspace);
+ scareware_bounce = media_kerning + netbios;
+ portalScareware.volumeOpengl(vrmlQuicktimeMonochrome);
+ }
+ if (point.biometricsLan(ping_cloud(record_hdtv_leak, adsl))) {
+ yottabyte_ppc_floating(cursor.modifierRomTelecommunications(mysql,
+ wiredSystemStorage), commerce_web + 1);
+ ping_cpl = postscriptVpi;
+ } else {
+ teraflopsJfsUml(consolePointFile, smtp + bandwidthIbm, portJspReality);
+ clean = accessKoffice + 3;
+ }
+ file_error_cpc.touchscreen(syncMemory * backlink + boxPath);
+ hdvParallel = functionAppDevice;
+```
+
+## Per edere manus artem leto tenues corpora
+
+Succinctae quas, mihi munere ut ponar Somnus, huius et adspicio comites viscera
+arcus tolluntur tot. Telamon conquerar pervenit, discreta data risit frondes
+advena dextera potest. Prohibete partes habebit duorum: et tandem muneribus; at?
+
+> Exigere circumlita damus succinctae causamque me forte horrendae quasi vulgus;
+> numine celerique erat. Forte aures increvisse frustra *precantem* lacu
+> Arethusa?
+
+Si est viae *percussit ad* loris velis? Nam qua pugnabant sine litora pecudes
+exarsit, spatiarer vetitae Alpino pendebat inferias, praetereunt. Nais sparsit
+somnos mea Dorylas invidit cupidine urbes, fama nec. Quid nunc, et, o
+sulphureis, poteram urbes: noviens.
+
+Et et naturae summa aere puer est detractare es amores, in solo. Religarat piget
+nomina venientesque deus. Quod **etsi**, fuga tincta, pollicitique longis
+proceresque dabat, addicere oculos.
\ No newline at end of file
diff --git a/themes/archie-zola/content/posts/tauri-intro.md b/themes/archie-zola/content/posts/tauri-intro.md
new file mode 100644
index 0000000..94d8f30
--- /dev/null
+++ b/themes/archie-zola/content/posts/tauri-intro.md
@@ -0,0 +1,268 @@
++++
+title = "浅谈 tauri"
+date = 2022-02-18
+description = "本文旨在介绍 tauri 的相关背景知识、性能及可用性表现、以及一点架构设计思想。"
+
+[taxonomies]
+tags = ["FE", "Rust"]
++++
+
+本文旨在介绍 tauri 的相关背景知识、性能及可用性表现、以及一点架构设计思想。
+
+## 背景
+
+---
+
+[tauri](https://github.com/tauri-apps/tauri) 用于构建跨平台桌面应用,对标的是 [electron](https://github.com/electron/electron),但完全由 rust 开发。
+
+跟随 rust 的生态发展,tauri 在 2021 年的 GitHub star 数增长迅猛。
+
+目前最新的版本为 1.0.0-beta.8,于 2021 年 8 月发布。
+
+
+
+Tauri 的设计思路与 electron 基本完全一致,即「使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序」,最后的应用由 Web APP + Native Backend 组成。
+
+- Web APP 依托于现代前端技术,负责构建在各个平台下,效果基本一致的图形化界面。
+- Native Backend 则负责与操作系统交互,为 Web APP 拓展一些原生的能力。
+
+这种设计要比使用传统的 GUI 库构建桌面应用容易得多,但最后应用的图形界面还是需要运行在浏览器引擎的基础之上。
+
+最早使用这种设计方式的 electron 由于其相当低的上手难度和 Javascript 极其丰富的社区生态,在最近 GitHub 上的 star 数量达到了夸张的 100k;但其为人诟病的最多的一点,就是怎样都无法优化的、颇为庞大的应用体积。
+
+接下来让我们看看 tauri 在应用体积、运行开销、性能等指标上,是怎样做到对 electron 的「碾压般」的提升的。
+
+## 对比
+
+---
+
+> 所有数据来自于 [https://tauri.studio/benchmarks](https://tauri.studio/benchmarks)
+
+**产物体积对比:**
+
+2.74MB / 127.74MB
+
+electron 由于需要打包 chromium 和 V8 runtime,在应用体积方面,tauri 自然是有相当大的优势,更小的应用体积对桌面应用的分发和用户的体验都能带来正向的提升。
+
+
+
+**内存占用对比:**
+
+Tauri 由于使用 rust 作为与系统交互的后端,语言层面上就要更贴近系统级,因此内存开销方面相比 V8 要小很多。
+
+
+**功能以及运行环境对比:**
+
+运行环境方面,tauri 使用 WRY 作为与渲染引擎交互的中间层(具体我们后面会讲到),并且与操作系统交互的后端也完全由 rust 完成;不同于 javascript 生态,tauri 最后的产物中 rust 的部分均会被编译成二进制格式,因此无需包含 runtime,也能大大增加应用逆向解包的成本。
+
+而二者在功能上差异不大,但 tauri 明确表示有支持移动端应用的计划。
+
+
+
+## 架构设计
+
+---
+
+> 参考:[tauri/ARCHITECTURE.md at dev · tauri-apps/tauri · GitHub](https://github.com/tauri-apps/tauri/blob/dev/ARCHITECTURE.md)
+
+### 整体流程
+
+Tauri 的整体架构,自顶向下可以分为三层:
+
+1. tauri-app:整合所有模块,读取项目配置,完成最终 APP 产物的打包;主要负责初始化 Web APP 与底层系统 API 的通信环境,注入全局 API,管理应用更新等。
+2. [WRY](https://github.com/tauri-apps/wry):一个跨平台 Webview 渲染库,会根据各平台选择特定的浏览器引擎启动 Webview,抹平平台差异,暴露统一的上层 API。
+3. [TAO](https://github.com/tauri-apps/tao):跨平台应用窗口管理器,主要用于构建各平台下的应用主窗口。
+
+
+
+Tauri 除了完全使用 rust 开发以外,与 electron 最大的不同之处就在于,没有使用直接为每个应用单独集成一个 chromium 环境,而是直接使用操作系统内置的浏览器引擎执行 Web APP,也就是这里提到的:WRY。
+
+在当前版本的 WRY 中,各平台下的浏览器引擎选取规则如下:
+
+
+
+简单看一下 WRY 在 macOS 下是如何启动一个 webview 的
+
+```rust
+fn main() -> wry::Result<()> {
+ use wry::{
+ application::{
+ event::{Event, StartCause, WindowEvent},
+ event_loop::{ControlFlow, EventLoop},
+ window::WindowBuilder,
+ },
+ webview::WebViewBuilder,
+ };
+
+ // 此处的 event_loop 非 js 的 event loop,而是 tao 用来响应窗口事件的
+ let event_loop = EventLoop::new();
+
+ // 新建一个窗口
+ let window = WindowBuilder::new()
+ .with_title("Hello World")
+ .build(&event_loop)?;
+
+ // 在该窗口启动一个 webview
+ let webview = WebViewBuilder::new(window)?
+ .with_url("https://vhsagj.smartapps.baidu.com/")?
+ .build()?;
+
+ // 启动 event loop
+ event_loop.run(move |event, _, control_flow| {
+ *control_flow = ControlFlow::Wait;
+
+ match event {
+ Event::NewEvents(StartCause::Init) => println!("Wry has started!"),
+ Event::WindowEvent {
+ event: WindowEvent::CloseRequested,
+ ..
+ } => *control_flow = ControlFlow::Exit,
+ _ => {
+ dbg!(webview.window().inner_size());
+ }
+ }
+ });
+}
+```
+
+编译并执行以上 rust 代码,就会启动一个窗口,使用右键点击则可以开启 inspector:
+
+
+
+先不关心窗口管理相关的逻辑,接下来主要关注这几行代码,让我们深入看看 WRY 是怎么启动 webview 的。
+
+```rust
+ // 在该窗口启动一个 webview
+ let webview = WebViewBuilder::new(window)?
+ .with_url("https://vhsagj.smartapps.baidu.com/")?
+ .build()?;
+```
+
+WebViewBuilder 是 WRY 暴露出来的接口,主要进行一些在启动系统 webview 之前的配置封装和初始化工作;在获取到 TAO 的 window 窗口对象后并初始化配置后,会开始调用系统的 API,来启动 webview,在 macOS 上,这通过调用 objc 代码来实现。
+
+Rust 与 objc 运行时的绑定则依赖 [https://crates.io/crates/objc](https://crates.io/crates/objc) 。
+
+上面的代码最后会调用 macOS 系统提供的 webkit 接口来新建一个 WKWebview。具体实现参见: [https://github.com/tauri-apps/wry/blob/dev/src/webview/wkwebview/mod.rs](https://github.com/tauri-apps/wry/blob/dev/src/webview/wkwebview/mod.rs%EF%BC%8C)
+
+这里不再赘述,在各个平台下,WRY 内部的处理逻辑基本与此类似。
+
+综上所述,tauri 整体的设计思路与 electron 不同之处可以总结为以下两点:
+
+1. 舍弃 chromium,直接使用操作系统内置的浏览器引擎,通过 WRY 来抹平浏览器的接口差异,**但前端应用在运行时实际上还是可能会遇到平台兼容性问题。**
+2. 舍弃 node.js 运行时,使用 rust 与操作系统交互。
+
+### 如何通信?
+
+TL;DR
+
+**在 WRY 这一层,会基于各平台 Webview 暴露的 JS 到 Webview native 的接口,使用** [JSON-RPC](https://www.jsonrpc.org/) **作为通信格式,并抹平平台差异。**
+
+Tauri 提供了「指令系统」,用来做 JS 与 rust 的异步通信。
+
+在 macOS 上,JS 到 native 层是基于 [WKScriptMessageHandler](https://developer.apple.com/documentation/webkit/wkscriptmessagehandler) 实现的;WRY 会在创建 Webview 的时候,使用 [addScriptMessageHandler](https://developer.apple.com/documentation/webkit/wkusercontentcontroller/1537172-addscriptmessagehandler?language=objc) 注册一个全局通信函数到 JS context,并传入用于接收消息的函数指针。
+
+```rust
+// Message handler
+ let rpc_handler_ptr = if let Some(rpc_handler) = attributes.rpc_handler {
+ let cls = ClassDecl::new("WebViewDelegate", class!(NSObject));
+ let cls = match cls {
+ Some(mut cls) => {
+ cls.add_ivar::<*mut c_void>("function");
+ cls.add_method(
+ sel!(userContentController:didReceiveScriptMessage:),
+ // did_receive 是一个 extern 函数,在 messageHandlers 接收到 JS 传来的消息时会被调用。
+ did_receive as extern "C" fn(&Object, Sel, id, id),
+ );
+ cls.register()
+ }
+ None => class!(WebViewDelegate),
+ };
+ let handler: id = msg_send![cls, new];
+ let rpc_handler_ptr = Box::into_raw(Box::new((rpc_handler, window.clone())));
+
+ // 这里将 rpc_handler 的指针保存到了一个 objc 对象上的 function 字段上。在 did_receive 时会取出来。
+ (*handler).set_ivar("function", rpc_handler_ptr as *mut _ as *mut c_void);
+ let external = NSString::new("external");
+ // 此处会为 JS context 绑定一个全局函数: window.webkit.messageHandlers..postMessage()
+ let _: () = msg_send![manager, addScriptMessageHandler:handler name:external];
+ rpc_handler_ptr
+ } else {
+ null_mut()
+ };
+```
+
+基于 webkit 提供的通信能力,WRY 会再暴露一个经过简单封装的 RPC 处理逻辑,这也是最后 [ tauri Javascript API ](https://github.com/tauri-apps/tauri/tree/dev/tooling/api) 中的底层逻辑:
+
+1. 将数据包装为 JSON-RPC 的格式。
+2. 在全局维护一个 promise 队列,用于触发异步回调。
+
+```javascript
+// 在启动 webview 的同时,WRY 会注入这样一段 JS 代码到全局
+(function () {
+ function Rpc() {
+ const self = this;
+ this._promises = {};
+
+ // 当任务完成,会通过 evaluateJavaScript 来执行此处的代码,触发 promise
+ // Private internal function called on error
+ this._error = (id, error) => {
+ if (this._promises[id]) {
+ this._promises[id].reject(error);
+ delete this._promises[id];
+ }
+ };
+
+ // Private internal function called on result
+ this._result = (id, result) => {
+ if (this._promises[id]) {
+ this._promises[id].resolve(result);
+ delete this._promises[id];
+ }
+ };
+
+ // Call remote method and expect a reply from the handler
+ // 需要回调时,保存一个 promise 到全局队列
+ this.call = function (method) {
+ let array = new Uint32Array(1);
+ window.crypto.getRandomValues(array);
+ const id = array[0];
+ const params = Array.prototype.slice.call(arguments, 1);
+ const payload = { jsonrpc: "2.0", id, method, params };
+ const promise = new Promise((resolve, reject) => {
+ self._promises[id] = { resolve, reject };
+ });
+ window.external.invoke(JSON.stringify(payload));
+ return promise;
+ };
+
+ // Send a notification without an `id` so no reply is expected.
+ this.notify = function (method) {
+ const params = Array.prototype.slice.call(arguments, 1);
+ const payload = { jsonrpc: "2.0", method, params };
+ window.external.invoke(JSON.stringify(payload));
+ return Promise.resolve();
+ };
+ }
+ window.external = window.external || {};
+ window.external.rpc = new Rpc();
+ window.rpc = window.external.rpc;
+})();
+```
+
+**基于这样的通信架构,tauri 可以实现使用前端(JS)作为应用主逻辑,而将一些需要高性能、调用系统能力的任务,通过指令丢给 rust 去做。**
+
+## 总结
+
+---
+
+想要打败 electron 的选手很多,但目前看 tauri 可能是最接近成功的一位了。
+为了解决 electron 的体积问题,tauri 选择直接使用系统内置的 webview,这样的选择也是基于目前的发展趋势的,即各家操作系统内置的浏览器生态在不断进步,尤其是之前被大多数人诟病的 Windows 平台 。微软对新版 Edge 中内置的 webview2 青眼有加,大型的桌面应用如 Office,outlook 都在推进升级至 webview2。从趋势上来看,操作系统内置的浏览器生态是在不断进步的,tauri 自然也能享受到这些红利。
+
+而 rust 语言的逐渐繁荣,也更加推动了 tauri 的生态发展,大量的贡献者在短时间内快速融入开源社区,tauri 的核心开发团队也始终坚持着 FLOSS (自由及开放源代码软件)的开放态度,这都使得 tauri 更具有成为成熟的解决方案的潜力。
+
+但目前的版本仍处于快速迭代期,还存在一些问题:
+
+- 对于前端网页而言,实际上并没有完全抹平平台差异,前端开发时仍需要考虑**平台兼容性。**
+- 线下测试来看,webview 和 rust 的性能虽然足够好,但在一些旧的设备上,窗口和 webview 创建的耗时**仍然不可忽视。**
+- 存在很多 bug,这些 bug 大多不直接来自于 tauri,而是来自于各平台下的 webview 接口,因此**bug 的解决周期也都相当长,目前很难直接用于生产环境。**
+- 文档和社区还是不够完善,大多数时间还需要**自己扒代码** 。(但正在快速发展,就在这篇文档写完的时候,大概两周左右的时间,官网的文档就经历了大规模的优化和更新)
diff --git a/themes/archie-zola/screenshot.png b/themes/archie-zola/screenshot.png
new file mode 100644
index 0000000..32f1875
Binary files /dev/null and b/themes/archie-zola/screenshot.png differ
diff --git a/themes/archie-zola/static/css/dark.css b/themes/archie-zola/static/css/dark.css
new file mode 100644
index 0000000..54615aa
--- /dev/null
+++ b/themes/archie-zola/static/css/dark.css
@@ -0,0 +1,181 @@
+body {
+ color: white;
+ background-color: #202124;
+}
+
+::-moz-selection {
+ background: blue;
+ color: #fff;
+ text-shadow: none;
+}
+
+::selection {
+ background: red;
+ color: #fff;
+ text-shadow: none;
+}
+
+hr {
+ border-top: 3px dotted blue;
+}
+
+code {
+ background-color: lightblue;
+ color: black;
+ text-decoration: bold;
+ padding: 0.1em 0.2em;
+}
+
+pre {
+ background-color: #272822;
+ line-height: 1.4;
+ overflow-x: auto;
+ padding: 1em;
+}
+
+blockquote {
+ border-color: blue;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ color: #ddd;
+}
+
+h1::before {
+ color: var(--darkMaincolor);
+ content: "# ";
+}
+
+h2::before {
+ color: var(--darkMaincolor);
+ content: "## ";
+}
+
+h3::before {
+ color: var(--darkMaincolor);
+ content: "### ";
+}
+
+h4::before {
+ color: var(--darkMaincolor);
+ content: "#### ";
+}
+
+h5::before {
+ color: var(--darkMaincolor);
+ content: "##### ";
+}
+
+h6::before {
+ color: var(--darkMaincolor);
+ content: "###### ";
+}
+
+a {
+ border-bottom: 3px solid var(--darkMaincolor);
+ color: inherit;
+}
+
+a:hover {
+ background-color: var(--darkMaincolor);
+ color: black;
+}
+
+.site-description a {
+ color: #ddd;
+}
+
+.site-description a:hover {
+ color: black;
+}
+
+.tags a {
+ border-bottom: 3px solid var(--darkMaincolor);
+}
+
+.tags a:hover {
+ background-color: var(--darkMaincolor);
+ color: black;
+}
+
+.site-title a {
+ color: white;
+ text-decoration: none !important;
+}
+
+.header nav,
+.footer {
+ border-color: #333;
+}
+
+.highlight {
+ background-color: #333;
+}
+
+.soc:hover {
+ color: black;
+}
+
+.draft-label {
+ color: var(--darkMaincolor);
+ background-color: blue;
+}
+
+.highlight pre code[class=language-javaScript]::before,
+.highlight pre code[class="language-js"]::before {
+ content: "js";
+ background: #f7df1e;
+ color: black;
+}
+
+.highlight pre code[class*='language-yml']::before,
+.highlight pre code[class*='language-yaml']::before {
+ content: 'yaml';
+ background: #f71e6a;
+ color: white;
+}
+
+.highlight pre code[class*='language-shell']::before,
+.highlight pre code[class*='language-bash']::before,
+.highlight pre code[class*='language-sh']::before {
+ content: 'shell';
+ background: green;
+ color: white
+}
+
+.highlight pre code[class*='language-json']::before {
+ content: 'json';
+ background: dodgerblue;
+ color: #000000
+}
+
+.highlight pre code[class*='language-python']::before,
+.highlight pre code[class*='language-py']::before {
+ content: 'py';
+ background: blue;
+ color: yellow;
+}
+
+.highlight pre code[class*='language-css']::before {
+ content: 'css';
+ background: cyan;
+ color: black;
+}
+
+.highlight pre code[class*='language-go']::before {
+ content: 'Go';
+ background: cyan;
+ color: royalblue;
+}
+
+.highlight pre code[class*='language-md']::before,
+.highlight pre code[class*='language-md']::before {
+ content: 'Markdown';
+ background: royalblue;
+ color: whitesmoke;
+}
\ No newline at end of file
diff --git a/themes/archie-zola/static/css/fonts.css b/themes/archie-zola/static/css/fonts.css
new file mode 100644
index 0000000..156ee63
--- /dev/null
+++ b/themes/archie-zola/static/css/fonts.css
@@ -0,0 +1,38 @@
+/* fira-sans-regular - latin */
+@font-face {
+ font-family: 'Fira Sans';
+ font-style: normal;
+ font-weight: 400;
+ src: url('../fonts/fira-sans-v10-latin-regular.eot'); /* IE9 Compat Modes */
+ src: local('Fira Sans Regular'), local('FiraSans-Regular'),
+ url('../fonts/fira-sans-v10-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('../fonts/fira-sans-v10-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */
+ url('../fonts/fira-sans-v10-latin-regular.woff') format('woff'), /* Modern Browsers */
+ url('../fonts/fira-sans-v10-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('../fonts/fira-sans-v10-latin-regular.svg#FiraSans') format('svg'); /* Legacy iOS */
+}
+/* roboto-mono-regular - latin */
+@font-face {
+ font-family: 'Roboto Mono';
+ font-style: normal;
+ font-weight: 400;
+ src: url('../fonts/roboto-mono-v12-latin-regular.eot'); /* IE9 Compat Modes */
+ src: url('../fonts/roboto-mono-v12-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('../fonts/roboto-mono-v12-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */
+ url('../fonts/roboto-mono-v12-latin-regular.woff') format('woff'), /* Modern Browsers */
+ url('../fonts/roboto-mono-v12-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('../fonts/roboto-mono-v12-latin-regular.svg#RobotoMono') format('svg'); /* Legacy iOS */
+}
+/* ibm-plex-mono-500italic - latin */
+@font-face {
+ font-family: 'IBM Plex Mono';
+ font-style: italic;
+ font-weight: 500;
+ src: url('../fonts/ibm-plex-mono-v6-latin-500italic.eot'); /* IE9 Compat Modes */
+ src: local('IBM Plex Mono Medium Italic'), local('IBMPlexMono-MediumItalic'),
+ url('../fonts/ibm-plex-mono-v6-latin-500italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('../fonts/ibm-plex-mono-v6-latin-500italic.woff2') format('woff2'), /* Super Modern Browsers */
+ url('../fonts/ibm-plex-mono-v6-latin-500italic.woff') format('woff'), /* Modern Browsers */
+ url('../fonts/ibm-plex-mono-v6-latin-500italic.ttf') format('truetype'), /* Safari, Android, iOS */
+ url('../fonts/ibm-plex-mono-v6-latin-500italic.svg#IBMPlexMono') format('svg'); /* Legacy iOS */
+}
diff --git a/themes/archie-zola/static/css/main.css b/themes/archie-zola/static/css/main.css
new file mode 100644
index 0000000..955bba4
--- /dev/null
+++ b/themes/archie-zola/static/css/main.css
@@ -0,0 +1,434 @@
+/* Markdown */
+:root {
+ --maincolor: red;
+ --bordercl: rebeccapurple;
+ --callouctcolor: dodgerblue;
+ --hovercolor: navy;
+ --darkMaincolor: #50fa7b;
+}
+
+html {
+ color: #232333;
+ font-family: "Roboto Mono", monospace;
+ font-size: 15px;
+ line-height: 1.6em;
+}
+
+body {
+ display: block;
+ margin: 8px;
+}
+
+* {
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+
+@keyframes intro {
+ 0% {
+ opacity: 0;
+ }
+
+ 100% {
+ opacity: 1;
+ }
+}
+
+.content {
+ animation: intro 0.3s both;
+ animation-delay: 0.15s;
+}
+
+::selection {
+ background: var(--maincolor);
+ color: #fff;
+}
+
+p {
+ /* font-family: 'Fira Sans', sans-serif; */
+ line-height: 1.5;
+}
+
+hr {
+ border: 0;
+ border-top: 3px dotted var(--bordercl);
+ margin: 1em 0;
+}
+
+blockquote {
+ border-left: 3px solid var(--bordercl);
+ color: #737373;
+ margin: 0;
+ padding-left: 1em;
+}
+
+a {
+ border-bottom: 3px solid var(--maincolor);
+ color: inherit;
+ text-decoration: none;
+}
+
+a:hover {
+ background-color: var(--hovercolor);
+ color: #fff;
+}
+
+ul {
+ list-style: none;
+ padding-left: 2ch;
+}
+
+ul li {
+ text-indent: -2ch;
+}
+
+ul > li::before {
+ content: "* ";
+ font-weight: bold;
+}
+
+/* Images */
+img {
+ border: 3px solid #ececec;
+ max-width: 100%;
+}
+
+figure {
+ box-sizing: border-box;
+ display: inline-block;
+ margin: 0;
+ max-width: 100%;
+}
+
+figure img {
+ max-height: 500px;
+}
+
+@media screen and (min-width: 600px) {
+ figure {
+ padding: 0 40px;
+ }
+}
+
+figure h4 {
+ font-size: 1rem;
+ margin: 0;
+ margin-bottom: 1em;
+}
+
+figure h4::before {
+ content: "↳ ";
+}
+
+/* Code blocks */
+code {
+ background-color: #f1f1f1;
+ padding: 0.1em 0.2em;
+}
+
+pre {
+ background-color: #ececec;
+ line-height: 1.4;
+ overflow-x: auto;
+ padding: 1em;
+}
+
+.highlight pre ::selection {
+ background: rgba(255, 255, 255, 0.2);
+ color: inherit;
+}
+
+pre code {
+ background-color: transparent;
+ color: inherit;
+ font-size: 100%;
+ padding: 0;
+}
+
+/* Containers */
+.content {
+ margin-bottom: 4em;
+ margin-left: auto;
+ margin-right: auto;
+ max-width: 800px;
+ padding: 0 1ch;
+ word-wrap: break-word;
+}
+
+/* Header */
+header {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: space-between;
+ margin: 1em 0;
+}
+
+header .main {
+ font-size: 1.5rem;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-size: 1.2rem;
+ margin-top: 2em;
+}
+
+h1::before {
+ color: var(--maincolor);
+ content: "# ";
+}
+
+h2::before {
+ color: var(--maincolor);
+ content: "## ";
+}
+
+h3::before {
+ color: var(--maincolor);
+ content: "### ";
+}
+
+h4::before {
+ color: var(--maincolor);
+ content: "#### ";
+}
+
+h5::before {
+ color: var(--maincolor);
+ content: "##### ";
+}
+
+h6::before {
+ color: var(--maincolor);
+ content: "###### ";
+}
+
+.meta {
+ color: #999;
+ letter-spacing: -0.5px;
+}
+
+/* Footer */
+footer {
+ display: flex;
+ align-items: center;
+ border-top: 0.4rem dotted var(--bordercl);
+ padding: 2rem 0rem;
+ margin-top: 2rem;
+}
+
+.soc {
+ display: flex;
+ align-items: center;
+ padding-right: 1rem;
+ margin-right: 1rem;
+ border-right: 2px solid;
+ border-bottom: none;
+}
+
+.footer-info {
+ padding: var(--footer-padding);
+}
+
+#main_title {
+ margin-bottom: 10px;
+}
+
+/* Common */
+.title h1 {
+ margin-bottom: 0;
+}
+
+time {
+ color: grey;
+}
+
+span {
+ color: grey;
+}
+
+/* Posts */
+article .title {
+ margin-bottom: 1em;
+}
+
+/* Callout */
+.callout {
+ background-color: var(--callouctcolor);
+ color: #fff;
+ padding: 1em;
+}
+
+.callout p {
+ /* font-family: 'IBM Plex Mono', monospace; */
+ margin: 0;
+}
+
+.callout a {
+ border-bottom: 3px solid #fff;
+}
+
+.callout a:hover {
+ background-color: #fff;
+ color: var(--callouctcolor);
+}
+
+.site-description {
+ display: flex;
+ justify-content: space-between;
+}
+
+.tags li::before {
+ content: "🏷 ";
+}
+
+.tags a {
+ border-bottom: 3px solid var(--maincolor);
+}
+
+.tags a:hover {
+ color: white;
+ background-color: var(--hovercolor);
+}
+
+svg {
+ max-height: 15px;
+}
+
+.soc:hover {
+ color: white;
+}
+
+.draft-label {
+ color: var(--bordercl);
+ text-decoration: none;
+ padding: 2px 4px;
+ border-radius: 4px;
+ margin-left: 6px;
+ background-color: #f9f2f4;
+}
+
+pre {
+ font-family: "Roboto Mono", monospace;
+ position: relative;
+ -webkit-overflow-scrolling: touch;
+}
+
+pre code[class*="language-"] {
+ -webkit-overflow-scrolling: touch;
+}
+
+pre code[class*="language-"]::before {
+ background: black;
+ border-radius: 0 0 0.25rem 0.25rem;
+ color: white;
+ font-size: 12px;
+ letter-spacing: 0.025rem;
+ padding: 0.1rem 0.5rem;
+ position: absolute;
+ right: 1rem;
+ text-align: right;
+ text-transform: uppercase;
+ top: 0;
+}
+
+pre code[class="language-javaScript"]::before,
+pre code[class="language-js"]::before {
+ content: "js";
+ background: #f7df1e;
+ color: black;
+}
+
+pre code[class="language-typescript"]::before,
+pre code[class="language-ts"]::before {
+ content: "ts";
+ background: dodgerblue;
+ color: black;
+}
+
+pre code[class*="language-yml"]::before,
+pre code[class*="language-yaml"]::before {
+ content: "yaml";
+ background: #f71e6a;
+ color: white;
+}
+
+pre code[class*="language-shell"]::before,
+pre code[class*="language-bash"]::before,
+pre code[class*="language-sh"]::before {
+ content: "shell";
+ background: green;
+ color: white;
+}
+
+pre code[class*="language-json"]::before {
+ content: "json";
+ background: dodgerblue;
+ color: #000000;
+}
+
+pre code[class*="language-python"]::before,
+pre code[class*="language-py"]::before {
+ content: "py";
+ background: blue;
+ color: yellow;
+}
+
+pre code[class*="language-css"]::before {
+ content: "css";
+ background: cyan;
+ color: black;
+}
+
+pre code[class*="language-go"]::before {
+ content: "Go";
+ background: cyan;
+ color: royalblue;
+}
+
+pre code[class*="language-md"]::before,
+pre code[class*="language-md"]::before {
+ content: "Markdown";
+ background: royalblue;
+ color: whitesmoke;
+}
+
+pre code[class*="language-rust"]::before,
+pre code[class*="language-rs"]::before {
+ content: "rust";
+ background: #fff8f6;
+ color: #ff4647;
+}
+
+pre code[class*="language-cpp"]::before,
+pre code[class*="language-c++"]::before {
+ content: "cpp";
+ background: #5e97d0;
+ color: #044f88;
+}
+
+/* table */
+table {
+ border-spacing: 0;
+ border-collapse: collapse;
+}
+
+table th {
+ padding: 6px 13px;
+ border: 1px solid #dfe2e5;
+ font-size: large;
+}
+
+table td {
+ padding: 6px 13px;
+ border: 1px solid #dfe2e5;
+}
+
+.footnote-definition {
+ display: flex;
+ align-items: center;
+ grid-column-gap: 10px;
+}
diff --git a/themes/archie-zola/static/fonts/fira-sans-v10-latin-regular.eot b/themes/archie-zola/static/fonts/fira-sans-v10-latin-regular.eot
new file mode 100644
index 0000000..7abf4c2
Binary files /dev/null and b/themes/archie-zola/static/fonts/fira-sans-v10-latin-regular.eot differ
diff --git a/themes/archie-zola/static/fonts/fira-sans-v10-latin-regular.svg b/themes/archie-zola/static/fonts/fira-sans-v10-latin-regular.svg
new file mode 100644
index 0000000..1e52097
--- /dev/null
+++ b/themes/archie-zola/static/fonts/fira-sans-v10-latin-regular.svg
@@ -0,0 +1,330 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/themes/archie-zola/static/fonts/fira-sans-v10-latin-regular.ttf b/themes/archie-zola/static/fonts/fira-sans-v10-latin-regular.ttf
new file mode 100644
index 0000000..572e442
Binary files /dev/null and b/themes/archie-zola/static/fonts/fira-sans-v10-latin-regular.ttf differ
diff --git a/themes/archie-zola/static/fonts/fira-sans-v10-latin-regular.woff b/themes/archie-zola/static/fonts/fira-sans-v10-latin-regular.woff
new file mode 100644
index 0000000..d99ba57
Binary files /dev/null and b/themes/archie-zola/static/fonts/fira-sans-v10-latin-regular.woff differ
diff --git a/themes/archie-zola/static/fonts/fira-sans-v10-latin-regular.woff2 b/themes/archie-zola/static/fonts/fira-sans-v10-latin-regular.woff2
new file mode 100644
index 0000000..9bb5760
Binary files /dev/null and b/themes/archie-zola/static/fonts/fira-sans-v10-latin-regular.woff2 differ
diff --git a/themes/archie-zola/static/fonts/ibm-plex-mono-v6-latin-500italic.eot b/themes/archie-zola/static/fonts/ibm-plex-mono-v6-latin-500italic.eot
new file mode 100644
index 0000000..62b89b3
Binary files /dev/null and b/themes/archie-zola/static/fonts/ibm-plex-mono-v6-latin-500italic.eot differ
diff --git a/themes/archie-zola/static/fonts/ibm-plex-mono-v6-latin-500italic.svg b/themes/archie-zola/static/fonts/ibm-plex-mono-v6-latin-500italic.svg
new file mode 100644
index 0000000..6423805
--- /dev/null
+++ b/themes/archie-zola/static/fonts/ibm-plex-mono-v6-latin-500italic.svg
@@ -0,0 +1,365 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/themes/archie-zola/static/fonts/ibm-plex-mono-v6-latin-500italic.ttf b/themes/archie-zola/static/fonts/ibm-plex-mono-v6-latin-500italic.ttf
new file mode 100644
index 0000000..e4d1ddf
Binary files /dev/null and b/themes/archie-zola/static/fonts/ibm-plex-mono-v6-latin-500italic.ttf differ
diff --git a/themes/archie-zola/static/fonts/ibm-plex-mono-v6-latin-500italic.woff b/themes/archie-zola/static/fonts/ibm-plex-mono-v6-latin-500italic.woff
new file mode 100644
index 0000000..4504b41
Binary files /dev/null and b/themes/archie-zola/static/fonts/ibm-plex-mono-v6-latin-500italic.woff differ
diff --git a/themes/archie-zola/static/fonts/ibm-plex-mono-v6-latin-500italic.woff2 b/themes/archie-zola/static/fonts/ibm-plex-mono-v6-latin-500italic.woff2
new file mode 100644
index 0000000..489745d
Binary files /dev/null and b/themes/archie-zola/static/fonts/ibm-plex-mono-v6-latin-500italic.woff2 differ
diff --git a/themes/archie-zola/static/fonts/roboto-mono-v12-latin-regular.eot b/themes/archie-zola/static/fonts/roboto-mono-v12-latin-regular.eot
new file mode 100644
index 0000000..8c56483
Binary files /dev/null and b/themes/archie-zola/static/fonts/roboto-mono-v12-latin-regular.eot differ
diff --git a/themes/archie-zola/static/fonts/roboto-mono-v12-latin-regular.svg b/themes/archie-zola/static/fonts/roboto-mono-v12-latin-regular.svg
new file mode 100644
index 0000000..1864328
--- /dev/null
+++ b/themes/archie-zola/static/fonts/roboto-mono-v12-latin-regular.svg
@@ -0,0 +1,405 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/themes/archie-zola/static/fonts/roboto-mono-v12-latin-regular.ttf b/themes/archie-zola/static/fonts/roboto-mono-v12-latin-regular.ttf
new file mode 100644
index 0000000..d5dee83
Binary files /dev/null and b/themes/archie-zola/static/fonts/roboto-mono-v12-latin-regular.ttf differ
diff --git a/themes/archie-zola/static/fonts/roboto-mono-v12-latin-regular.woff b/themes/archie-zola/static/fonts/roboto-mono-v12-latin-regular.woff
new file mode 100644
index 0000000..f319fbf
Binary files /dev/null and b/themes/archie-zola/static/fonts/roboto-mono-v12-latin-regular.woff differ
diff --git a/themes/archie-zola/static/fonts/roboto-mono-v12-latin-regular.woff2 b/themes/archie-zola/static/fonts/roboto-mono-v12-latin-regular.woff2
new file mode 100644
index 0000000..ed384d2
Binary files /dev/null and b/themes/archie-zola/static/fonts/roboto-mono-v12-latin-regular.woff2 differ
diff --git a/themes/archie-zola/static/icon/favicon.png b/themes/archie-zola/static/icon/favicon.png
new file mode 100644
index 0000000..cce24c3
Binary files /dev/null and b/themes/archie-zola/static/icon/favicon.png differ
diff --git a/themes/archie-zola/static/imgs/arch-01.png b/themes/archie-zola/static/imgs/arch-01.png
new file mode 100644
index 0000000..fd77eb1
Binary files /dev/null and b/themes/archie-zola/static/imgs/arch-01.png differ
diff --git a/themes/archie-zola/static/imgs/arch-02.png b/themes/archie-zola/static/imgs/arch-02.png
new file mode 100644
index 0000000..bc40158
Binary files /dev/null and b/themes/archie-zola/static/imgs/arch-02.png differ
diff --git a/themes/archie-zola/static/imgs/demo-01.png b/themes/archie-zola/static/imgs/demo-01.png
new file mode 100644
index 0000000..d624c44
Binary files /dev/null and b/themes/archie-zola/static/imgs/demo-01.png differ
diff --git a/themes/archie-zola/static/imgs/star-history.png b/themes/archie-zola/static/imgs/star-history.png
new file mode 100644
index 0000000..389a6c9
Binary files /dev/null and b/themes/archie-zola/static/imgs/star-history.png differ
diff --git a/themes/archie-zola/static/imgs/vs-01.png b/themes/archie-zola/static/imgs/vs-01.png
new file mode 100644
index 0000000..55b32b2
Binary files /dev/null and b/themes/archie-zola/static/imgs/vs-01.png differ
diff --git a/themes/archie-zola/static/imgs/vs-02.png b/themes/archie-zola/static/imgs/vs-02.png
new file mode 100644
index 0000000..bab32c0
Binary files /dev/null and b/themes/archie-zola/static/imgs/vs-02.png differ
diff --git a/themes/archie-zola/static/imgs/vs-03.png b/themes/archie-zola/static/imgs/vs-03.png
new file mode 100644
index 0000000..857249d
Binary files /dev/null and b/themes/archie-zola/static/imgs/vs-03.png differ
diff --git a/themes/archie-zola/static/js/feather.min.js b/themes/archie-zola/static/js/feather.min.js
new file mode 100644
index 0000000..d229492
--- /dev/null
+++ b/themes/archie-zola/static/js/feather.min.js
@@ -0,0 +1,13 @@
+!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?exports.feather=n():e.feather=n()}("undefined"!=typeof self?self:this,function(){return function(e){var n={};function i(l){if(n[l])return n[l].exports;var t=n[l]={i:l,l:!1,exports:{}};return e[l].call(t.exports,t,t.exports,i),t.l=!0,t.exports}return i.m=e,i.c=n,i.d=function(e,n,l){i.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:l})},i.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},i.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(n,"a",n),n},i.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},i.p="",i(i.s=61)}([function(e,n,i){var l=i(20)("wks"),t=i(11),r=i(1).Symbol,o="function"==typeof r;(e.exports=function(e){return l[e]||(l[e]=o&&r[e]||(o?r:t)("Symbol."+e))}).store=l},function(e,n){var i=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=i)},function(e,n){var i=e.exports={version:"2.5.6"};"number"==typeof __e&&(__e=i)},function(e,n){var i={}.hasOwnProperty;e.exports=function(e,n){return i.call(e,n)}},function(e,n,i){e.exports=!i(27)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,n,i){var l=i(13);e.exports=function(e){if(!l(e))throw TypeError(e+" is not an object!");return e}},function(e,n,i){var l=i(5),t=i(56),r=i(55),o=Object.defineProperty;n.f=i(4)?Object.defineProperty:function(e,n,i){if(l(e),n=r(n,!0),l(i),t)try{return o(e,n,i)}catch(e){}if("get"in i||"set"in i)throw TypeError("Accessors not supported!");return"value"in i&&(e[n]=i.value),e}},function(e,n,i){var l=i(6),t=i(12);e.exports=i(4)?function(e,n,i){return l.f(e,n,t(1,i))}:function(e,n,i){return e[n]=i,e}},function(e,n,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var l=o(i(35)),t=o(i(33)),r=o(i(32));function o(e){return e&&e.__esModule?e:{default:e}}n.default=Object.keys(t.default).map(function(e){return new l.default(e,t.default[e],r.default[e])}).reduce(function(e,n){return e[n.name]=n,e},{})},function(e,n,i){var l=i(20)("keys"),t=i(11);e.exports=function(e){return l[e]||(l[e]=t(e))}},function(e,n){e.exports={}},function(e,n){var i=0,l=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++i+l).toString(36))}},function(e,n){e.exports=function(e,n){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:n}}},function(e,n){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},function(e,n){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,n){var i=Math.ceil,l=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?l:i)(e)}},function(e,n,i){var l;
+/*!
+ Copyright (c) 2016 Jed Watson.
+ Licensed under the MIT License (MIT), see
+ http://jedwatson.github.io/classnames
+*/
+/*!
+ Copyright (c) 2016 Jed Watson.
+ Licensed under the MIT License (MIT), see
+ http://jedwatson.github.io/classnames
+*/
+!function(){"use strict";var i=function(){function e(){}function n(e,n){for(var i=n.length,l=0;l0?t(l(e),9007199254740991):0}},function(e,n){var i={}.toString;e.exports=function(e){return i.call(e).slice(8,-1)}},function(e,n,i){var l=i(48),t=i(14);e.exports=function(e){return l(t(e))}},function(e,n,i){var l=i(54);e.exports=function(e,n,i){if(l(e),void 0===n)return e;switch(i){case 1:return function(i){return e.call(n,i)};case 2:return function(i,l){return e.call(n,i,l)};case 3:return function(i,l,t){return e.call(n,i,l,t)}}return function(){return e.apply(n,arguments)}}},function(e,n,i){var l=i(1),t=i(7),r=i(3),o=i(11)("src"),a=Function.toString,c=(""+a).split("toString");i(2).inspectSource=function(e){return a.call(e)},(e.exports=function(e,n,i,a){var y="function"==typeof i;y&&(r(i,"name")||t(i,"name",n)),e[n]!==i&&(y&&(r(i,o)||t(i,o,e[n]?""+e[n]:c.join(String(n)))),e===l?e[n]=i:a?e[n]?e[n]=i:t(e,n,i):(delete e[n],t(e,n,i)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[o]||a.call(this)})},function(e,n,i){var l=i(13),t=i(1).document,r=l(t)&&l(t.createElement);e.exports=function(e){return r?t.createElement(e):{}}},function(e,n){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,n,i){var l=i(1),t=i(2),r=i(7),o=i(25),a=i(24),c=function(e,n,i){var y,p,h,x,s=e&c.F,u=e&c.G,d=e&c.S,f=e&c.P,v=e&c.B,g=u?l:d?l[n]||(l[n]={}):(l[n]||{}).prototype,m=u?t:t[n]||(t[n]={}),M=m.prototype||(m.prototype={});for(y in u&&(i=n),i)h=((p=!s&&g&&void 0!==g[y])?g:i)[y],x=v&&p?a(h,l):f&&"function"==typeof h?a(Function.call,h):h,g&&o(g,y,h,e&c.U),m[y]!=h&&r(m,y,x),f&&M[y]!=h&&(M[y]=h)};l.core=t,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,e.exports=c},function(e,n){e.exports=!1},function(e,n,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var l=Object.assign||function(e){for(var n=1;n0&&void 0!==arguments[0]?arguments[0]:{};if("undefined"==typeof document)throw new Error("`feather.replace()` only works in a browser environment.");var n=document.querySelectorAll("[data-feather]");Array.from(n).forEach(function(n){return function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=function(e){return Array.from(e.attributes).reduce(function(e,n){return e[n.name]=n.value,e},{})}(e),o=i["data-feather"];delete i["data-feather"];var a=r.default[o].toSvg(l({},n,i,{class:(0,t.default)(n.class,i.class)})),c=(new DOMParser).parseFromString(a,"image/svg+xml").querySelector("svg");e.parentNode.replaceChild(c,e)}(n,e)})}},function(e,n,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var l,t=i(8),r=(l=t)&&l.__esModule?l:{default:l};n.default=function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(console.warn("feather.toSvg() is deprecated. Please use feather.icons[name].toSvg() instead."),!e)throw new Error("The required `key` (icon name) parameter is missing.");if(!r.default[e])throw new Error("No icon matching '"+e+"'. See the complete list of icons at https://feathericons.com");return r.default[e].toSvg(n)}},function(e){e.exports={activity:["pulse","health","action","motion"],airplay:["stream","cast","mirroring"],"alert-circle":["warning"],"alert-octagon":["warning"],"alert-triangle":["warning"],"at-sign":["mention"],award:["achievement","badge"],aperture:["camera","photo"],bell:["alarm","notification"],"bell-off":["alarm","notification","silent"],bluetooth:["wireless"],"book-open":["read"],book:["read","dictionary","booklet","magazine"],bookmark:["read","clip","marker","tag"],briefcase:["work","bag","baggage","folder"],clipboard:["copy"],clock:["time","watch","alarm"],"cloud-drizzle":["weather","shower"],"cloud-lightning":["weather","bolt"],"cloud-rain":["weather"],"cloud-snow":["weather","blizzard"],cloud:["weather"],codepen:["logo"],codesandbox:["logo"],coffee:["drink","cup","mug","tea","cafe","hot","beverage"],command:["keyboard","cmd"],compass:["navigation","safari","travel"],copy:["clone","duplicate"],"corner-down-left":["arrow"],"corner-down-right":["arrow"],"corner-left-down":["arrow"],"corner-left-up":["arrow"],"corner-right-down":["arrow"],"corner-right-up":["arrow"],"corner-up-left":["arrow"],"corner-up-right":["arrow"],"credit-card":["purchase","payment","cc"],crop:["photo","image"],crosshair:["aim","target"],database:["storage"],delete:["remove"],disc:["album","cd","dvd","music"],"dollar-sign":["currency","money","payment"],droplet:["water"],edit:["pencil","change"],"edit-2":["pencil","change"],"edit-3":["pencil","change"],eye:["view","watch"],"eye-off":["view","watch"],"external-link":["outbound"],facebook:["logo"],"fast-forward":["music"],figma:["logo","design","tool"],film:["movie","video"],"folder-minus":["directory"],"folder-plus":["directory"],folder:["directory"],frown:["emoji","face","bad","sad","emotion"],gift:["present","box","birthday","party"],"git-branch":["code","version control"],"git-commit":["code","version control"],"git-merge":["code","version control"],"git-pull-request":["code","version control"],github:["logo","version control"],gitlab:["logo","version control"],global:["world","browser","language","translate"],"hard-drive":["computer","server"],hash:["hashtag","number","pound"],headphones:["music","audio"],heart:["like","love"],"help-circle":["question mark"],hexagon:["shape","node.js","logo"],home:["house"],image:["picture"],inbox:["email"],instagram:["logo","camera"],key:["password","login","authentication"],"life-bouy":["help","life ring","support"],linkedin:["logo"],lock:["security","password"],"log-in":["sign in","arrow"],"log-out":["sign out","arrow"],mail:["email"],"map-pin":["location","navigation","travel","marker"],map:["location","navigation","travel"],maximize:["fullscreen"],"maximize-2":["fullscreen","arrows"],meh:["emoji","face","neutral","emotion"],menu:["bars","navigation","hamburger"],"message-circle":["comment","chat"],"message-square":["comment","chat"],"mic-off":["record"],mic:["record"],minimize:["exit fullscreen"],"minimize-2":["exit fullscreen","arrows"],monitor:["tv"],moon:["dark","night"],"more-horizontal":["ellipsis"],"more-vertical":["ellipsis"],"mouse-pointer":["arrow","cursor"],move:["arrows"],navigation:["location","travel"],"navigation-2":["location","travel"],octagon:["stop"],package:["box"],paperclip:["attachment"],pause:["music","stop"],"pause-circle":["music","stop"],"pen-tool":["vector","drawing"],play:["music","start"],"play-circle":["music","start"],plus:["add","new"],"plus-circle":["add","new"],"plus-square":["add","new"],pocket:["logo","save"],power:["on","off"],radio:["signal"],rewind:["music"],rss:["feed","subscribe"],save:["floppy disk"],search:["find","magnifier","magnifying glass"],send:["message","mail","paper airplane"],settings:["cog","edit","gear","preferences"],shield:["security"],"shield-off":["security"],"shopping-bag":["ecommerce","cart","purchase","store"],"shopping-cart":["ecommerce","cart","purchase","store"],shuffle:["music"],"skip-back":["music"],"skip-forward":["music"],slash:["ban","no"],sliders:["settings","controls"],smile:["emoji","face","happy","good","emotion"],speaker:["music"],star:["bookmark","favorite","like"],sun:["brightness","weather","light"],sunrise:["weather"],sunset:["weather"],tag:["label"],target:["bullseye"],terminal:["code","command line"],"thumbs-down":["dislike","bad"],"thumbs-up":["like","good"],"toggle-left":["on","off","switch"],"toggle-right":["on","off","switch"],trash:["garbage","delete","remove"],"trash-2":["garbage","delete","remove"],triangle:["delta"],truck:["delivery","van","shipping"],twitter:["logo"],umbrella:["rain","weather"],"video-off":["camera","movie","film"],video:["camera","movie","film"],voicemail:["phone"],volume:["music","sound","mute"],"volume-1":["music","sound"],"volume-2":["music","sound"],"volume-x":["music","sound","mute"],watch:["clock","time"],wind:["weather","air"],"x-circle":["cancel","close","delete","remove","times"],"x-octagon":["delete","stop","alert","warning","times"],"x-square":["cancel","close","delete","remove","times"],x:["cancel","close","delete","remove","times"],youtube:["logo","video","play"],"zap-off":["flash","camera","lightning"],zap:["flash","camera","lightning"]}},function(e){e.exports={activity:' ',airplay:' ',"alert-circle":' ',"alert-octagon":' ',"alert-triangle":' ',"align-center":' ',"align-justify":' ',"align-left":' ',"align-right":' ',anchor:' ',aperture:' ',archive:' ',"arrow-down-circle":' ',"arrow-down-left":' ',"arrow-down-right":' ',"arrow-down":' ',"arrow-left-circle":' ',"arrow-left":' ',"arrow-right-circle":' ',"arrow-right":' ',"arrow-up-circle":' ',"arrow-up-left":' ',"arrow-up-right":' ',"arrow-up":' ',"at-sign":' ',award:' ',"bar-chart-2":' ',"bar-chart":' ',"battery-charging":' ',battery:' ',"bell-off":' ',bell:' ',bluetooth:' ',bold:' ',"book-open":' ',book:' ',bookmark:' ',box:' ',briefcase:' ',calendar:' ',"camera-off":' ',camera:' ',cast:' ',"check-circle":' ',"check-square":' ',check:' ',"chevron-down":' ',"chevron-left":' ',"chevron-right":' ',"chevron-up":' ',"chevrons-down":' ',"chevrons-left":' ',"chevrons-right":' ',"chevrons-up":' ',chrome:' ',circle:' ',clipboard:' ',clock:' ',"cloud-drizzle":' ',"cloud-lightning":' ',"cloud-off":' ',"cloud-rain":' ',"cloud-snow":' ',cloud:' ',code:' ',codepen:' ',codesandbox:' ',coffee:' ',columns:' ',command:' ',compass:' ',copy:' ',"corner-down-left":' ',"corner-down-right":' ',"corner-left-down":' ',"corner-left-up":' ',"corner-right-down":' ',"corner-right-up":' ',"corner-up-left":' ',"corner-up-right":' ',cpu:' ',"credit-card":' ',crop:' ',crosshair:' ',database:' ',delete:' ',disc:' ',"dollar-sign":' ',"download-cloud":' ',download:' ',droplet:' ',"edit-2":' ',"edit-3":' ',edit:' ',"external-link":' ',"eye-off":' ',eye:' ',facebook:' ',"fast-forward":' ',feather:' ',figma:' ',"file-minus":' ',"file-plus":' ',"file-text":' ',file:' ',film:' ',filter:' ',flag:' ',"folder-minus":' ',"folder-plus":' ',folder:' ',frown:' ',gift:' ',"git-branch":' ',"git-commit":' ',"git-merge":' ',"git-pull-request":' ',github:' ',gitlab:' ',globe:' ',grid:' ',"hard-drive":' ',hash:' ',headphones:' ',heart:' ',"help-circle":' ',hexagon:' ',home:' ',image:' ',inbox:' ',info:' ',instagram:' ',italic:' ',key:' ',layers:' ',layout:' ',"life-buoy":' ',"link-2":' ',link:' ',linkedin:' ',list:' ',loader:' ',lock:' ',"log-in":' ',"log-out":' ',mail:' ',"map-pin":' ',map:' ',"maximize-2":' ',maximize:' ',meh:' ',menu:' ',"message-circle":' ',"message-square":' ',"mic-off":' ',mic:' ',"minimize-2":' ',minimize:' ',"minus-circle":' ',"minus-square":' ',minus:' ',monitor:' ',moon:' ',"more-horizontal":' ',"more-vertical":' ',"mouse-pointer":' ',move:' ',music:' ',"navigation-2":' ',navigation:' ',octagon:' ',package:' ',paperclip:' ',"pause-circle":' ',pause:' ',"pen-tool":' ',percent:' ',"phone-call":' ',"phone-forwarded":' ',"phone-incoming":' ',"phone-missed":' ',"phone-off":' ',"phone-outgoing":' ',phone:' ',"pie-chart":' ',"play-circle":' ',play:' ',"plus-circle":' ',"plus-square":' ',plus:' ',pocket:' ',power:' ',printer:' ',radio:' ',"refresh-ccw":' ',"refresh-cw":' ',repeat:' ',rewind:' ',"rotate-ccw":' ',"rotate-cw":' ',rss:' ',save:' ',scissors:' ',search:' ',send:' ',server:' ',settings:' ',"share-2":' ',share:' ',"shield-off":' ',shield:' ',"shopping-bag":' ',"shopping-cart":' ',shuffle:' ',sidebar:' ',"skip-back":' ',"skip-forward":' ',slack:' ',slash:' ',sliders:' ',smartphone:' ',smile:' ',speaker:' ',square:' ',star:' ',"stop-circle":' ',sun:' ',sunrise:' ',sunset:' ',tablet:' ',tag:' ',target:' ',terminal:' ',thermometer:' ',"thumbs-down":' ',"thumbs-up":' ',"toggle-left":' ',"toggle-right":' ',"trash-2":' ',trash:' ',trello:' ',"trending-down":' ',"trending-up":' ',triangle:' ',truck:' ',tv:' ',twitter:' ',type:' ',umbrella:' ',underline:' ',unlock:' ',"upload-cloud":' ',upload:' ',"user-check":' ',"user-minus":' ',"user-plus":' ',"user-x":' ',user:' ',users:' ',"video-off":' ',video:' ',voicemail:' ',"volume-1":' ',"volume-2":' ',"volume-x":' ',volume:' ',watch:' ',"wifi-off":' ',wifi:' ',wind:' ',"x-circle":' ',"x-octagon":' ',"x-square":' ',x:' ',youtube:' ',"zap-off":' ',zap:' ',"zoom-in":' ',"zoom-out":' '}},function(e){e.exports={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"}},function(e,n,i){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var l=Object.assign||function(e){for(var n=1;n2&&void 0!==arguments[2]?arguments[2]:[];!function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,e),this.name=n,this.contents=i,this.tags=t,this.attrs=l({},o.default,{class:"feather feather-"+n})}return t(e,[{key:"toSvg",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return""+this.contents+" "}},{key:"toString",value:function(){return this.contents}}]),e}();n.default=c},function(e,n,i){"use strict";var l=o(i(8)),t=o(i(31)),r=o(i(30));function o(e){return e&&e.__esModule?e:{default:e}}e.exports={icons:l.default,toSvg:t.default,replace:r.default}},function(e,n,i){var l=i(0)("iterator"),t=!1;try{var r=[7][l]();r.return=function(){t=!0},Array.from(r,function(){throw 2})}catch(e){}e.exports=function(e,n){if(!n&&!t)return!1;var i=!1;try{var r=[7],o=r[l]();o.next=function(){return{done:i=!0}},r[l]=function(){return o},e(r)}catch(e){}return i}},function(e,n,i){var l=i(22),t=i(0)("toStringTag"),r="Arguments"==l(function(){return arguments}());e.exports=function(e){var n,i,o;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(i=function(e,n){try{return e[n]}catch(e){}}(n=Object(e),t))?i:r?l(n):"Object"==(o=l(n))&&"function"==typeof n.callee?"Arguments":o}},function(e,n,i){var l=i(38),t=i(0)("iterator"),r=i(10);e.exports=i(2).getIteratorMethod=function(e){if(void 0!=e)return e[t]||e["@@iterator"]||r[l(e)]}},function(e,n,i){"use strict";var l=i(6),t=i(12);e.exports=function(e,n,i){n in e?l.f(e,n,t(0,i)):e[n]=i}},function(e,n,i){var l=i(10),t=i(0)("iterator"),r=Array.prototype;e.exports=function(e){return void 0!==e&&(l.Array===e||r[t]===e)}},function(e,n,i){var l=i(5);e.exports=function(e,n,i,t){try{return t?n(l(i)[0],i[1]):n(i)}catch(n){var r=e.return;throw void 0!==r&&l(r.call(e)),n}}},function(e,n,i){"use strict";var l=i(24),t=i(28),r=i(17),o=i(42),a=i(41),c=i(21),y=i(40),p=i(39);t(t.S+t.F*!i(37)(function(e){Array.from(e)}),"Array",{from:function(e){var n,i,t,h,x=r(e),s="function"==typeof this?this:Array,u=arguments.length,d=u>1?arguments[1]:void 0,f=void 0!==d,v=0,g=p(x);if(f&&(d=l(d,u>2?arguments[2]:void 0,2)),void 0==g||s==Array&&a(g))for(i=new s(n=c(x.length));n>v;v++)y(i,v,f?d(x[v],v):x[v]);else for(h=g.call(x),i=new s;!(t=h.next()).done;v++)y(i,v,f?o(h,d,[t.value,v],!0):t.value);return i.length=v,i}})},function(e,n,i){var l=i(3),t=i(17),r=i(9)("IE_PROTO"),o=Object.prototype;e.exports=Object.getPrototypeOf||function(e){return e=t(e),l(e,r)?e[r]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?o:null}},function(e,n,i){var l=i(1).document;e.exports=l&&l.documentElement},function(e,n,i){var l=i(15),t=Math.max,r=Math.min;e.exports=function(e,n){return(e=l(e))<0?t(e+n,0):r(e,n)}},function(e,n,i){var l=i(23),t=i(21),r=i(46);e.exports=function(e){return function(n,i,o){var a,c=l(n),y=t(c.length),p=r(o,y);if(e&&i!=i){for(;y>p;)if((a=c[p++])!=a)return!0}else for(;y>p;p++)if((e||p in c)&&c[p]===i)return e||p||0;return!e&&-1}}},function(e,n,i){var l=i(22);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==l(e)?e.split(""):Object(e)}},function(e,n,i){var l=i(3),t=i(23),r=i(47)(!1),o=i(9)("IE_PROTO");e.exports=function(e,n){var i,a=t(e),c=0,y=[];for(i in a)i!=o&&l(a,i)&&y.push(i);for(;n.length>c;)l(a,i=n[c++])&&(~r(y,i)||y.push(i));return y}},function(e,n,i){var l=i(49),t=i(19);e.exports=Object.keys||function(e){return l(e,t)}},function(e,n,i){var l=i(6),t=i(5),r=i(50);e.exports=i(4)?Object.defineProperties:function(e,n){t(e);for(var i,o=r(n),a=o.length,c=0;a>c;)l.f(e,i=o[c++],n[i]);return e}},function(e,n,i){var l=i(5),t=i(51),r=i(19),o=i(9)("IE_PROTO"),a=function(){},c=function(){var e,n=i(26)("iframe"),l=r.length;for(n.style.display="none",i(45).appendChild(n),n.src="javascript:",(e=n.contentWindow.document).open(),e.write("
+{% endif %}
diff --git a/themes/archie-zola/templates/partials/head.html b/themes/archie-zola/templates/partials/head.html
new file mode 100644
index 0000000..8a79410
--- /dev/null
+++ b/themes/archie-zola/templates/partials/head.html
@@ -0,0 +1,24 @@
+
+
+
+
+ {% for menu in config.extra.translations[lang][0].menus %}
+ {{ menu.name }}
+ {% endfor %}
+
+ {% if config.extra.translations.languages %}
+ |
+
+ {% for language in config.extra.translations.languages %}
+ {{ language.name }}
+ {% endfor %}
+ {% endif %}
+
+ {% if config.extra.mode == "toggle" %}
+ |
+
+ {% endif %}
+
+
diff --git a/themes/archie-zola/templates/partials/header.html b/themes/archie-zola/templates/partials/header.html
new file mode 100644
index 0000000..e5feecb
--- /dev/null
+++ b/themes/archie-zola/templates/partials/header.html
@@ -0,0 +1,124 @@
+{% import "macros/macros.html" as post_macros %}
+
+
+
+
+
+ {% if page.extra.meta %}
+
+ {% for data in page.extra.meta %}
+
+ {% endfor %}
+ {% endif %}
+
+ {% if current_path == "/" %}
+
+ {{ config.title | default(value="Home") }}
+
+ {% if not page_has_og_title %}
+
+ {% endif %}
+ {% else %}
+
+ {% if page.title %} {{ page.title }}
+ {% elif config.title %} {{ config.title }}
+ {% else %} Post {% endif %}
+
+
+ {% if not page_has_og_title %}
+
+ {% endif %}
+ {% endif %}
+
+ {% if not page_has_og_description %}
+ {% if page.description %}
+
+ {% elif config.description %}
+
+ {% endif %}
+ {% endif %}
+
+ {% if not page_has_description %}
+ {% if page.description %}
+
+ {% elif config.description %}
+
+ {% endif %}
+ {% endif %}
+
+ {% if config.extra.favicon %}
+
+ {% endif %}
+
+ {# opengraph, twitter_cards #}
+
+ {% if config.extra.ga %}
+
+
+
+ {% endif %}
+
+ {# if need icon, load feather.js #}
+ {% if config.extra.social and config.extra.useCDN | default(value=false) %}
+
+ {% elif config.extra.social or config.extra.mode == "toggle" %}
+
+ {% endif %}
+
+
+ {% if config.extra.useCDN | default(value=false) %}
+
+
+
+ {% else %}
+
+ {% endif %}
+
+
+
+ {% if config.extra.mode == "auto" or config.extra.mode == "dark" or config.extra.mode == "toggle" %}
+
+ {% endif %}
+
+ {% if config.extra.katex_enable %}
+
+
+
+ {% endif %}
+
+
+ {# TODO: custom css and js. #}
+
+
+
diff --git a/themes/archie-zola/templates/posts.html b/themes/archie-zola/templates/posts.html
new file mode 100644
index 0000000..72b59dd
--- /dev/null
+++ b/themes/archie-zola/templates/posts.html
@@ -0,0 +1,6 @@
+{% extends "index.html" %}
+
+{% block main_content %}
+ {% set section = get_section(path="posts/_index.md") %}
+ {{ post_macros::list_title(pages=section.pages) }}
+{% endblock main_content %}
\ No newline at end of file
diff --git a/themes/archie-zola/templates/tags/list.html b/themes/archie-zola/templates/tags/list.html
new file mode 100644
index 0000000..4fcc4c4
--- /dev/null
+++ b/themes/archie-zola/templates/tags/list.html
@@ -0,0 +1,19 @@
+{% extends "index.html" %}
+
+
+{% block main_content %}
+ {{ config.extra.translations[lang][0].all_tags }}
+
+
+
+{% endblock main_content %}
diff --git a/themes/archie-zola/templates/tags/single.html b/themes/archie-zola/templates/tags/single.html
new file mode 100644
index 0000000..6e0bd11
--- /dev/null
+++ b/themes/archie-zola/templates/tags/single.html
@@ -0,0 +1,7 @@
+{% extends "index.html" %}
+
+{% block main_content %}
+
+{{ post_macros::list_title(pages=term.pages, tag_name=term.name) }}
+
+{% endblock main_content %}
\ No newline at end of file
diff --git a/themes/archie-zola/theme.toml b/themes/archie-zola/theme.toml
new file mode 100644
index 0000000..3d06227
--- /dev/null
+++ b/themes/archie-zola/theme.toml
@@ -0,0 +1,26 @@
+name = "archie-zola"
+description = "A zola theme based on Hugo archie."
+license = "MIT"
+homepage = "https://github.com/XXXMrG/archie-zola"
+# The minimum version of Zola required
+min_version = "0.14.0"
+# An optional live demo URL
+demo = "https://archie-zola.netlify.app/"
+
+# Any variable there can be overridden in the end user `config.toml`
+# You don't need to prefix variables by the theme name but as this will
+# be merged with user data, some kind of prefix or nesting is preferable
+# Use snake_casing to be consistent with the rest of Zola
+[extra]
+
+# The theme author info: you!
+[author]
+name = "Keith"
+homepage = "https://github.com/XXXMrG"
+
+# If this is porting a theme from another static site engine, provide
+# the info of the original author here
+[original]
+author = "athul"
+homepage = "https://athul.github.io/archie/"
+repo = "https://github.com/athul/archie"
\ No newline at end of file