diff --git a/Gemfile b/Gemfile index d38610b..e98428b 100644 --- a/Gemfile +++ b/Gemfile @@ -6,3 +6,7 @@ source "https://rubygems.org" gem "phlex", "~> 1.11" gem "phlexite", "~> 0.1.3" + +gem "front_matter_parser", "~> 1.0" + +gem 'phlex-markdown', git: 'https://github.com/phlex-ruby/phlex-markdown' diff --git a/Gemfile.lock b/Gemfile.lock index 829a24d..63e5706 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,6 +1,16 @@ +GIT + remote: https://github.com/phlex-ruby/phlex-markdown + revision: ee1e2763fc842563577003a269982cfc4ac79006 + specs: + phlex-markdown (0.3.0) + markly (~> 0.7) + phlex (>= 0.5) + GEM remote: https://rubygems.org/ specs: + front_matter_parser (1.0.1) + markly (0.12.1) phlex (1.11.0) phlexite (0.1.3) @@ -9,7 +19,9 @@ PLATFORMS ruby DEPENDENCIES + front_matter_parser (~> 1.0) phlex (~> 1.11) + phlex-markdown! phlexite (~> 0.1.3) BUNDLED WITH diff --git a/build.rb b/build.rb index 6c14741..91a5f38 100644 --- a/build.rb +++ b/build.rb @@ -1,15 +1,25 @@ require "phlex" +require "phlex/markdown" require "phlexite" +require "front_matter_parser" +require_relative "util/post_loader" require_relative "pages/layout" require_relative "pages/home" require_relative "pages/blog" require_relative "pages/about" +require_relative "pages/post" Phlexite::Site.new { |s| + include Util::PostLoader + s.mount "assets", on: "/" s.page "index.html", Pages::Home.new s.page "blog/index.html", Pages::Blog.new s.page "about/index.html", Pages::About.new + + posts.each do |post| + s.page "p/#{post[:slug]}/index.html", Pages::Post.new(post) + end } diff --git a/pages/blog.rb b/pages/blog.rb index 5edc831..6c91edb 100644 --- a/pages/blog.rb +++ b/pages/blog.rb @@ -1,7 +1,22 @@ class Pages::Blog < ::Phlex::HTML + include Util::PostLoader + def view_template render ::Pages::Layout.new(:blog) { - p { "under construction" } + ul { + posts.each { |post| + meta = post[:data].front_matter + + return unless meta.key?('published_on') + + li { + p { + time(datetime: meta['published_on']) { meta['published_on'] } + a(href: '/p/' + post[:slug], style: "padding-left: 10px;") { meta['title'] } + } + } + } + } } end end diff --git a/pages/layout.rb b/pages/layout.rb index 566713e..e424060 100644 --- a/pages/layout.rb +++ b/pages/layout.rb @@ -17,12 +17,18 @@ module Pages def initialize(page) @page = page + if @page.is_a? Symbol + @page_info = pages[page] + else + @page_info = @page + end end def view_template + doctype html { head { - title { pages[@page][:title] + " | Aleks Rūtiņš" } + title { @page_info[:title] + " | Aleks Rūtiņš" } meta(charset: "utf-8") meta(name: "viewport", content: "width=device-width, initial-scale=1.0") link(rel: "stylesheet", href: "/site.css") diff --git a/pages/post.rb b/pages/post.rb new file mode 100644 index 0000000..ff5c274 --- /dev/null +++ b/pages/post.rb @@ -0,0 +1,17 @@ +class Pages::Post < ::Phlex::HTML + def initialize(post) + @slug = post[:slug] + @post = post + end + def view_template + meta = @post[:data].front_matter + render ::Pages::Layout.new({title: meta['title']}) { + p { + h1 { meta['title'] } + time(datetime: meta['published_on']) { meta['published_on'] } + + render ::Phlex::Markdown.new(@post[:data].content) + } + } + end +end diff --git a/posts/2024-10-06-hello-world.md b/posts/2024-10-06-hello-world.md new file mode 100644 index 0000000..f5eda92 --- /dev/null +++ b/posts/2024-10-06-hello-world.md @@ -0,0 +1,6 @@ +--- +title: Hello World +published_on: '2024-10-06' +--- + +Hello, world. This is some **content**. diff --git a/util/post_loader.rb b/util/post_loader.rb new file mode 100644 index 0000000..ef68803 --- /dev/null +++ b/util/post_loader.rb @@ -0,0 +1,5 @@ +module Util + module PostLoader + def posts = Dir['posts/*.md'].sort.reverse.map { |filename| {slug: File.basename(filename, '.md'), data: FrontMatterParser::Parser.parse_file(filename)} } + end +end