V2 #1

Merged
danieljsummers merged 102 commits from v2 into main 2022-06-23 00:35:12 +00:00
12 changed files with 582 additions and 4 deletions
Showing only changes of commit f106f2b10e - Show all commits

View File

@ -14,6 +14,7 @@
<ItemGroup>
<PackageReference Include="Markdig" Version="0.30.2" />
<PackageReference Update="FSharp.Core" Version="6.0.3" />
<PackageReference Include="Markdown.ColorCode" Version="1.0.1" />
</ItemGroup>
</Project>

View File

@ -1,7 +1,6 @@
namespace MyWebLog
open System
open Markdig
/// Support functions for domain definition
[<AutoOpen>]
@ -55,6 +54,9 @@ type CommentStatus =
| Spam
open Markdig
open Markdown.ColorCode
/// Types of markup text
type MarkupText =
/// Markdown text
@ -66,7 +68,7 @@ type MarkupText =
module MarkupText =
/// Pipeline with most extensions enabled
let private _pipeline = MarkdownPipelineBuilder().UseSmartyPants().UseAdvancedExtensions().Build ()
let private _pipeline = MarkdownPipelineBuilder().UseSmartyPants().UseAdvancedExtensions().UseColorCode().Build ()
/// Get the source type for the markup text
let sourceType = function Markdown _ -> "Markdown" | Html _ -> "HTML"

View File

@ -23,11 +23,14 @@
<footer>
<p>
{%- if category_count > 0 -%}
Categorized under: {{ cat_names | reverse | join: ", " }}
{%- for cat in post.category_ids -%}
{%- assign cat_names = model.categories | value: cat | split: "," | concat: cat_names -%}
{%- assign this_cat = categories | where: "id", cat | first -%}
{{ this_cat.name }},
{%- assign cat_names = this_cat.name | concat: cat_names -%}
{%- endfor -%}
Categorized under: {{ cat_names | reverse | join: ", " }}<br>
{%- assign cat_names = "" -%}
<br>
{% endif -%}
{%- if tag_count > 0 %}
Tagged: {{ post.tags | join: ", " }}

View File

@ -0,0 +1,44 @@
{% if is_category or is_tag %}
<h1>{{ page_title }}</h1>
{%- if subtitle %}
<p>{{ subtitle }}</p>
{%- endif %}
{% endif %}
{%- for post in model.posts %}
<article class="auto">
<div>
<h1 class="home-title">
<small class="home-lead">{{ post.published_on | date: "dddd, MMMM d, yyyy" }}</small><br>
&nbsp;
<a href="/{{ post.permalink }}" title="Permanent Link to &quot;{{ post.title | strip_html | escape }}&quot;">
{{ post.title }}
</a>
</h1>
</div>
<div class="entry-content">{{ post.text }}</div>
{%- assign cat_count = post.category_ids | size -%}
{%- if cat_count > 0 %}
<small class="category-list">
Categorized under
{%- for cat_id in post.category_ids %}
{%- assign cat = categories | where: "id", cat_id | first -%}
<span>
<a href="/category/{{ cat.slug }}/"
title="Categorized under {{ cat.name | strip_html | escape }}" rel="tag">{{ cat.name }}</a></span>
{%- endfor %}
</small><br>
{%- endif %}
{%- assign tag_count = post.tags | size -%}
{%- if tag_count > 0 %}
<small class="category-list">
Tagged
{%- for tag in post.tags %}
<span>
<a href="/tag/{{ tag | replace: " ", "+" }}/"
title="Tagged &ldquo;{{ tag | escape }}&rdquo;" rel="tag">{{ tag }}</a></span>
{%- endfor %}
</small><br>
{%- endif %}
{%- if logged_on %}<small><a href="/post/{{ post.id }}/edit">Edit Post</a></small>{% endif %}
</article>
{%- endfor %}

View File

@ -0,0 +1,86 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="generator" content="{{ generator }}">
<title>
{%- if is_home %}
{{ web_log.name }}{% if web_log.subtitle %} | {{ web_log.subtitle.value }}{% endif %}
{%- else %}
{{ page_title | strip_html }}{% if page_title and page_title != "" %} &raquo; {% endif %}{{ web_log.name }}
{%- endif %}
</title>
<link rel="stylesheet" href="/themes/tech-blog/style.css">
{% comment %}link(rel='canonical' href=config.url + url_for(page.path.replace('index.html', ''))) {% endcomment %}
{%- if is_home %}
<link rel="alternate" type="application/rss+xml"
title="{{ web_log.name }}" href="https://{{ web_log.urlBase }}/feed.xml">
{%- endif %}
</head>
<body>
<header class="site-header">
<div class="header-logo">
<a href="/">
<img src="/themes/tech-blog/img/bitbadger.png"
alt="A cartoon badger looking at a computer screen, with his paw on a mouse"
title="Bit Badger Solutions">
</a>
</div>
<div class="header-title"><a href="/">The Bit Badger Blog</a></div>
<div class="header-spacer">&nbsp;</div>
<div class="header-social">
<a href="/feed.xml" title="Subscribe to The Bit Badger Blog via RSS">
<img src="/themes/tech-blog/img/rss.png" alt="RSS">
</a> &nbsp; &nbsp;
<a href="https://twitter.com/Bit_Badger" title="Bit_Badger on Twitter">
<img src="/themes/tech-blog/img/twitter.png" alt="Twitter">
</a> &nbsp; &nbsp;
<a href="https://www.facebook.com/bitbadger.solutions" title="Bit Badger Solutions on Facebook">
<img src="/themes/tech-blog/img/facebook.png" alt="Facebook">
</a>
</div>
</header>
<div class="content-wrapper">
<div id="content" role="main">
{{ content }}
</div>
<aside class="blog-sidebar">
<div>
<div class="sidebar-head">Linux Resources</div>
<ul><li><a href="/linux/">Browse Resources</a></li></ul>
</div>
<div>
<div class="sidebar-head">Categories</div>
<ul class="cat-list">
{% for cat in categories -%}
{%- assign indent = cat.parent_names | size -%}
<li class="cat-list-item"{% if indent > 0 %} style="padding-left:{{ indent }}rem;"{% endif %}>
<a href="/category/{{ cat.slug }}/" class="cat-list-link">{{ cat.name }}</a>
<span class="cat-list-count">{{ cat.post_count }}</span>
</li>
{%- endfor %}
</ul>
</div>
</aside>
</div>
<footer>
<span>
A production of
<a href="https://bitbadger.solutions" title="Bit Badger Solutions" target="_blank" rel="noopener">
Bit Badger Solutions
</a>
</span>
<span>
Powered by <a href="https://github.com/bit-badger/myWebLog/tree/v2" target="_blank" rel="noopener">myWebLog</a>
&bull;
{% if logged_on %}
<a href="/admin">Dashboard</a>
{% else %}
<a href="/user/log-on">Log On</a>
{%- endif %}
</span>
</footer>
</body>
</html>

View File

@ -0,0 +1,5 @@
<article class="auto">
<h1 class="entry-title">{{ page.title }}</h1>
<div class="entry-content">{{ page.text }}</div>
{%- if logged_on %}<p><small><a href="/page/{{ page.id }}/edit">Edit Page</a></small></p>{% endif %}
</article>

View File

@ -0,0 +1,41 @@
{%- assign post = model.posts | first -%}
<article class="auto">
<h1 class="entry-title">
{{ post.title }}<br>
<span class="entry-meta">
Posted by {{ model.authors | value: post.author_id }} on {{ post.published_on | date: "dddd, MMMM d, yyyy" }}
at {{ post.published_on | date: "h:mm tt" | downcase }}
{%- assign cat_count = post.category_ids | size -%}
{%- if cat_count > 0 %}
<br>
<small class="category-list">
Categorized under
{%- for cat_id in post.category_ids %}
{%- assign cat = categories | where: "id", cat_id | first -%}
<span>
<a href="/category/{{ cat.slug }}/"
title="Categorized under {{ cat.name | strip_html | escape }}" rel="tag">{{ cat.name }}</a></span>
{%- endfor %}
</small>
{%- endif %}
</span>
</h1>
<div class="entry-content">{{ post.text }}</div>
<div class="entry-footer">
{%- assign tag_count = post.tags | size -%}
{%- if tag_count > 0 %}
<span class="category-list">
Tagged
{%- for tag in post.tags %}
<span>
<a href="/tag/{{ tag | replace: " ", "+" }}/"
title="Tagged &ldquo;{{ tag | escape }}&rdquo;" rel="tag">{{ tag }}</a></span>
{%- endfor %}
</span> &bull;
{%- endif %}
Bookmark the
<a href="/{{ post.permalink }}" rel="bookmark"
title="Permanent link to &ldquo;{{ post.title | strip_html | escape }}&rdquo;">permalink</a>
{%- if logged_on %} &bull; <a href="/post/{{ post.id }}/edit">Edit Post</a>{% endif %}
</div>
</article>

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -0,0 +1,396 @@
@import url('https://fonts.googleapis.com/css?family=Oswald|Raleway');
@font-face {
font-family: 'JetBrains Mono';
src: url('https://raw.githubusercontent.com/JetBrains/JetBrainsMono/master/fonts/webfonts/JetBrainsMono-Regular.woff2') format('woff2'),
url('https://raw.githubusercontent.com/JetBrains/JetBrainsMono/master/fonts/ttf/JetBrainsMono-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
html {
background-color: lightgray;
}
body, .entry-meta {
font-family: "Raleway", "Segoe UI", Ubuntu, Tahoma, "DejaVu Sans", "Liberation Sans", Arial, sans-serif;
}
body {
margin: 0px;
background-color: #FFFAFA;
}
a {
color: navy;
text-decoration: none;
}
a:hover {
border-bottom: dotted 1px navy;
}
a img {
border:0;
}
acronym {
border-bottom:dotted 1px black;
}
header, h1, h2, h3, footer a, .home-lead a, .highlight {
font-family: "Oswald", "Segoe UI", Ubuntu, "DejaVu Sans", "Liberation Sans", Arial, sans-serif;
}
h1 {
text-align: center;
margin: 1.4rem 0;
font-size: 2rem;
}
h2 {
margin: 1.2rem 0;
}
h3 {
margin: 1rem 0;
}
h2, h3 {
border-bottom: solid 2px navy;
}
@media all and (min-width:40rem) {
h2, h3 {
width: 80%;
}
}
p {
margin: 1rem 0;
}
code, pre {
font-family: "JetBrains Mono","SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;
font-size: 1rem;
}
code {
background-color: rgba(0, 0, 0, .1);
padding: 0 .25rem;
}
#content {
margin: 0 1rem;
font-size: 1.1rem;
}
.auto {
margin: 0 auto;
}
@media all and (min-width: 68rem) {
.content {
width: 66rem;
}
}
.hdr {
font-size: 14pt;
font-weight: bold;
}
.site-header {
height: 100px;
display: flex;
flex-direction: row;
justify-content: space-between;
background-image: -webkit-gradient(linear, left top, left bottom, from(lightgray), to(#FFFAFA));
background-image: -webkit-linear-gradient(top, lightgray, #FFFAFA);
background-image: -moz-linear-gradient(top, lightgray, #FFFAFA);
background-image: linear-gradient(to bottom, lightgray, #FFFAFA);
}
.site-header a:link, .site-header a:visited {
color: black;
}
.site-header a:hover {
border-bottom:none;
}
.header-title {
font-size: 3rem;
font-weight: bold;
line-height: 100px;
text-align: center;
}
.header-spacer {
flex-grow: 3;
}
.header-social {
padding: 25px .8rem 0 0;
}
.header-social img {
width: 50px;
height: 50px;
}
@media all and (max-width:40rem) {
.site-header {
height: auto;
flex-direction: column;
align-items: center;
}
.header-title {
line-height: 3rem;
}
.header-spacer {
display: none;
}
.header-social {
padding-right: 0;
}
}
.content-item {
padding-left: 5px;
padding-right: 5px;
font-size: 1rem;
}
article.page .metadata {
display: none;
}
.strike {
text-decoration: line-through;
}
.category-list span:after {
content: ", ";
}
.category-list span:last-of-type:after {
content: "";
}
footer {
padding: 20px 15px 10px 15px;
display: flex;
flex-direction: row;
justify-content: space-between;
font-size: 1rem;
color: black;
clear: both;
background-image: -webkit-gradient(linear, left top, left bottom, from(#FFFAFA), to(lightgray));
background-image: -webkit-linear-gradient(top, #FFFAFA, lightgray);
background-image: -moz-linear-gradient(top, #FFFAFA, lightgray);
background-image: linear-gradient(to bottom, #FFFAFA, lightgray);
}
footer a:link, footer a:visited {
color: black;
}
.alignleft {
float:left;
padding-right: 5px;
}
ul {
padding-left: 40px;
}
li {
list-style-type: disc;
}
.content-wrapper {
margin: 0 1rem;
}
@media all and (min-width: 80rem) {
.content-wrapper {
margin: 0;
display: flex;
flex-flow: row;
align-items: flex-start;
justify-content: space-around;
}
}
.home-title {
text-align: left;
line-height: 2rem;
}
.home-lead {
font-family: "Raleway", "Segoe UI", Ubuntu, Tahoma, "DejaVu Sans", "Liberation Sans", Arial, sans-serif;
font-size: 1.2rem;
}
.home-break {
width: 80%;
border: dotted 1px lightgray;
border-bottom: 0;
}
.blog-sidebar {
border-top: dotted 1px lightgray;
padding-top: 1rem;
font-size: 1rem;
display: flex;
flex-flow: row wrap;
justify-content: space-around;
}
.blog-sidebar ul {
padding-left: 1rem;
}
.blog-sidebar > ul {
padding: 0;
margin: 0;
}
.blog-sidebar li {
list-style: none;
}
.blog-sidebar li:before {
content: '» ';
}
@media all and (min-width: 68rem) {
.blog-sidebar {
width: 66rem;
margin: auto;
}
}
@media all and (min-width: 80rem) {
.blog-sidebar {
width: 12rem;
border-top: none;
border-left: dotted 1px lightgray;
padding-top: 0;
padding-left: 2rem;
margin: 0;
flex-direction: column;
}
}
.blog-sidebar a {
font-size: 10pt;
font-family: sans-serif;
}
.sidebar-head {
text-align: center;
font-family: "Oswald", "Segoe UI", Ubuntu, "DejaVu Sans", "Liberation Sans", Arial, sans-serif;
font-weight: bold;
color: maroon;
margin-bottom: .8rem;
padding: 3px 12px;
border-bottom: solid 2px lightgray;
font-size: 1rem;
}
.app-sidebar-name, .app-sidebar-description {
margin: 0;
padding: 0;
}
.app-sidebar-description {
font-style: italic;
color: #555555;
padding-bottom: .6rem;
}
.content {
font-size: 1.1rem;
}
.auto {
margin: 0 auto;
}
.auto > div {
max-width: 66rem;
}
@media all and (min-width: 68rem) {
.content {
width: 66rem;
}
}
.entry-title {
line-height: 1.5rem;
}
.entry-meta {
font-size: 1rem;
}
.cat-list-count {
padding-left: .3rem;
font-size: .8rem;
}
.cat-list-count:before {
content: '(';
}
.cat-list-count:after {
content: ')';
}
.bottom-nav {
display: flex;
flex-flow: row wrap;
justify-content: space-between;
padding-top: 1.5rem;
}
figure.highlight {
background-color: #F8F8F8;
}
figure.highlight table {
background-color: #002b36;
width: 100%;
}
figure.highlight td.gutter,
figure.highlight td.code,
figure.highlight pre {
padding: 0;
border: 0;
background-color: #002b36;
color: #839496;
}
figure.highlight td.gutter {
text-align:right;
padding-right: .4rem;
}
figure.highlight td.gutter div.line:after {
content: ':';
color: #586e75;
}
figure.highlight td.code pre div.line:after {
content: '.';
visibility: hidden;
}
figure.highlight pre div.line,
figure.highlight pre div.line > * {
font-family: Consolas,"Courier New",Courier,monospace !important;
}
figure.highlight {
display: block;
overflow-x: auto;
padding: 0.5em;
color: #839496;
border:1px dashed #ddd;
}
figure.highlight .comment,
figure.highlight .quote {
color: #586e75;
}
/* Solarized Green */
figure.highlight .keyword,
figure.highlight .selector-tag,
figure.highlight .addition {
color: #859900;
}
/* Solarized Cyan */
figure.highlight .number,
figure.highlight .string,
figure.highlight .meta .meta-string,
figure.highlight .literal,
figure.highlight .doctag,
figure.highlight .regexp {
color: #2aa198;
}
/* Solarized Blue */
figure.highlight .title,
figure.highlight .section,
figure.highlight .name,
figure.highlight .selector-id,
figure.highlight .selector-class {
color: #268bd2;
}
/* Solarized Yellow */
figure.highlight .attribute,
figure.highlight .attr,
figure.highlight .variable,
figure.highlight .template-variable,
figure.highlight .class .title,
figure.highlight .type {
color: #b58900;
}
/* Solarized Orange */
figure.highlight .symbol,
figure.highlight .bullet,
figure.highlight .subst,
figure.highlight .meta,
figure.highlight .meta .keyword,
figure.highlight .selector-attr,
figure.highlight .selector-pseudo,
figure.highlight .link {
color: #cb4b16;
}
/* Solarized Red */
figure.highlight .built_in,
figure.highlight .deletion {
color: #dc322f;
}
figure.highlight .formula {
background: #eee8d5;
}
figure.highlight .emphasis {
font-style: italic;
}
figure.highlight .strong {
font-weight: bold;
}