Moving to Wyam
Dec 04, 2018 Site Wyam
I'm in the process of rejigging out my web portfolio (website, email servers etc), and since my day job involves using AWS, I figured now was a good time to begin moving there. I'm also about to embark on some electronics projects, and I wanted to have somewhere to write about what I'm doing. I really don't use my personal site much, so I figured I wanted something simple and static(ish) that I could serve from S3, perhaps with a lambda function or two at some point.
Having seen what other people are doing with the likes of Jekyll, I thought I'd go for a statically generated site too. Being a .NET developer, I wondered what there was in the way of site generator engines that ran on top of .NET Core. A quick search found Wyam, and a Blog post from Scott Hanselman exploring it a little.
That was good enough for me.
So, here I am - writing my first post inside this world. To start with, I ran a few basic commands. First up, I installed Wyam itself:
dotnet tool install -g Wyam.Tool
I created a folder to work in, and continued to follow the basic usage instructions:
wyam new --recipe Blog
And then jumped right in with:
wyam --recipe Blog --theme CleanBlog
wyam -p
This got it to self-host the site on port 5080. I tried out a few different theme options, realising that I could specify a theme using #t ThemeName
in the config.wyam
file it had generated. At this point I also quickly learned that re-running wyam -p
also does a full build, no need to perform the first step repeatedly.
Having tried a few themes, I got to the point where I wanted to go back to basics, so headed off to the GitHub repository to download the files for a basic blog theme, to essentially start styling from scratch. These files got put into a theme
subfolder, and were automatically picked up by wyam on the next wyam -p
.
Inspecting the output files, I found it still including a lot of assets and such from another theme, and looking through the console output, I saw
Input path(s):
file:///C:/Users/JamesThorpe/.nuget/packages/Wyam.Blog.CleanBlog.2.0.0/content
theme
input
So it was still using the CleanBlog theme in addition to my custom files. A quick addition to config.wyam
stopped that:
#theme theme
I noticed the default blog pipeline also includes a Less preprocessor, so followed my nose and experiemented. Within the theme
subfolder, I created assests/css
and stuck a pft.less
file within it. The default build found it and added assets/css/pft.css
to the output.
I then wrote the above, so there would be a decent amount of starting text to play with some styling :)
Stopping and restarting the preview server was getting annoying to test out the styling/templating tweaks, so I went looking and found the watch
option. I'm now running with
wyam build -p -w
Saving files causes a (very fast) rebuild without me running Wyam again. And I also just realised that it's live reloading the site itself in front of me - very nice.
I'm liking the fact I went with Wyam - being .NET based, the templates can be Razor views; something I'm familiar with. I've already tweaked and added to them - for instance there's now a partial view being fed a post as its model in a few different places to keep tag generation consistent:
@{
var tags = Model.List<string>(BlogKeys.Tags, new string[] {""});
foreach (string tag in tags.OrderBy(x => x)){
IDocument tagDocument = Documents[Blog.Tags].FirstOrDefault(x => x.String(BlogKeys.Tag)== tag && x.Get<int>(Keys.CurrentPage) == 1);
if(tagDocument != null) {
<a class="tag-link" href="@Context.GetLink(tagDocument)">@tag</a>
}
}
}
At this point, I wanted to start syntax highlighting the <code>
blocks on the site. I spent some time researching, found out about Wyam's pipelines with some pages about how to essentially create entire pipelines from scratch. All I wanted to do was to add the prettyprint
class to my <pre>
tags so I can use prettify. I figured there must be a way to alter the pipelines already defined by the Blog
recipe I wa using, and started following through various sections of the Wyam code. I eventually wound up on this page, which gave me enough information to finally add just this little snippet to my config.wyam
:
Pipelines["Pages"].InsertAfter("MarkdownFiles",
Replace("<pre><code>", "<pre class=\"prettyprint\"><code>")
);
Pipelines["BlogPosts"].InsertAfter("MarkdownPosts",
Replace("<pre><code>", "<pre class=\"prettyprint\"><code>")
);
Syntax highlighting now works.
More styling work, and refactoring of the default razor templates - all lists of posts are now being done through another partial view, so the home page, archive and tag pages are all via the same block of markup:
@model IEnumerable<IDocument>
<ul class="posts">
@foreach(var post in Model){
<li>
<a href="@Context.GetLink(post)">
<h2>@post.WithoutSettings.String(BlogKeys.Title)</h2>
</a>
@Html.Partial("_PostTagList", post)
@Html.Raw(post.String(BlogKeys.Excerpt))
<a class="read-more" href="@Context.GetLink(post)">Read more...</a>
<hr>
</li>
}
</ul>
Again, a bit of trial and error and digging into the Wyam recipe internals led me to the right explicit @model
to use for this partial view - the others have "just worked", but this one was throwing up some errors during the Razor rendering process without it.
At this point, I'm fairly happy with the overall layout and process. No one can see it yet, as it's still just sat on my local machine - the next step is publishing it up to S3, and re-pointing my domain at it. If you're reading this, it means I've now done that!
Back to posts