V2 #1
|
@ -26,6 +26,7 @@
|
|||
<PackageReference Include="Giraffe" Version="6.0.0" />
|
||||
<PackageReference Include="Giraffe.Htmx" Version="1.7.0" />
|
||||
<PackageReference Include="Giraffe.ViewEngine.Htmx" Version="1.7.0" />
|
||||
<PackageReference Include="NeoSmart.Caching.Sqlite" Version="6.0.1" />
|
||||
<PackageReference Include="RethinkDB.DistributedCache" Version="1.0.0-rc1" />
|
||||
<PackageReference Update="FSharp.Core" Version="6.0.5" />
|
||||
<PackageReference Include="System.ServiceModel.Syndication" Version="6.0.0" />
|
||||
|
|
|
@ -58,6 +58,7 @@ open Giraffe.EndpointRouting
|
|||
open Microsoft.AspNetCore.Authentication.Cookies
|
||||
open Microsoft.AspNetCore.Builder
|
||||
open Microsoft.AspNetCore.HttpOverrides
|
||||
open NeoSmart.Caching.Sqlite
|
||||
open RethinkDB.DistributedCache
|
||||
|
||||
[<EntryPoint>]
|
||||
|
@ -97,17 +98,16 @@ let rec main args =
|
|||
|> ignore
|
||||
| :? SQLiteData ->
|
||||
// ADO.NET connections are designed to work as per-request instantiation
|
||||
builder.Services.AddScoped<SqliteConnection> (fun sp ->
|
||||
let cfg = sp.GetRequiredService<IConfiguration> ()
|
||||
builder.Services.AddScoped<SqliteConnection> (fun sp ->
|
||||
let conn = new SqliteConnection (cfg.GetConnectionString "SQLite")
|
||||
SQLiteData.setUpConnection conn |> Async.AwaitTask |> Async.RunSynchronously
|
||||
conn)
|
||||
|> ignore
|
||||
builder.Services.AddScoped<IData, SQLiteData> () |> ignore
|
||||
let log = sp.GetRequiredService<ILoggerFactory> ()
|
||||
let logger = log.CreateLogger "MyWebLog.StartUp"
|
||||
logger.LogWarning "Session caching is not yet implemented via SQLite; using memory cache for sessions"
|
||||
builder.Services.AddDistributedMemoryCache () |> ignore
|
||||
// Use SQLite for caching as well
|
||||
let cachePath = defaultArg (Option.ofObj (cfg.GetConnectionString "SQLiteCachePath")) "./session.db"
|
||||
builder.Services.AddSqliteCache (fun o -> o.CachePath <- cachePath) |> ignore
|
||||
| _ -> ()
|
||||
| None ->
|
||||
invalidOp "There is no data configuration present; please add a RethinkDB section or LiteDB connection string"
|
||||
|
|
|
@ -3,8 +3,6 @@
|
|||
{% endif %}
|
||||
<section class="container" aria-label="The posts for the page">
|
||||
{% for post in model.posts %}
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<article>
|
||||
<h1>
|
||||
<a href="{{ post | relative_link }}" title="Permanent link to "{{ post.title | escape }}"">
|
||||
|
@ -23,10 +21,10 @@
|
|||
<footer>
|
||||
<p>
|
||||
{%- if category_count > 0 -%}
|
||||
Categorized under: {{ cat_names | reverse | join: ", " }}
|
||||
{%- for cat in post.category_ids -%}
|
||||
Categorized under:
|
||||
{% for cat in post.category_ids -%}
|
||||
{%- assign this_cat = categories | where: "id", cat | first -%}
|
||||
{{ this_cat.name }},
|
||||
{{ this_cat.name }}{% unless forloop.last %}, {% endunless %}
|
||||
{%- assign cat_names = this_cat.name | concat: cat_names -%}
|
||||
{%- endfor -%}
|
||||
{%- assign cat_names = "" -%}
|
||||
|
@ -40,19 +38,15 @@
|
|||
{% endif %}
|
||||
<hr>
|
||||
</article>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</section>
|
||||
<nav aria-label="pagination">
|
||||
<ul class="pager">
|
||||
<ul class="pagination justify-content-evenly mt-2">
|
||||
{% if model.newer_link -%}
|
||||
<li class="previous item"><a href="{{ model.newer_link.value }}">« Newer Posts</a></li>
|
||||
{%- else -%}
|
||||
<li></li>
|
||||
<li class="page-item"><a class="page-link" href="{{ model.newer_link.value }}">« Newer Posts</a></li>
|
||||
{% endif %}
|
||||
{% if model.older_link -%}
|
||||
<li class="next item"><a href="{{ model.older_link.value }}">Older Posts »</a></li>
|
||||
<li class="page-item"><a class="page-link" href="{{ model.older_link.value }}">Older Posts »</a></li>
|
||||
{%- endif -%}
|
||||
</ul>
|
||||
</nav>
|
||||
</section>
|
||||
|
|
|
@ -21,13 +21,12 @@
|
|||
{% if web_log.subtitle -%}
|
||||
<span class="navbar-text">{{ web_log.subtitle.value | escape }}</span>
|
||||
{%- endif %}
|
||||
{% if page_list -%}
|
||||
<ul class="navbar-nav">
|
||||
{% for pg in page_list -%}
|
||||
{{ pg.permalink | nav_link: pg.title }}
|
||||
{%- endfor %}
|
||||
</ul>
|
||||
{% unless web_log.default_page == "posts" %}{{ "page/1" | nav_link: "Posts" }}{% endunless %}
|
||||
{% if page_list -%}
|
||||
{% for pg in page_list %}{{ pg.permalink | nav_link: pg.title }}{% endfor %}
|
||||
{%- endif %}
|
||||
</ul>
|
||||
{% user_links %}
|
||||
</div>
|
||||
</div>
|
||||
|
@ -53,7 +52,7 @@
|
|||
<footer>
|
||||
<hr>
|
||||
<div class="container-fluid text-end">
|
||||
<img src="{{ "themes/admin/logo-dark.png" | relative_link }}" alt="myWebLog">
|
||||
<img src="{{ "themes/admin/logo-dark.png" | relative_link }}" alt="myWebLog" width="120" height="34">
|
||||
</div>
|
||||
</footer>
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js"
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<h2 class="py-3">{{ page.title }}</h2>
|
||||
<article>
|
||||
<article class="container">
|
||||
{{ page.text }}
|
||||
</article>
|
||||
|
|
|
@ -1,74 +1,59 @@
|
|||
{%- assign post = model.posts | first -%}
|
||||
<div class="content single">
|
||||
<article class="item">
|
||||
<h1 class="item-heading">{{ post.title }}</h1>
|
||||
<h4 class="post-meta">
|
||||
<h1>{{ post.title }}</h1>
|
||||
<h4 class="item-meta text-muted">
|
||||
{% if post.published_on -%}
|
||||
<span title="Published On">
|
||||
<i class="fa fa-calendar"></i> {{ post.published_on | date: "dddd, MMMM d, yyyy" }}
|
||||
</span>
|
||||
<span title="Published At">
|
||||
<i class="fa fa-clock-o"></i> {{ post.published_on | date: "h:mm tt" | downcase }}
|
||||
</span>
|
||||
Published {{ post.published_on | date: "dddd, MMMM d, yyyy" }}
|
||||
at {{ post.published_on | date: "h:mm tt" | downcase }}
|
||||
{%- else -%}
|
||||
<span>**DRAFT**</span>
|
||||
{% endif %}
|
||||
<span title="Author"><i class="fa fa-user"></i> {{ model.authors | value: post.author_id }}</span>
|
||||
{% if logged_on %}
|
||||
<span>
|
||||
<a hx-boost="false" href="{{ post | edit_post_link }}">
|
||||
<i class="fa fa-pencil-square-o"></i> Edit Post
|
||||
</a>
|
||||
</span>
|
||||
**DRAFT**
|
||||
{% endif %}
|
||||
by {{ model.authors | value: post.author_id }}
|
||||
{% if logged_on %} • <a hx-boost="false" href="{{ post | edit_post_link }}">Edit Post</a> {% endif %}
|
||||
</h4>
|
||||
<div>
|
||||
<article class="container mt-3">
|
||||
<div>{{ post.text }}</div>
|
||||
{%- assign cat_count = post.category_ids | size -%}
|
||||
{% if cat_count > 0 -%}
|
||||
<h4>
|
||||
Categorized
|
||||
<h4 class="item-meta text-muted">
|
||||
Categorized under
|
||||
{% for cat_id in post.category_ids -%}
|
||||
{% assign cat = categories | where: "id", cat_id | first %}
|
||||
<span class="no-wrap">
|
||||
<i class="fa fa-folder-open-o" title="Category"></i>
|
||||
<span class="text-nowrap">
|
||||
<a href="{{ cat | category_link }}" title="Categorized under “{{ cat.name | escape }}”">
|
||||
{{ cat.name }}
|
||||
</a>
|
||||
</a>
|
||||
</span>
|
||||
{% unless forloop.last %} • {% endunless %}
|
||||
{%- endfor %}
|
||||
</h4>
|
||||
{%- endif %}
|
||||
{%- assign tag_count = post.tags | size -%}
|
||||
{% if tag_count > 0 -%}
|
||||
<h4>
|
||||
Tagged
|
||||
<h4 class="item-meta text-muted">
|
||||
Tagged
|
||||
{% for tag in post.tags %}
|
||||
<span class="no-wrap">
|
||||
<a href="{{ tag | tag_link }}" title="Posts tagged “{{ tag | escape }}”" rel="tag">
|
||||
<i class="fa fa-tag"></i> {{ tag }}
|
||||
</a>
|
||||
<span class="text-nowrap">
|
||||
<a href="{{ tag | tag_link }}" title="Posts tagged “{{ tag | escape }}”" rel="tag">{{ tag }}</a>
|
||||
</span>
|
||||
{% unless forloop.last %} • {% endunless %}
|
||||
{%- endfor %}
|
||||
</h4>
|
||||
{%- endif %}
|
||||
</article>
|
||||
<div>
|
||||
<nav aria-label="pagination">
|
||||
<ul class="pager">
|
||||
<ul class="pagination justify-content-evenly mt-5">
|
||||
{% if model.newer_link -%}
|
||||
<li class="previous item">
|
||||
<h4 class="item-heading">
|
||||
<a href="{{ model.newer_link.value | relative_link }}">«</a> Previous Post
|
||||
</h4>
|
||||
<a href="{{ model.newer_link.value | relative_link }}">{{ model.newer_name.value }}</a>
|
||||
<li class="page-item">
|
||||
<a class="page-link" href="{{ model.newer_link.value | relative_link }}">{{ model.newer_name.value }}</a>
|
||||
<span class="text-muted">« Previous Post</span>
|
||||
</li>
|
||||
{%- else -%}
|
||||
<li></li>
|
||||
{% endif %}
|
||||
{% if model.older_link -%}
|
||||
<li class="next item">
|
||||
<h4 class="item-heading">Next Post <a href="{{ model.older_link.value | relative_link }}">»</a></h4>
|
||||
<a href="{{ model.older_link.value | relative_link }}">{{ model.older_name.value }}</a>
|
||||
<li class="page-item text-end">
|
||||
<a class="page-link" href="{{ model.older_link.value | relative_link }}">{{ model.older_name.value }}</a>
|
||||
<span class="text-muted">Next Post »</span>
|
||||
</li>
|
||||
{%- endif -%}
|
||||
</ul>
|
||||
|
|
|
@ -2,3 +2,21 @@
|
|||
max-width: 60rem;
|
||||
margin: auto;
|
||||
}
|
||||
blockquote {
|
||||
border-left: solid 4px lightgray;
|
||||
padding-left: 1rem;
|
||||
}
|
||||
.item-meta {
|
||||
font-size: 1.1rem;
|
||||
font-weight: normal;;
|
||||
}
|
||||
.item-meta::before {
|
||||
content: "»";
|
||||
vertical-align: text-top;
|
||||
}
|
||||
a:link, a:visited {
|
||||
text-decoration: none;
|
||||
}
|
||||
a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user