Current section
Files
Jump to
Current section
Files
lib/generator.ex
defmodule Reblog.Generator do
require Logger
@moduledoc """
Reblog generator to initialize new blogs.
"""
def generate(name) do
id = Recase.to_kebab(name)
try do
File.mkdir_p!(id)
File.mkdir!(Path.join(id, "posts"))
File.mkdir!(Path.join(id, "pages"))
# Generate blog base layout.
File.write!(Path.join(id, ".layout.eex"), """
<!DOCTYPE html>
<html lang="en">
<head>
<title><%= @title %></title>
<!-- Required Tags -->
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Content Tags -->
<meta name="keywords" content="<% if assigns[:keywords] do %><%= Enum.each(@keywords, fn(keyword) -> keyword end) %><% end %>">
<% if assigns[:description] do %>
<meta name="description" content="<%= @description %>">
<meta name="subject" content="<%= @description %>">
<% else %>
<meta name="description" content="Reblog generated blog.">
<meta name="subject" content="Reblog generated blog.">
<% end %>
<meta name="language" content="en">
<meta name="robots" content="index,follow">
<meta name="googlebot" content="index,follow">
<meta name="google" content="nositelinkssearchbox">
<meta name="revised" content="<%= @generated_time %>">
<meta name="abstract" content="">
<meta name="topic" content="">
<meta name="summary" content="">
<meta name="author" content="">
<meta name="referrer" content="never">
<meta name="revisit-after" content="7 days">
<!-- Cache Control Tags -->
<meta http-equiv="Expires" content="0">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<% if assigns[:canonical_url] do %>
<link rel="canonical" href="<%= @canonical_url %>">
<% end %>
<link rel="shortcut icon" href="assets/favicon.svg">
<style>
.logo {
background-color: #232323;
}
.logo-link {
fill: #fff;
}
</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/snap.svg/0.5.1/snap.svg-min.js"></script>
</head>
<body>
<header id="header">
<div class="logo">
<a href="/" class="logo-link">
<!-- Dynamic SVG insert -->
</a>
</div>
<div>
<nav class="nav nav-inline">
<a class="nav-link active" href="/index.html">Home</a>
<a class="nav link" href="/projects/pages/0/index.html">Projects</a>
<a class="nav-link" href="#">Categories</a>
<a class="nav-link" href="#">Tags</a>
<a class="nav-link" href="/about/index.html">About</a>
</nav>
</div>
</header>
<section id="content">
<%= @body %>
</section>
<footer id="footer">
<div>
<span>Copyright 2018 <%= @name %></span>
<span>
Built using
<a href="https://github.com/Nate-Wilkins/reblog">Reblog</a>
on <%= @generated_time %>
</span>
</div>
</footer>
<script type="text/javascript">
Snap.load("/assets/logo.svg", (fragment) => {
document.querySelector('.logo-link').append(fragment.node);
});
</script>
</body>
</html>
""")
# Generate posts layout - pagination.
File.write!(Path.absname(Path.join([id, "posts", ".layout.eex"])), """
<!-- Page Posts -->
<%= Enum.map(@pagination_posts, fn(post) -> %>
<h1><a href="<%= post.url %>"><%= post.title %></a></h1>
<p class="author">
<%= post.author %>
<span class="date"><%= post.date %></span>
</p>
<div class="excerpt">
<%= post.excerpt %>
</div>
<% end) %>
<!-- Pagination Links -->
<div class="pagination">
<% if assigns[:previous_page_number] do %>
<a href="<%= @previous_page_path %>" class="previous">Previous</a>
<% else %>
<span class="previous">Previous</span>
<% end %>
<span class="page-number">
Page: <%= @current_page + 1 %> of <%= @total_pages %>
</span>
<% if assigns[:next_page_number] do %>
<a href="<%= @next_page_path %>" class="next">Next</a>
<% else %>
<span class="next">Next</span>
<% end %>
</div>
""")
# Generate example post.
{{year, month, day}, _} = :calendar.local_time()
padded_month = String.pad_leading(Integer.to_string(month), 2, "0")
padded_day = String.pad_leading(Integer.to_string(day), 2, "0")
example_posts_path =
Path.join([id, "posts", "#{year}-#{padded_month}-#{padded_day}_hello-world.md"])
File.write!(example_posts_path, """
---
title: Hello
author: Nate-Wilkins
---
Welcome to a newly generated
[reblog](https://github.com/Nate-Wilkins/reblog)!
Hello reblog user!
If you need any help or have any issues with reblog feel free to post
a new issue at
[reblog/issues](https://github.com/Nate-Wilkins/sblog/issues)!
""")
# Generate example page.
File.write!(Path.join([id, "pages", "about.eex"]), """
<div class="about">
<%= @name %> >> INSERT ABOUT <<
</div>
""")
File.mkdir!(Path.join(id, "assets"))
# Generate favicon - same as root `favicon.svg`.
File.write!(Path.join([id, "assets", "favicon.svg"]), """
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="isolation:isolate" viewBox="0 0 200 100" width="200" height="100">
<defs>
<style type="text/css">
@import url('https://fonts.googleapis.com/css?family=Oswald|Mitr');
</style>
<clipPath id="_clipPath_W3tdsM510IhXe12TbzEyoQUOIDDw9eX1">
<rect width="200" height="100" />
</clipPath>
</defs>
<g clip-path="url(#_clipPath_W3tdsM510IhXe12TbzEyoQUOIDDw9eX1)">
<g transform="matrix(1,0,0,1,17,-20)">
<text transform="matrix(1,0,0,1,0,90)" style="font-family:"Oswald";font-weight:400;font-size:34px;font-style:normal;stroke:none;">re</text>
<text transform="matrix(1,0,0,1,27,90)" style="font-family:"Mitr";font-weight:400;font-size:60px;font-style:normal;stroke:none;">blog</text>
</g>
</g>
</svg>
""")
File.write!(Path.join([id, "assets", "logo.svg"]), """
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="isolation:isolate" viewBox="0 0 200 100" width="200" height="100">
<defs>
<style type="text/css">
@import url('https://fonts.googleapis.com/css?family=Oswald|Mitr');
</style>
<clipPath id="_clipPath_W3tdsM510IhXe12TbzEyoQUOIDDw9eX1">
<rect width="200" height="100" />
</clipPath>
</defs>
<g clip-path="url(#_clipPath_W3tdsM510IhXe12TbzEyoQUOIDDw9eX1)">
<g transform="matrix(1,0,0,1,17,-20)">
<text transform="matrix(1,0,0,1,0,90)" style="font-family:"Oswald";font-weight:400;font-size:34px;font-style:normal;stroke:none;">re</text>
<text transform="matrix(1,0,0,1,27,90)" style="font-family:"Mitr";font-weight:400;font-size:60px;font-style:normal;stroke:none;">blog</text>
</g>
</g>
</svg>
""")
# TODO: should have time output?
Logger.info(fn ->
[IO.ANSI.green(), "Initialized #{name} successfully.", IO.ANSI.reset()]
end)
{:ok}
rescue
e in RuntimeError -> {:error, e}
end
end
end