diff --git a/src/Orchard.Web/Core/Feeds/Services/FeedManager.cs b/src/Orchard.Web/Core/Feeds/Services/FeedManager.cs index 2e1759e48..f8cd2ff76 100644 --- a/src/Orchard.Web/Core/Feeds/Services/FeedManager.cs +++ b/src/Orchard.Web/Core/Feeds/Services/FeedManager.cs @@ -36,6 +36,7 @@ namespace Orchard.Core.Feeds.Services { var sb = new StringBuilder(); foreach (var link in _links) { var linkUrl = urlHelper.RouteUrl(link.RouteValues); + sb.Append("\r\n"); sb.Append(@" _services.ContentManager.BuildDisplayModel(b, "Summary")) @@ -45,5 +51,23 @@ namespace Orchard.Blogs.Controllers { return View(model); } + + public ActionResult LiveWriterManifest() { + Logger.Debug("Live Writer Manifest requested"); + + const string manifestUri = "http://schemas.microsoft.com/wlw/manifest/weblog"; + + var options = new XElement( + XName.Get("options", manifestUri), + new XElement(XName.Get("clientType", manifestUri), "Metaweblog"), + new XElement(XName.Get("supportsSlug", manifestUri), "Yes")); + + var doc = new XDocument(new XElement( + XName.Get("manifest", manifestUri), + options)); + + Response.Cache.SetCacheability(HttpCacheability.NoCache); + return Content(doc.ToString(), "text/xml"); + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Extensions/UrlHelperExtensions.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Extensions/UrlHelperExtensions.cs index 1fd84936c..30cfda0fe 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Extensions/UrlHelperExtensions.cs +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Extensions/UrlHelperExtensions.cs @@ -14,6 +14,10 @@ namespace Orchard.Blogs.Extensions { return urlHelper.Action("Item", "Blog", new {blogSlug, area = "Orchard.Blogs"}); } + public static string BlogLiveWriterManifest(this UrlHelper urlHelper, string blogSlug) { + return urlHelper.Action("LiveWriterManifest", "Blog", new { blogSlug, area = "Orchard.Blogs" }); + } + public static string BlogArchiveYear(this UrlHelper urlHelper, string blogSlug, int year) { return urlHelper.Action("ListByArchive", "BlogPost", new { blogSlug, archiveData = year.ToString(), area = "Orchard.Blogs" }); } diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Routes.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Routes.cs index 31f69a315..60997e830 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Routes.cs +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Routes.cs @@ -192,6 +192,22 @@ namespace Orchard.Blogs { }, new MvcRouteHandler()) }, + new RouteDescriptor { + Route = new Route( + "{blogSlug}/wlwmanifest.xml", + new RouteValueDictionary { + {"area", "Orchard.Blogs"}, + {"controller", "Blog"}, + {"action", "LiveWriterManifest"} + }, + new RouteValueDictionary { + {"blogSlug", new IsBlogConstraint(_containerProvider)} + }, + new RouteValueDictionary { + {"area", "Orchard.Blogs"} + }, + new MvcRouteHandler()) + }, new RouteDescriptor { Route = new Route( "{blogSlug}/{postSlug}", diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Views/DisplayTemplates/Items/Blogs.Blog.ascx b/src/Orchard.Web/Modules/Orchard.Blogs/Views/DisplayTemplates/Items/Blogs.Blog.ascx index 803508baf..ce92b3036 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Views/DisplayTemplates/Items/Blogs.Blog.ascx +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Views/DisplayTemplates/Items/Blogs.Blog.ascx @@ -1,6 +1,9 @@ <%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl>" %> +<%@ Import Namespace="Orchard.UI.Resources"%> +<%@ Import Namespace="Orchard.Blogs.Extensions"%> <%@ Import Namespace="Orchard.Mvc.ViewModels"%> <%@ Import Namespace="Orchard.Blogs.Models"%>

<%=Html.TitleForPage(Model.Item.Name) %>

+<% Html.RegisterLink(new LinkEntry { Rel = "wlwmanifest", Type = "application/wlwmanifest+xml", Href = Url.BlogLiveWriterManifest(Model.Item.Slug) });%> <% Html.Zone("primary", ":manage :metadata"); Html.ZonesAny(); %> \ No newline at end of file diff --git a/src/Orchard.Web/Themes/Classic/Views/DisplayTemplates/Items/Blogs.Blog.ascx b/src/Orchard.Web/Themes/Classic/Views/DisplayTemplates/Items/Blogs.Blog.ascx index e384ea728..08cebe057 100644 --- a/src/Orchard.Web/Themes/Classic/Views/DisplayTemplates/Items/Blogs.Blog.ascx +++ b/src/Orchard.Web/Themes/Classic/Views/DisplayTemplates/Items/Blogs.Blog.ascx @@ -1,7 +1,9 @@ <%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl>" %> +<%@ Import Namespace="Orchard.UI.Resources"%> <%@ Import Namespace="Orchard.Mvc.ViewModels"%> <%@ Import Namespace="Orchard.Blogs.Extensions"%> <%@ Import Namespace="Orchard.Blogs.Models"%>

<%=Html.TitleForPage(Model.Item.Name) %>

+<% Html.RegisterLink(new LinkEntry { Rel = "wlwmanifest", Type = "application/wlwmanifest+xml", Href = Url.BlogLiveWriterManifest(Model.Item.Slug) });%> <% Html.Zone("primary", ":manage :metadata"); Html.ZonesAny(); %> \ No newline at end of file diff --git a/src/Orchard.Web/Themes/Green/Views/DisplayTemplates/Items/Blogs.Blog.ascx b/src/Orchard.Web/Themes/Green/Views/DisplayTemplates/Items/Blogs.Blog.ascx index f5f2d260e..0bb828fd1 100644 --- a/src/Orchard.Web/Themes/Green/Views/DisplayTemplates/Items/Blogs.Blog.ascx +++ b/src/Orchard.Web/Themes/Green/Views/DisplayTemplates/Items/Blogs.Blog.ascx @@ -1,6 +1,10 @@ <%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl>" %> +<%@ Import Namespace="Orchard.Blogs.Extensions"%> +<%@ Import Namespace="Orchard.UI.Resources"%> <%@ Import Namespace="Orchard.Mvc.ViewModels"%> <%@ Import Namespace="Orchard.Blogs.Models"%> + +<% Html.RegisterLink(new LinkEntry { Rel = "wlwmanifest", Type = "application/wlwmanifest+xml", Href = Url.BlogLiveWriterManifest(Model.Item.Slug) });%>

<%=Html.TitleForPage(Model.Item.Name) %>

diff --git a/src/Orchard/Mvc/Html/LayoutExtensions.cs b/src/Orchard/Mvc/Html/LayoutExtensions.cs index fb0fc8d01..b7b4bcc96 100644 --- a/src/Orchard/Mvc/Html/LayoutExtensions.cs +++ b/src/Orchard/Mvc/Html/LayoutExtensions.cs @@ -94,6 +94,10 @@ namespace Orchard.Mvc.Html { html.Resolve().RegisterMeta(name, content); } + public static void RegisterLink(this HtmlHelper html, LinkEntry entry) { + html.Resolve().RegisterLink(entry, html); + } + public static void RegisterStyle(this HtmlHelper html, string fileName) { html.Resolve().RegisterStyle(fileName, html); } diff --git a/src/Orchard/Orchard.csproj b/src/Orchard/Orchard.csproj index 595e0689e..068a14c45 100644 --- a/src/Orchard/Orchard.csproj +++ b/src/Orchard/Orchard.csproj @@ -300,6 +300,7 @@ + diff --git a/src/Orchard/UI/Resources/IResourceManager.cs b/src/Orchard/UI/Resources/IResourceManager.cs index 24d3b283b..e33434e10 100644 --- a/src/Orchard/UI/Resources/IResourceManager.cs +++ b/src/Orchard/UI/Resources/IResourceManager.cs @@ -1,14 +1,15 @@ using System.Web.Mvc; -using System.Web.Routing; namespace Orchard.UI.Resources { public interface IResourceManager : IDependency { void RegisterMeta(string name, string content); void RegisterStyle(string fileName, HtmlHelper html); + void RegisterLink(LinkEntry entry, HtmlHelper html); void RegisterHeadScript(string fileName, HtmlHelper html); void RegisterFootScript(string fileName, HtmlHelper html); MvcHtmlString GetMetas(); MvcHtmlString GetStyles(); + MvcHtmlString GetLinks(HtmlHelper html); MvcHtmlString GetHeadScripts(); MvcHtmlString GetFootScripts(); } diff --git a/src/Orchard/UI/Resources/LinkEntry.cs b/src/Orchard/UI/Resources/LinkEntry.cs new file mode 100644 index 000000000..a538cdbe7 --- /dev/null +++ b/src/Orchard/UI/Resources/LinkEntry.cs @@ -0,0 +1,7 @@ +namespace Orchard.UI.Resources { + public class LinkEntry { + public string Rel { get; set; } + public string Type { get; set; } + public string Href { get; set; } + } +} diff --git a/src/Orchard/UI/Resources/ResourceFilter.cs b/src/Orchard/UI/Resources/ResourceFilter.cs index 1e1429568..b9cffb532 100644 --- a/src/Orchard/UI/Resources/ResourceFilter.cs +++ b/src/Orchard/UI/Resources/ResourceFilter.cs @@ -20,6 +20,7 @@ namespace Orchard.UI.Resources { model.Zones.AddAction("head:metas", html => html.ViewContext.Writer.Write(_resourceManager.GetMetas())); model.Zones.AddAction("head:styles", html => html.ViewContext.Writer.Write(_resourceManager.GetStyles())); + model.Zones.AddAction("head:links", html => html.ViewContext.Writer.Write(_resourceManager.GetLinks(html))); model.Zones.AddAction("head:scripts", html => html.ViewContext.Writer.Write(_resourceManager.GetHeadScripts())); model.Zones.AddAction("body:after", html => { html.ViewContext.Writer.Write(_resourceManager.GetFootScripts()); diff --git a/src/Orchard/UI/Resources/ResourceManager.cs b/src/Orchard/UI/Resources/ResourceManager.cs index e4530aac9..2a2461212 100644 --- a/src/Orchard/UI/Resources/ResourceManager.cs +++ b/src/Orchard/UI/Resources/ResourceManager.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using System.Text; using System.Web.Mvc; using JetBrains.Annotations; using Orchard.Mvc.Html; @@ -12,12 +13,14 @@ namespace Orchard.UI.Resources { private const string ScriptFormat = "\r\n"; private readonly Dictionary _metas; private readonly List _styles; + private readonly List _links; private readonly List _headScripts; private readonly List _footScripts; public ResourceManager() { _metas = new Dictionary(20) {{"generator", "Orchard"}}; _styles = new List(10); + _links = new List(); _headScripts = new List(10); _footScripts = new List(5); } @@ -37,6 +40,10 @@ namespace Orchard.UI.Resources { _styles.Add(context); } + public void RegisterLink(LinkEntry entry, HtmlHelper html) { + _links.Add(entry); + } + public void RegisterHeadScript(string fileName, HtmlHelper html) { if (string.IsNullOrEmpty(fileName)) return; @@ -67,6 +74,40 @@ namespace Orchard.UI.Resources { return GetFiles(_styles, StyleFormat, "/styles/"); } + public MvcHtmlString GetLinks(HtmlHelper html) { + var sb = new StringBuilder(); + foreach (var link in _links) { + sb.Append("\r\n"); + sb.Append(@""); + } + + return MvcHtmlString.Create(sb.ToString()); + } + public MvcHtmlString GetHeadScripts() { return GetFiles(_headScripts, ScriptFormat, "/scripts/"); }