Осталось только привести полный исходный код для созданного в прошлой части расширения.
Файл PinnedSiteSupport.js
Данный файл по умолчанию располагается в папке \Scripts\PinnedSite.
/// Copyright (c) 2011 Andrey Veselov. All rights reserved.
/// WebSite: http://andrey.moveax.ru
/// Email: andrey@moveax.ru
/// This source is subject to the Microsoft Reciprocal License (Ms-RL).
addIE9PinnedCategories = function (title) {
var isPinnedSiteMode = window.external && "msIsSiteMode" in window.external && window.external.msIsSiteMode();
if (isPinnedSiteMode) {
window.external.msSiteModeCreateJumplist(title);
window.external.msSiteModeClearJumplist();
var posts = getNewPostsForPinnedSite();
for (i = posts.length - 1; i >= 0; i--) {
window.external.msSiteModeAddJumpListItem(
posts[i].name, posts[i].postUrl, posts[i].iconUrl);
}
window.external.msSiteModeShowJumplist();
}
};
Файл PinnedSiteSupport.cs
Данный файл необходимо разместить в папке \App_Code\Extensions.
/// Copyright (c) 2011 Andrey Veselov. All rights reserved.
/// WebSite: http://andrey.moveax.ru
/// Email: andrey@moveax.ru
/// This source is subject to the Microsoft Reciprocal License (Ms-RL).
namespace App_Code.Extensions
{
using System;
using System.Data;
using System.Text;
using System.Web;
using System.Web.UI.HtmlControls;
using BlogEngine.Core;
using BlogEngine.Core.Web.Controls;
using BlogEngine.Core.Web.Extensions;
using Page = System.Web.UI.Page;
[Extension(
description: "Adds support for IE9 Pinned mode",
version: "0.8",
author: "<a target=\"_new\" href=\"http://andrey.moveax.ru/\">Andrey Veselov</a>")]
public class PinnedSiteSupport
{
private const string ExtensionName = "PinnedSiteSupport";
/// Settings storage
private static ExtensionSettings _siteSettings;
private static ExtensionSettings _jumpListSettings;
private static ExtensionSettings _jumpListIcons;
private static ExtensionSettings _tasksSettings;
private static ExtensionSettings _tasksList;
/// <summary>Default static parameterless constructor.</summary>
static PinnedSiteSupport()
{
// Subscribe to blog "serving" events
BlogEngine.Core.Page.Serving += new EventHandler<ServingEventArgs>(BlogServingHandler);
BlogEngine.Core.Post.Serving += new EventHandler<ServingEventArgs>(BlogServingHandler);
}
/// <summary>The event handler that is triggered every time a post or page is served to a client.</summary>
private static void BlogServingHandler(object sender, ServingEventArgs e)
{
HttpContext context = HttpContext.Current;
// Checking the browser version to see if it's IE9 or higher.
var browser = context.Request.Browser;
var isIE9orHigher = browser.Browser.Equals("IE") && (browser.MajorVersion >= 9);
if (!isIE9orHigher) {
return;
}
Page page = context.CurrentHandler as Page;
if ((page == null) || (context.Items[ExtensionName] != null)) {
return;
}
PinnedSiteSupport.InitSettings();
PinnedSiteSupport.AddSiteProperties(page);
PinnedSiteSupport.AddJumpListItems(page);
PinnedSiteSupport.AddTasks(page);
// Set the flag in order to add items once per page (not once per post).
context.Items[ExtensionName] = new object();
}
/// <summary>Adds site properties as meta tags into the current page.</summary>
private static void AddSiteProperties(Page page)
{
if (_siteSettings.GetSingleValue("enabled").Equals(false.ToString())) {
return;
}
PinnedSiteSupport.InsertMetaTag(
page,
"application-name",
_siteSettings.GetSingleValue("application-name"));
PinnedSiteSupport.InsertMetaTag(
page,
"msapplication-tooltip",
_siteSettings.GetSingleValue("msapplication-tooltip"));
PinnedSiteSupport.InsertMetaTag(
page,
"msapplication-starturl",
_siteSettings.GetSingleValue("msapplication-starturl"));
PinnedSiteSupport.InsertMetaTag(
page,
"msapplication-navbutton-color",
_siteSettings.GetSingleValue("msapplication-navbutton-color"));
string defWidth = _siteSettings.GetSingleValue("msapplication-window-minWidth");
string defHeight = _siteSettings.GetSingleValue("msapplication-window-minHeight");
if (!string.IsNullOrEmpty(defWidth) && !string.IsNullOrEmpty(defHeight)) {
PinnedSiteSupport.InsertMetaTag(
page,
"msapplication-window-min",
string.Format(@"width={0};height={1}", defWidth, defHeight));
}
}
/// <summary>Adds JumpList items into the current page.</summary>
private static void AddJumpListItems(Page page)
{
if (_jumpListSettings.GetSingleValue("enabled").Equals(false.ToString())) {
return;
}
PinnedSiteSupport.InsertJavaScript(page, PinnedSiteSupport.CreateJSPostsList());
PinnedSiteSupport.InsertJavaScriptRef(page, "PinnedSiteSupport.js");
PinnedSiteSupport.InsertJavaScript(
page,
string.Format(
"addIE9PinnedCategories(\"{0}\");",
_jumpListSettings.GetSingleValue("title")));
}
/// <summary>Adds Tasks list into the current page.</summary>
private static void AddTasks(Page page)
{
if (_tasksSettings.GetSingleValue("enabled").Equals(false.ToString())) {
return;
}
var tasks = _tasksList.GetDataTable();
foreach (DataRow task in tasks.Rows) {
string value = string.Format("name={0};action-uri={1};icon-uri={2}",
task["name"],
task["action-uri"],
task["icon-uri"]);
PinnedSiteSupport.InsertMetaTag(page, "msapplication-task", value);
}
}
/// <summary>Initalize extension settings.</summary>
private static void InitSettings()
{
#region Site properties
var siteSettings = new ExtensionSettings("Site properties");
siteSettings.IsScalar = true;
siteSettings.AddParameter("enabled", "Enable Meta tags", 10, true, false, ParameterType.Boolean);
siteSettings.AddParameter("application-name", "Site name", 128, true, false, ParameterType.String);
siteSettings.AddValue("application-name", string.Empty);
siteSettings.AddParameter("msapplication-tooltip", "Tooltip", 128, true, false, ParameterType.String);
siteSettings.AddValue("msapplication-tooltip", string.Empty);
siteSettings.AddParameter("msapplication-starturl", "Start url", 255, true, false, ParameterType.String);
siteSettings.AddValue("msapplication-starturl", Utils.AbsoluteWebRoot.AbsoluteUri);
siteSettings.AddParameter("msapplication-navbutton-color", "Navigation button color", 128, true, false, ParameterType.String);
siteSettings.AddParameter("msapplication-window-minWidth", "Default window width");
siteSettings.AddValue("msapplication-window-minWidth", 1024);
siteSettings.AddParameter("msapplication-window-minHeight", "Default window height");
siteSettings.AddValue("msapplication-window-minHeight", 720);
_siteSettings = ExtensionManager.InitSettings(ExtensionName, siteSettings);
#endregion
#region JumpList Item settings
var jumpList = new ExtensionSettings("JumpList Items");
jumpList.IsScalar = true;
jumpList.AddParameter("enabled", "Enable JumpList items", 10, true, false, ParameterType.Boolean);
jumpList.AddParameter("title", "Title", 64, true, false, ParameterType.String);
jumpList.AddParameter("iconUrl", "Default icon URL (optional)", 255, true, false, ParameterType.String);
jumpList.AddParameter("daysOffset", "Days offset", 3, true, false, ParameterType.Integer);
jumpList.AddValue("daysOffset", 7);
jumpList.AddParameter("jsFolder", "JavaScript folder (relative to website root)", 255, true, false, ParameterType.String);
jumpList.AddValue("jsFolder", "Scripts/PinnedSite/");
_jumpListSettings = ExtensionManager.InitSettings(ExtensionName, jumpList);
#endregion
#region Jumplist icons
var jumpListIcons = new ExtensionSettings("JumpList Icons");
jumpListIcons.AddParameter("urlPart", "Part of the URL", 64, true, true, ParameterType.String);
jumpListIcons.AddParameter("iconUrl", "Icon URL", 255, true, false, ParameterType.String);
_jumpListIcons = ExtensionManager.InitSettings(ExtensionName, jumpListIcons);
#endregion
#region Tasks settings
var tasks = new ExtensionSettings("Tasks");
tasks.IsScalar = true;
tasks.AddParameter("enabled", "Enable tasks", 10, true, false, ParameterType.Boolean);
_tasksSettings = ExtensionManager.InitSettings(ExtensionName, tasks);
var tasksList = new ExtensionSettings("Tasks List");
tasksList.AddParameter("name", "Name", 32, true, false, ParameterType.String);
tasksList.AddParameter("action-uri", "Action URL", 255, true, true, ParameterType.String);
tasksList.AddParameter("icon-uri", "Icon URL (optional)", 255, false, false, ParameterType.String);
_tasksList = ExtensionManager.InitSettings(ExtensionName, tasksList);
#endregion
}
#region Support methods
/// <summary>Builds the post list.</summary>
private static string CreateJSPostsList()
{
int daysOffset = 7;
Int32.TryParse(_jumpListSettings.GetSingleValue("daysOffset"), out daysOffset);
var ie9js = new StringBuilder();
ie9js.Append("getNewPostsForPinnedSite = function () { return [");
// get posts list
var timeOffset = new TimeSpan(days: daysOffset, hours: 0, minutes: 0, seconds: 0);
var posts = Post.GetPostsByDate(DateTime.Now - timeOffset, DateTime.Now);
foreach (var post in posts) {
// get icon for the post
string iconUrl = null;
var icons = _jumpListIcons.GetDataTable();
foreach (DataRow icon in icons.Rows) {
if (post.AbsoluteLink.ToString().IndexOf((string)icon["urlPart"]) != -1) {
iconUrl = (string)icon["iconUrl"];
break;
}
}
// or use default icon
if (string.IsNullOrEmpty(iconUrl)) {
iconUrl = _jumpListSettings.GetSingleValue("iconUrl");
}
ie9js.Append(string.Format(
"{{ name: \"{0}\", postUrl: \"{1}\", iconUrl: \"{2}\" }},",
post.Title,
post.AbsoluteLink,
iconUrl));
}
ie9js.Remove(ie9js.Length - 1, 1); // remove last comma
ie9js.AppendLine("]; };");
return ie9js.ToString();
}
/// <summary>Inserts the meta tag element at the top of page.</summary>
private static void InsertMetaTag(Page page, string metaName, string value)
{
if (string.IsNullOrEmpty(value)) {
return;
}
HtmlGenericControl metaTag = new HtmlGenericControl("meta");
metaTag.Attributes["name"] = metaName;
metaTag.Attributes["content"] = value;
page.Header.Controls.Add(metaTag);
}
/// <summary>Inserts the JavaScript code into the page.</summary>
private static void InsertJavaScript(Page page, string script)
{
HtmlGenericControl js = new HtmlGenericControl("script");
js.Attributes["type"] = "text/javascript";
js.InnerHtml = script;
page.Header.Controls.Add(js);
}
/// <summary>Inserts the JavaScript code reference into the page.</summary>
private static void InsertJavaScriptRef(Page page, string srcFile)
{
string scriptUrl = HttpContext.Current.Server.UrlPathEncode(
string.Format(
"{0}{1}",
_jumpListSettings.GetSingleValue("jsFolder"),
srcFile));
HtmlGenericControl js = new HtmlGenericControl("script");
js.Attributes["type"] = "text/javascript";
js.Attributes["src"] = string.Format("{0}{1}", Utils.RelativeWebRoot, scriptUrl);
page.Header.Controls.Add(js);
}
#endregion
}
}