ssg: StaticSiteClient: rename file from StaticSiteGeneratorClient.cs, add constants

This commit is contained in:
Nick Vella 2019-07-01 22:51:41 +10:00
parent 75bbefe40d
commit 93c480dca0
1 changed files with 207 additions and 0 deletions

View File

@ -0,0 +1,207 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using OpenLiveWriter.BlogClient.Providers;
using OpenLiveWriter.CoreServices;
using OpenLiveWriter.Extensibility.BlogClient;
using YamlDotNet.Serialization;
namespace OpenLiveWriter.BlogClient.Clients
{
[BlogClient(StaticSiteClient.CLIENT_TYPE, StaticSiteClient.CLIENT_TYPE)]
public class StaticSiteClient : BlogClientBase, IBlogClient
{
// The 'provider' concept doesn't really apply to local static sites
// Store these required constants here so they're in one place
public const string PROVIDER_ID = "D0E0062F-7540-4462-94FD-DC55004D95E6";
public const string SERVICE_NAME = "Static Site Generator"; // TODO- Move to Strings
public const string POST_API_URL = "http://localhost/"; // A valid URI is required for BlogClientManager to instantiate a URI object on.
public const string CLIENT_TYPE = "StaticSite";
// The credential keys where the configuration is stored.
// Used in WeblogConfigurationWizardPanelStaticSiteConfig
public const string CONFIG_POSTS_PATH = "SSGPostsPath";
public const string CONFIG_PAGES_PATH = "SSGPagesPath";
public const string CONFIG_BUILD_COMMAND = "SSGBuildCommand";
public const string CONFIG_PUBLISH_COMMAND = "SSGPublishCommand";
public IBlogClientOptions Options { get; private set; }
// Configuration
public string LocalSitePath { get; private set; }
public string PostsPath { get; private set; }
public string PagesPath { get; private set; }
public string BuildCommand { get; private set; }
public string PublishCommand { get; private set; }
public StaticSiteClient(Uri postApiUrl, IBlogCredentialsAccessor credentials)
: base(credentials)
{
LoadConfigFromCredentials(credentials);
// Set the client options
var options = new BlogClientOptions();
ConfigureClientOptions(options);
Options = options;
}
protected override void VerifyCredentials(TransientCredentials transientCredentials)
{
}
public void OverrideOptions(IBlogClientOptions newClientOptions)
{
Options = newClientOptions;
}
public BlogInfo[] GetUsersBlogs() => new BlogInfo[0];
public BlogPostCategory[] GetCategories(string blogId) => new BlogPostCategory[0];
public BlogPostKeyword[] GetKeywords(string blogId) => new BlogPostKeyword[0];
/// <summary>
/// Returns recent posts
/// </summary>
/// <param name="blogId"></param>
/// <param name="maxPosts"></param>
/// <param name="includeCategories"></param>
/// <param name="now">If null, then includes future posts. If non-null, then only includes posts before the *UTC* 'now' time.</param>
/// <returns></returns>
public BlogPost[] GetRecentPosts(string blogId, int maxPosts, bool includeCategories, DateTime? now) => new BlogPost[0];
public string NewPost(string blogId, BlogPost post, INewCategoryContext newCategoryContext, bool publish, out string etag, out XmlDocument remotePost)
{
etag = "";
remotePost = new XmlDocument();
return "";
}
public bool EditPost(string blogId, BlogPost post, INewCategoryContext newCategoryContext, bool publish, out string etag, out XmlDocument remotePost)
{
etag = "";
remotePost = new XmlDocument();
return false;
}
/// <summary>
/// Attempt to get a post with the specified id (note: may return null
/// if the post could not be found on the remote server)
/// </summary>
public BlogPost GetPost(string blogId, string postId) => new BlogPost();
public void DeletePost(string blogId, string postId, bool publish)
{
}
public BlogPost GetPage(string blogId, string pageId) => new BlogPost();
public PageInfo[] GetPageList(string blogId) => new PageInfo[0];
public BlogPost[] GetPages(string blogId, int maxPages) => new BlogPost[0];
public string NewPage(string blogId, BlogPost page, bool publish, out string etag, out XmlDocument remotePost)
{
etag = "";
remotePost = new XmlDocument();
return "";
}
public bool EditPage(string blogId, BlogPost page, bool publish, out string etag, out XmlDocument remotePost)
{
etag = "";
remotePost = new XmlDocument();
return false;
}
public void DeletePage(string blogId, string pageId)
{
}
public AuthorInfo[] GetAuthors(string blogId) => new AuthorInfo[0];
public bool? DoesFileNeedUpload(IFileUploadContext uploadContext) => false;
public string DoBeforePublishUploadWork(IFileUploadContext uploadContext) => "";
public void DoAfterPublishUploadWork(IFileUploadContext uploadContext)
{
}
public string AddCategory(string blogId, BlogPostCategory category) => "";
public BlogPostCategory[] SuggestCategories(string blogId, string partialCategoryName)
=> new BlogPostCategory[0];
public HttpWebResponse SendAuthenticatedHttpRequest(string requestUri, int timeoutMs, HttpRequestFilter filter)
=> throw new Exception("HTTP requests not implemented for static sites"); // TODO This is used for downloading writing manifest XMLs. Throw an exception for now.
public BlogInfo[] GetImageEndpoints() => new BlogInfo[0];
/// <summary>
/// Returns if this StaticSiteGeneratorClient is secure
/// Returns true for now as we trust the user publish script
/// </summary>
public bool IsSecure => true;
// Authentication is handled by publish script at the moment
protected override bool RequiresPassword => false;
/// <summary>
/// Sets the relevant BlogClientOptions for this client
/// </summary>
/// <param name="clientOptions">A BlogClientOptions instance</param>
private void ConfigureClientOptions(BlogClientOptions clientOptions)
{
// Pages are supported via filesystem
clientOptions.SupportsPages = true;
// The follwoing values would be written into YAML front-matter
clientOptions.SupportsCategories = true;
clientOptions.SupportsMultipleCategories = true;
clientOptions.SupportsNewCategories = true;
clientOptions.SupportsCustomDate = true;
clientOptions.SupportsFileUpload = true;
clientOptions.SupportsSlug = true;
clientOptions.SupportsAuthor = true;
}
/// <summary>
/// Load client configuration from blog credentials
/// </summary>
/// <param name="blogCredentials">An IBlogCredentialsAccessor</param>
private void LoadConfigFromCredentials(IBlogCredentialsAccessor blogCredentials)
{
LocalSitePath = blogCredentials.Username;
PostsPath = blogCredentials.GetCustomValue(CONFIG_POSTS_PATH);
PagesPath = blogCredentials.GetCustomValue(CONFIG_PAGES_PATH);
BuildCommand = blogCredentials.GetCustomValue(CONFIG_BUILD_COMMAND);
PublishCommand = blogCredentials.GetCustomValue(CONFIG_PUBLISH_COMMAND);
}
/// <summary>
/// Get a PostFrontMatter instance for a post
/// </summary>
/// <param name="post">Post to generate front matter for</param>
/// <returns></returns>
private PostFrontMatter GetFrontMatterForPost(BlogPost post) =>
new PostFrontMatter()
{
title = post.Title,
author = post.Author.Name,
date = post.DatePublished.ToString("yyyy-MM-dd HH:mm:ss"),
categories = post.Categories.Select(cat => cat.Name).ToArray(),
tags = post.Keywords
};
private class PostFrontMatter
{
public string title { get; set; }
public string author { get; set; }
public string date { get; set; }
public string[] categories { get; set; }
public string tags { get; set; }
}
}
}