+
+It wasn't meant to shame any editors or highlight any particular editor's
+superiority. Mostly I thought it was interesting β opening a large but not
+ridiculously sized file proved to be a challenge for several professional
+editors running on a modern, fairly high-end desktop computer.
+
+{% aside(title="Want to see how your editor handles the file?", float="right") %}
+You can [download it](https://files.wezm.net/twitter/NotoColorEmoji.ttx.bz2),
+just be sure to uncompress it first.
+{% end %}
+
+I use Neovim for most text editing, except Rust where I use CLion and it will
+take a lot more than a once in a decade experience with one file to make me
+switch editors. The XML file in question was produced by the `ttx`
+tool. This tool generates an XML representation of a font file. It can also
+convert the XML back into a font file. I was interested in navigating to a
+specific element in the file and examining its children. I was not interested
+in the children's children.
+
+I opened the file in Neovim (which happens instantaneously despite the size).
+My planned workflow was to jump to the `CBLC` element and use folding to
+collapse the child elements. However, when I navigated to the `CBLC` element
+(98% through the file) the syntax highlighting disappeared and the following
+message was shown in the status line:
+
+> 'redrawtime' exceeded, syntax highlighting disabled
+
+`:set redrawtime` tells me it is set to 2000 (2 seconds), which is the default
+value. Additionally I have `foldmethod=syntax` so with syntax highlighting
+disabled I lose the automatic folding too (or so I thoughtβ¦).
+
+So how might the task be completed? We can increase `redrawtime`. Turns out it needs to be `10000`
+for it not to disable syntax highlighting. And there is of course a nearly 10s delay when redrawing
+now. However, folding still doesn't work.
+
+It turns out there is a setting that's required to enable syntax based folding for xml:
+
+```vim
+let g:xml_syntax_folding=1
+```
+
+If I turn this on and reopen the file, the syntax highlighting remains on but every movement
+is excruciatingly slow β I imagine this is why it's not enabled by default.
+
+So what else can we try? Well Neovim lets us navigate the file fine, the size
+is only an issue for syntax highlighting and folding. If we make the
+amount of text we're dealing with smaller everything should work.
+
+We can navigate to the `CBLC` element with `/CBLC`, the syntax highlighting
+turns off but we can still use the [tag text object][text-objects] to yank the `CBLC` element
+and its children to a new buffer: `yat` (yank outside tag) followed by `:enew`
+to open a new buffer and `p` to paste. Now we have a much smaller subset to
+deal with (3121 lines). If we enable `xml_syntax_folding` in this smaller buffer it now
+works as expected and it perfectly responsive:
+
+```vim
+:let g:xml_syntax_folding=1
+:set ft=xml
+```
+
+The kicker is that there's actually one one child `strike` element of the `CBLC` element β I was
+expecting more. With this knowledge the folding wasn't really needed. Nonetheless I learnt some
+things. π€
+
+[text-objects]: https://neovim.io/doc/user/motion.html#at
diff --git a/v2/content/posts/2020/neovim-versus-the-28-megabyte-xml-file/neovim.png b/v2/content/posts/2020/neovim-versus-the-28-megabyte-xml-file/neovim.png
new file mode 100644
index 0000000..ee7eff8
Binary files /dev/null and b/v2/content/posts/2020/neovim-versus-the-28-megabyte-xml-file/neovim.png differ
diff --git a/v2/content/posts/2020/neovim-versus-the-28-megabyte-xml-file/sublime.png b/v2/content/posts/2020/neovim-versus-the-28-megabyte-xml-file/sublime.png
new file mode 100644
index 0000000..a488b76
Binary files /dev/null and b/v2/content/posts/2020/neovim-versus-the-28-megabyte-xml-file/sublime.png differ
diff --git a/v2/content/posts/2020/neovim-versus-the-28-megabyte-xml-file/vscode.png b/v2/content/posts/2020/neovim-versus-the-28-megabyte-xml-file/vscode.png
new file mode 100644
index 0000000..6c7c4e7
Binary files /dev/null and b/v2/content/posts/2020/neovim-versus-the-28-megabyte-xml-file/vscode.png differ
diff --git a/v2/content/posts/2020/new-design.md b/v2/content/posts/2020/new-design.md
new file mode 100644
index 0000000..a200867
--- /dev/null
+++ b/v2/content/posts/2020/new-design.md
@@ -0,0 +1,47 @@
++++
+title = "New Design 2020"
+date = 2020-01-27T15:42:29+11:00
+
+# [extra]
+# updated = 2019-07-01T22:40:53+10:00
++++
+
+It's been more than 10 years since I started working on [the previous design]
+for this website π , although it won't have been public for 10 years until July
+2020. This feels like a good point to come up with a one!
+
+
+
+The previous design served me well. The uncluttered design focussed on text was
+fast and responsive. It saw the introduction of new devices like iPad and a
+gradual increase in mobile display size without needing updating. The new
+design aims to retain these features while giving it a lighter feel. I'm using
+the [Manrope] variable font for all text.
+
+Technology wise, the previous site was built with [Nanoc], a Ruby static site
+compiler. I've been very happy with Nanoc. As my programming interests have
+shifted away from Ruby to Rust in the last decade I wanted to try a Rust static
+site compiler. The site is now built with [Zola]. Zola is perhaps not quite as
+flexible as Nanoc but I've been able to achieve everything I wanted to with it.
+It's super fast and has nice conveniences like live-reload when editing
+content. Being a single file native binary also makes installation
+straightforward β no need to juggle Ruby versions or install gems.
+
+Inspired by [Chris Krycho] and [Shaun Inman] I've taken to versioning the
+website instead of attempting to port all the existing content over to the new
+technology. This makes the redesign more of a clean slate and leaves old posts
+appearing how the did when originally posted. The new site is hosted under the
+`/v2/` prefix. This allows all existing pages to stay where they are and
+retains the `www.wezm.net` domain.
+
+Finally, I've now open sourced [the repository][repo] that the site is generated from. This
+is to allow others to see how the site is built and also to submit corrections/fixes
+if they're noticed.
+
+[Chris Krycho]: https://v4.chriskrycho.com/2019/my-final-round-of-url-rewrites-ever.html
+[Shaun Inman]: https://web.archive.org/web/20160422175043/http://shauninman.com/archive/2006/12/04/the_original_heap
+[Nanoc]: https://nanoc.ws/
+[the previous design]: https://www.wezm.net/technical/2010/07/new-design/
+[Manrope]: https://manropefont.com/
+[Zola]: https://www.getzola.org/
+[repo]: https://github.com/wezm/wezm.net
diff --git a/v2/content/posts/_index.md b/v2/content/posts/_index.md
new file mode 100644
index 0000000..472d85c
--- /dev/null
+++ b/v2/content/posts/_index.md
@@ -0,0 +1,5 @@
++++
+title = "Posts"
+sort_by = "date"
+paginate_by = 5
++++
diff --git a/v2/sass/screen.scss b/v2/sass/screen.scss
new file mode 100644
index 0000000..f87a684
--- /dev/null
+++ b/v2/sass/screen.scss
@@ -0,0 +1,410 @@
+$heading-margin: 0.25em 0 0.5em 0;
+$heading-family: "Manrope VF", sans-serif;
+$link-color: hsl(204, 50.8%, 26.1%);
+
+@font-face {
+ font-family: "Manrope VF";
+ src: url("ManropeGX.ttf") format("truetype-variations");
+ font-style: normal;
+ font-weight: 200 800;
+}
+
+html {
+ background-color: #fcfcfc;
+ min-height: 100%;
+}
+body {
+ margin:40px auto;
+ max-width: 800px;
+ line-height:1.6;
+ font-family: "Manrope VF", sans-serif;
+ font-size:18px;
+ color:#444;
+ padding:0 10px;
+ display: flex;
+ flex-direction: column;
+ min-height: 100%;
+}
+body.home {
+ max-width: 1000px;
+}
+pre, code {
+ font-family: "Pragmata Pro", "Pragmata Pro Mono", "JetBrains Mono", "Iosevka", "Consolas", monospace;
+ font-size: 16px;
+}
+code {
+ background-color: #ffedf0;
+ padding: 0.1em 0.2em;
+ border-radius: 3px;
+}
+pre {
+ padding: 0.5em 1em;
+}
+h1,h2,h3,h4 {
+ font-family: $heading-family;
+ margin: $heading-margin;
+ line-height: 1.2;
+}
+h1,h2 {
+ font-weight: 300;
+}
+h3 {
+ font-weight: 400;
+}
+main img {
+ max-width: 100%;
+}
+main.home {
+ h1 {
+ text-align: center;
+ font-size: 5em;
+ font-weight: 200;
+ line-height: 1.2;
+ }
+ h2 {
+ font-size: 2em;
+ font-weight: 800;
+ }
+ h3 {
+ font-weight: 300;
+ }
+ article {
+ h3 {
+ font-size: 1.5em;
+ }
+ .post-metadata {
+ font-size: smaller;
+ color: #666;
+ }
+ .date-icon {
+ width: 20px;
+ }
+ }
+ section h2 {
+ margin-bottom: 1em;
+ }
+}
+
+a {
+ text-decoration: underline;
+}
+a:link, a:visited {
+ color: $link-color;
+}
+.hover-underline:hover {
+ border-bottom: 1px solid currentColor;
+}
+nav a:link, nav a:visited {
+ color: #666;
+}
+.intro {
+ max-width: 800px;
+ margin: 0 auto 3em;
+}
+.post-metadata {
+ display: flex;
+ flex-wrap: wrap;
+ font-weight: 500;
+ color: #555;
+
+ em {
+ color: #7a7a7a;
+ font-style: oblique 10deg;
+
+ .updated {
+ margin-right: 0.5em;
+ }
+ }
+}
+article {
+ margin-bottom: 3em;
+
+ h2,h3 {
+ a:link, a:visited {
+ color: currentColor;
+ text-decoration: none;
+ border-bottom: 2px solid currentColor;
+ }
+ }
+ h2 {
+ font-size: 2.5em;
+ }
+ h3 {
+ font-size: 2em;
+ font-weight: 300;
+ line-height: 1.5;
+ }
+ h4 {
+ font-size: 1.25em;
+ font-weight: 400;
+ }
+ blockquote {
+ border-left: 3px solid skyblue;
+ font-style: oblique 10deg;
+ background-color: hsl(197.4, 23.4%, 97.5%);
+ padding: 1px 1em;
+ margin: 1em 0;
+ clear: both;
+ }
+ aside {
+ padding: 1em 1em 0;
+ box-sizing: border-box;
+ border: 1px solid #eaeae1;
+ background-color: rgba(255, 255, 246, 0.3);
+ border-radius: 5px;
+ font-size: smaller;
+ width: 240px;
+
+ .emoji {
+ margin-bottom: 0.5em;
+ }
+ }
+ aside.float-right {
+ margin: 0 0 1em 1em;
+ }
+}
+img, canvas, iframe, video, svg {
+ max-width: 100%;
+ margin: 0 auto;
+}
+figure {
+ margin: 0 auto 1.5em;
+}
+figcaption {
+ font-size: 16px;
+ font-weight: 500;
+ text-align: center;
+}
+footer {
+ color: #888;
+ font-size: 14px;
+ border-top: 1px solid #AAA;
+ margin: 1em 0px 2em;
+ clear: both;
+}
+footer .copyright {
+ margin-top: 1em;
+}
+
+.no-border {
+ border: none;
+ text-decoration: none;
+}
+.text-center {
+ text-align: center;
+}
+.text-smaller {
+ font-size: 0.5em;
+}
+.flex {
+ display: flex;
+}
+
+.logo {
+ font-size: 1.75em;
+ a {
+ color: #555;
+ }
+}
+
+.breadcrumb-sep {
+ color: #999;
+}
+
+.tagline {
+ line-height: 2;
+ font-weight: 300;
+ font-size: 2em;
+ margin: $heading-margin;
+ font-family: $heading-family;
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: space-between;
+}
+
+.action-button {
+ background-color: $link-color;
+ border-radius: 0.25em;
+ border: 2px solid $link-color;
+ color: white;
+ display: inline-block;
+ font-size: 12px;
+ font-weight: 750;
+ margin: 0.75em 0;
+ padding: 0.5em 1em;
+ text-decoration: none;
+ text-transform: uppercase;
+}
+.action-button-ghost {
+ background-color: initial;
+ color: $link-color;
+}
+.action-button-ghost:hover {
+ background-color: $link-color;
+ color: white;
+}
+
+.posts-section {
+ width: 100%;
+}
+.projects-section {
+ width: 300px;
+ flex-shrink: 0;
+ margin-left: 2em;
+}
+ul.projects {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+
+ li {
+ margin: 1em 0;
+ }
+ img, svg {
+ width: 32px;
+ vertical-align: middle;
+ margin-right: 0.5em;
+ }
+ p {
+ margin-left: calc(32px + 0.5em);
+ font-size: smaller;
+ margin-top: 0;
+ }
+}
+
+#zola-continue-reading {
+ margin: 0;
+}
+
+.post-body h3 {
+ margin-top: 1.5em;
+}
+
+.footnote-definition {
+ font-size: smaller;
+}
+.footnote-definition-label {
+ float: left;
+ margin-right: 0.5em;
+}
+
+.date-icon {
+ width: 24px;
+ vertical-align: top;
+ margin-right: 9px;
+}
+.ornament {
+ display: inline-block;
+ margin: 0 auto;
+ width: 33px;
+ text-align: center;
+}
+.screenshot img {
+ border: 1px solid #666;
+}
+.image-right {
+ float: right;
+ margin: 0.5em 0 1em 1em;
+}
+.float-right {
+ float: right;
+}
+
+.small-caps {
+ text-transform: uppercase;
+ font-size: 14px;
+ letter-spacing: 1px;
+ font-weight: 600;
+}
+
+.three-columns {
+ columns: 3;
+
+ ul {
+ margin-top: 0;
+ margin-bottom: 0;
+ }
+}
+
+.socials {
+ margin-top: 1em;
+
+ a {
+ text-transform: uppercase;
+ font-weight: 600;
+ font-size: 12px;
+ letter-spacing: 1px;
+ color: #888;
+ padding: 0 0.5em;
+ text-decoration: none;
+ }
+}
+
+@media screen and (max-width: 800px) {
+ .tagline {
+ display: initial;
+ }
+ .emoji-pair {
+ text-align: center;
+ }
+ .home .flex {
+ flex-direction: column
+ }
+ .projects-section {
+ margin: 0;
+ width: auto;
+ }
+}
+@media screen and (max-width: 600px) {
+ article {
+ h2 {
+ a:link, a:visited {
+ border-bottom: none;
+ }
+ }
+ }
+}
+@media screen and (max-width: 375px) {
+ main.home {
+ h1 {
+ font-size: 4em;
+ }
+ }
+ article {
+ aside {
+ width: auto;
+
+ &.float-right, &.float-left {
+ float: none;
+ margin-left: 0;
+ margin-right: 0;
+ }
+ }
+ }
+ footer {
+ font-size: 16px;
+ }
+ .tagline {
+ font-size: 1.75em;
+ }
+ .date-published {
+ margin-top: 0.75em;
+ }
+ .ornament {
+ visibility: hidden;
+ }
+ .date-updated {
+ margin-top: 0.5em;
+ position: relative;
+ left: -33px;
+ }
+ .socials {
+ text-align: center;
+
+ a {
+ font-size: 14px;
+ line-height: 3;
+ padding: 0 1em;
+ }
+ }
+}
diff --git a/v2/static/ManropeGX.ttf b/v2/static/ManropeGX.ttf
new file mode 100644
index 0000000..de4f379
Binary files /dev/null and b/v2/static/ManropeGX.ttf differ
diff --git a/v2/static/images/Photo of Wesley Moore.jpg b/v2/static/images/Photo of Wesley Moore.jpg
new file mode 100644
index 0000000..b55b974
Binary files /dev/null and b/v2/static/images/Photo of Wesley Moore.jpg differ
diff --git a/v2/static/images/keyboards.jpg b/v2/static/images/keyboards.jpg
new file mode 100644
index 0000000..a60e84c
Binary files /dev/null and b/v2/static/images/keyboards.jpg differ
diff --git a/v2/static/images/read-rust.svg b/v2/static/images/read-rust.svg
new file mode 100644
index 0000000..1b4a935
--- /dev/null
+++ b/v2/static/images/read-rust.svg
@@ -0,0 +1,9 @@
+
diff --git a/v2/templates/article.html b/v2/templates/article.html
new file mode 100644
index 0000000..514396f
--- /dev/null
+++ b/v2/templates/article.html
@@ -0,0 +1,14 @@
+
+