| @@ -1,138 +1,160 @@ | |||||
| <article class="card shadow-sm mb-4"> | |||||
| <div class="card-body"> | |||||
| <div class="mb-3"> | |||||
| <a href="<%= PostsUrl() %>" class="small text-decoration-none">← Back to posts</a> | |||||
| </div> | |||||
| <div class="magazine-label mb-3">Feature story</div> | |||||
| <h1 class="display-6 mb-2"><%= H(post.Title) %></h1> | |||||
| <% | |||||
| Dim postHeroBackground, postHeroClass, publishedText, readTimeText | |||||
| postHeroBackground = ExtractFirstImageSrc(post.Body) | |||||
| postHeroClass = "masthead masthead-post" | |||||
| If Len(postHeroBackground) > 0 Then | |||||
| postHeroClass = postHeroClass & " masthead-has-image" | |||||
| End If | |||||
| <% | |||||
| Dim publishedText | |||||
| publishedText = "" | |||||
| If IsDate(post.PublishedDate) Then | |||||
| If CDate(post.PublishedDate) > #1/1/1970# Then | |||||
| publishedText = FormatDateTime(post.PublishedDate, vbLongDate) | |||||
| End If | |||||
| publishedText = "" | |||||
| If IsDate(post.PublishedDate) Then | |||||
| If CDate(post.PublishedDate) > #1/1/1970# Then | |||||
| publishedText = FormatDateTime(post.PublishedDate, vbLongDate) | |||||
| End If | End If | ||||
| End If | |||||
| readTimeText = EstimateReadTime(post.Body) | |||||
| %> | |||||
| If Len(publishedText) > 0 Then | |||||
| %> | |||||
| <p class="article-meta"><%= H(publishedText) %></p> | |||||
| <% | |||||
| End If | |||||
| <header class="<%= postHeroClass %>"<% If Len(postHeroBackground) > 0 Then %> style="background-image: url('<%= H(postHeroBackground) %>')"<% End If %>> | |||||
| <div class="overlay"></div> | |||||
| <div class="container"> | |||||
| <div class="row"> | |||||
| <div class="col-lg-8 col-md-10 mx-auto"> | |||||
| <div class="post-heading text-center"> | |||||
| <div class="post-heading-kicker">Feature story</div> | |||||
| <h1><%= H(post.Title) %></h1> | |||||
| <% If Len(publishedText) > 0 Or Len(readTimeText) > 0 Then %> | |||||
| <div class="post-meta-inline justify-content-center"> | |||||
| <span>By BrainOrdure</span> | |||||
| <% If Len(publishedText) > 0 Then %><span class="meta-sep">•</span><span><%= H(publishedText) %></span><% End If %> | |||||
| <% If Len(readTimeText) > 0 Then %><span class="meta-sep">•</span><span><%= H(readTimeText) %></span><% End If %> | |||||
| </div> | |||||
| <% End If %> | |||||
| </div> | |||||
| </div> | |||||
| </div> | |||||
| </div> | |||||
| </header> | |||||
| Dim postBody | |||||
| postBody = RenderPostBody(post.Body) | |||||
| %> | |||||
| <div class="row"> | |||||
| <div class="col-lg-7 col-md-9 mx-auto"> | |||||
| <div class="mb-4"> | |||||
| <a href="<%= PostsUrl() %>" class="small text-decoration-none">← Back to posts</a> | |||||
| </div> | |||||
| <div class="prose fs-5 lh-lg feature-dropcap"><%= postBody %></div> | |||||
| </div> | |||||
| </article> | |||||
| <article class="post-preview post-body-preview"> | |||||
| <div class="post-preview-content prose fs-5 lh-lg feature-dropcap"><%= RenderPostBody(post.Body) %></div> | |||||
| </article> | |||||
| <!-- Comments --> | |||||
| <section class="mt-2"> | |||||
| <% | |||||
| Dim commentsCount, commentsLoadFailed | |||||
| commentsCount = 0 | |||||
| commentsLoadFailed = False | |||||
| <div class="mb-5"> | |||||
| <a href="<%= PostsUrl() %>" class="btn btn-outline-primary">Back to posts</a> | |||||
| </div> | |||||
| On Error Resume Next | |||||
| If IsObject(comments) Then commentsCount = comments.Count | |||||
| If Err.Number <> 0 Then | |||||
| commentsLoadFailed = True | |||||
| <!-- Comments --> | |||||
| <section class="mt-5"> | |||||
| <% | |||||
| Dim commentsCount, commentsLoadFailed | |||||
| commentsCount = 0 | commentsCount = 0 | ||||
| Err.Clear | |||||
| End If | |||||
| On Error GoTo 0 | |||||
| %> | |||||
| <h2 class="page-title h4 mb-3">Comments (<%= commentsCount %>)</h2> | |||||
| commentsLoadFailed = False | |||||
| <% If commentsLoadFailed Then %> | |||||
| <div class="alert alert-warning mb-4">Comments are temporarily unavailable.</div> | |||||
| <% ElseIf commentsCount = 0 Then %> | |||||
| <p class="text-muted mb-4">No comments yet. Be the first to leave one below.</p> | |||||
| <% Else %> | |||||
| <% | |||||
| Dim commentIter, commentItem | |||||
| Dim commentsIterFailed | |||||
| commentsIterFailed = False | |||||
| On Error Resume Next | |||||
| If IsObject(comments) Then commentsCount = comments.Count | |||||
| If Err.Number <> 0 Then | |||||
| commentsLoadFailed = True | |||||
| commentsCount = 0 | |||||
| Err.Clear | |||||
| End If | |||||
| On Error GoTo 0 | |||||
| %> | |||||
| <h2 class="post-title h4 mb-3">Comments (<%= commentsCount %>)</h2> | |||||
| On Error Resume Next | |||||
| Set commentIter = comments.Iterator() | |||||
| If Err.Number <> 0 Then | |||||
| commentsIterFailed = True | |||||
| Err.Clear | |||||
| End If | |||||
| <% If commentsLoadFailed Then %> | |||||
| <div class="alert alert-warning mb-4">Comments are temporarily unavailable.</div> | |||||
| <% ElseIf commentsCount = 0 Then %> | |||||
| <p class="text-muted mb-4">No comments yet. Be the first to leave one below.</p> | |||||
| <% Else %> | |||||
| <% | |||||
| Dim commentIter, commentItem | |||||
| Dim commentsIterFailed | |||||
| commentsIterFailed = False | |||||
| Do While Not commentsIterFailed And commentIter.HasNext | |||||
| Set commentItem = commentIter.GetNext() | |||||
| On Error Resume Next | |||||
| Set commentIter = comments.Iterator() | |||||
| If Err.Number <> 0 Then | If Err.Number <> 0 Then | ||||
| commentsIterFailed = True | commentsIterFailed = True | ||||
| Err.Clear | Err.Clear | ||||
| Exit Do | |||||
| End If | End If | ||||
| Dim commentDateText | |||||
| commentDateText = "" | |||||
| If IsDate(commentItem.CreatedDate) Then | |||||
| commentDateText = FormatDateTime(commentItem.CreatedDate, vbLongDate) | |||||
| End If | |||||
| %> | |||||
| <div class="card shadow-sm mb-3 comment-card"> | |||||
| <div class="card-body"> | |||||
| <div class="d-flex justify-content-between mb-2"> | |||||
| <strong class="small"><%= H(commentItem.AuthorName) %></strong> | |||||
| <span class="small text-muted"><%= H(commentDateText) %></span> | |||||
| Do While Not commentsIterFailed And commentIter.HasNext | |||||
| Set commentItem = commentIter.GetNext() | |||||
| If Err.Number <> 0 Then | |||||
| commentsIterFailed = True | |||||
| Err.Clear | |||||
| Exit Do | |||||
| End If | |||||
| Dim commentDateText | |||||
| commentDateText = "" | |||||
| If IsDate(commentItem.CreatedDate) Then | |||||
| commentDateText = FormatDateTime(commentItem.CreatedDate, vbLongDate) | |||||
| End If | |||||
| %> | |||||
| <div class="comment-card mb-3"> | |||||
| <div class="comment-card-body"> | |||||
| <div class="d-flex justify-content-between mb-2"> | |||||
| <strong class="small"><%= H(commentItem.AuthorName) %></strong> | |||||
| <span class="small text-muted"><%= H(commentDateText) %></span> | |||||
| </div> | |||||
| <% | |||||
| Dim commentBody | |||||
| commentBody = H(commentItem.Body) | |||||
| commentBody = Replace(commentBody, vbCrLf, "<br>") | |||||
| commentBody = Replace(commentBody, vbCr, "<br>") | |||||
| commentBody = Replace(commentBody, vbLf, "<br>") | |||||
| %> | |||||
| <p class="mb-0"><%= commentBody %></p> | |||||
| </div> | |||||
| </div> | </div> | ||||
| <% | <% | ||||
| Dim commentBody | |||||
| commentBody = H(commentItem.Body) | |||||
| commentBody = Replace(commentBody, vbCrLf, "<br>") | |||||
| commentBody = Replace(commentBody, vbCr, "<br>") | |||||
| commentBody = Replace(commentBody, vbLf, "<br>") | |||||
| %> | |||||
| <p class="mb-0"><%= commentBody %></p> | |||||
| </div> | |||||
| </div> | |||||
| <% | |||||
| Loop | |||||
| If Err.Number <> 0 Then | |||||
| commentsIterFailed = True | |||||
| Err.Clear | |||||
| End If | |||||
| On Error GoTo 0 | |||||
| Loop | |||||
| If Err.Number <> 0 Then | |||||
| commentsIterFailed = True | |||||
| Err.Clear | |||||
| End If | |||||
| On Error GoTo 0 | |||||
| If commentsIterFailed Then | |||||
| %> | |||||
| <div class="alert alert-warning mb-4">Some comments could not be displayed.</div> | |||||
| <% | |||||
| End If | |||||
| %> | |||||
| <% End If %> | |||||
| If commentsIterFailed Then | |||||
| %> | |||||
| <div class="alert alert-warning mb-4">Some comments could not be displayed.</div> | |||||
| <% | |||||
| End If | |||||
| %> | |||||
| <% End If %> | |||||
| <!-- Comment form --> | |||||
| <div class="card shadow-sm mt-4"> | |||||
| <div class="card-body"> | |||||
| <h3 class="h5 mb-3">Leave a Comment</h3> | |||||
| <form method="post" action="<%= CommentsUrl() %>"> | |||||
| <input type="hidden" name="PostID" value="<%= H(post.PostID) %>"> | |||||
| <input type="hidden" name="PostSlug" value="<%= H(post.Slug) %>"> | |||||
| <div class="mb-3"> | |||||
| <label class="form-label" for="AuthorName">Name <span class="text-danger">*</span></label> | |||||
| <input class="form-control" type="text" id="AuthorName" name="AuthorName" required> | |||||
| <!-- Comment form --> | |||||
| <div class="comment-form-shell mt-4"> | |||||
| <div class="comment-form-inner"> | |||||
| <h3 class="h5 mb-3">Leave a Comment</h3> | |||||
| <form method="post" action="<%= CommentsUrl() %>"> | |||||
| <input type="hidden" name="PostID" value="<%= H(post.PostID) %>"> | |||||
| <input type="hidden" name="PostSlug" value="<%= H(post.Slug) %>"> | |||||
| <div class="mb-3"> | |||||
| <label class="form-label" for="AuthorName">Name <span class="text-danger">*</span></label> | |||||
| <input class="form-control" type="text" id="AuthorName" name="AuthorName" required> | |||||
| </div> | |||||
| <div class="mb-3"> | |||||
| <label class="form-label" for="AuthorEmail">Email <span class="text-muted small">(optional, not displayed)</span></label> | |||||
| <input class="form-control" type="email" id="AuthorEmail" name="AuthorEmail"> | |||||
| </div> | |||||
| <div class="mb-3"> | |||||
| <label class="form-label" for="Body">Comment <span class="text-danger">*</span></label> | |||||
| <textarea class="form-control" id="Body" name="Body" rows="4" required></textarea> | |||||
| </div> | |||||
| <button class="btn btn-primary" type="submit">Submit Comment</button> | |||||
| <p class="small text-muted mt-2 mb-0">Comments are reviewed before appearing.</p> | |||||
| </form> | |||||
| </div> | </div> | ||||
| <div class="mb-3"> | |||||
| <label class="form-label" for="AuthorEmail">Email <span class="text-muted small">(optional, not displayed)</span></label> | |||||
| <input class="form-control" type="email" id="AuthorEmail" name="AuthorEmail"> | |||||
| </div> | |||||
| <div class="mb-3"> | |||||
| <label class="form-label" for="Body">Comment <span class="text-danger">*</span></label> | |||||
| <textarea class="form-control" id="Body" name="Body" rows="4" required></textarea> | |||||
| </div> | |||||
| <button class="btn btn-primary" type="submit">Submit Comment</button> | |||||
| <p class="small text-muted mt-2 mb-0">Comments are reviewed before appearing.</p> | |||||
| </form> | |||||
| </div> | |||||
| </div> | |||||
| </section> | |||||
| </div> | </div> | ||||
| </section> | |||||
| </div> | |||||
Powered by TurnKey Linux.