public Yield GetSiteFunctions(DreamContext context, DreamMessage request, Result<DreamMessage> response) { if(UserBL.IsAnonymous(DekiContext.Current.User)) { throw new SiteMustBeLoggedInForbiddenException(); } // build set of libraries List<XDoc> libraries = DekiContext.Current.Instance.RunningServices.ExtensionServices .Select(x => x.Extension.Manifest).ToList(); // add registered libraries libraries.Sort((left, right) => left["title"].Contents.CompareInvariantIgnoreCase(right["title"].Contents)); // add built-in functions XDoc builtinlib = new XDoc("extension"); builtinlib.Elem("title", "Built-in Functions"); builtinlib.Elem("label", "Built-in"); builtinlib.Elem("uri.help", "http://wiki.developer.mindtouch.com/MindTouch_Deki/DekiScript/Reference"); builtinlib.Elem("description", "The following functions and variables are part the DekiScript and MindTouch runtime environment."); foreach(var function in ScriptRuntime.Functions.Values) { if(function.Access == DreamAccess.Public) { builtinlib.Add(function.ToXml(null)); } } libraries.Insert(0, builtinlib); // create composite document bool hasUnsafeContentPermission = PermissionsBL.IsUserAllowed(DekiContext.Current.User, Permissions.UNSAFECONTENT); XDoc extensions = new XDoc("extensions").AddAll(libraries); foreach(XDoc extension in extensions["extension"]) { XUri serviceUri = extension["@uri"].AsUri; // check if extension is protected bool @protected; bool.TryParse(ExtensionBL.GetExtensionPreference(serviceUri, "protected"), out @protected); if(@protected) { if(!hasUnsafeContentPermission) { extension.Remove(); continue; } extension.Attr("protected", @protected); } // read overwriteable settings AddOrReplace(extension, "title", ExtensionBL.GetExtensionPreference(serviceUri, "title.custom")); AddOrReplace(extension, "label", ExtensionBL.GetExtensionPreference(serviceUri, "label.custom")); AddOrReplace(extension, "uri.logo", ExtensionBL.GetExtensionPreference(serviceUri, "uri.logo.custom")); AddOrReplace(extension, "namespace", ExtensionBL.GetExtensionPreference(serviceUri, "namespace.custom")); extension.Elem("description.custom", ExtensionBL.GetExtensionPreference(serviceUri, "description.custom")); // check which functions to keep string[] allowedFunctions = (ExtensionBL.GetExtensionPreference(serviceUri, "functions") ?? string.Empty).Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries); if(allowedFunctions.Length > 0) { foreach(XDoc function in extension["function"]) { // check if user specified a list of functions to show string name = function["name"].Contents; if(Array.FindIndex(allowedFunctions, current => current.EqualsInvariantIgnoreCase(name)) < 0) { function.Remove(); } } } // check if extension has any functions if(extension["function"].ListLength == 0) { extension.Remove(); } } // build response document string format = context.GetParam("format", "html"); if(StringUtil.EqualsInvariant(format, "xml")) { response.Return(DreamMessage.Ok(extensions)); } else { // prepare document string header = string.Format("{0} - Registered Extensions", DekiContext.Current.Instance.SiteName); XDoc result = new XDoc("html").Attr("xmlns", "http://www.w3.org/1999/xhtml") .Start("head") .Elem("title", header) .Start("meta").Attr("http-equiv", "content-type").Attr("content", "text/html;charset=utf-8").End() .End(); result.Start("body"); result.Elem("h1", header); // build table of contents result.Elem("strong", "Table of Contents"); result.Start("ol"); int count = 0; foreach(XDoc library in extensions["extension"]) { ++count; XUri serviceUri = library["@uri"].AsUri; result.Start("li") .Start("a") .Attr("href", "#section" + count) .Value(ExtensionBL.GetExtensionPreference(serviceUri, "title.custom") ?? library["title"].AsText) .End() .End(); } result.End(); // enumerate libraries count = 0; foreach(XDoc library in extensions["extension"]) { ++count; // read overwriteable settings string title = library["title"].AsText; string logo = library["uri.logo"].AsText; string ns = library["namespace"].AsText; bool @protected = library["@protected"].AsBool ?? false; // show & link library name result.Start("h2").Attr("id", "section" + count); if(!string.IsNullOrEmpty(library["uri.help"].AsText)) { result.Start("a").Attr("href", library["uri.help"].AsText).Attr("target", "_blank").Attr("title", library["title"].AsText + " Documentation").Value(title).End(); } else { result.Value(title); } if(@protected) { var resources = DekiContext.Current.Resources; var builder = new DekiResourceBuilder(); builder.Append(" ("); builder.Append(DekiResources.PROTECTED()); builder.Append(")"); result.Value(builder.Localize(resources)); } result.End(); // show optional logo if(!string.IsNullOrEmpty(logo)) { result.Start("img").Attr("src", logo).Attr("alt", title).End(); } // show descriptions if(library["uri.license"].AsText != null) { result.Start("a").Attr("href", library["uri.license"].AsText).Attr("target", "_blank").Value("Read Library License").End(); } if(!string.IsNullOrEmpty(library["description"].AsText)) { result.Elem("p", library["description"].AsText); } if(!string.IsNullOrEmpty(library["description.custom"].AsText)) { result.Elem("p", library["description.custom"].AsText); } // enumerate library functions XDoc functions = new XDoc("functions").AddAll(library["function"]); functions.Sort(delegate(XDoc left, XDoc right) { return StringUtil.CompareInvariantIgnoreCase(left["name"].Contents, right["name"].Contents); }); foreach(XDoc function in functions["function"]) { AddFunction(result, ns, function); } } result.End(); switch(format) { default: case "html": response.Return(DreamMessage.Ok(MimeType.HTML, result.ToString())); break; case "body": response.Return(DreamMessage.Ok(MimeType.TEXT_UTF8, result["body"].Contents)); break; } } yield break; }
public Yield GetSiteFunctions(DreamContext context, DreamMessage request, Result <DreamMessage> response) { if (UserBL.IsAnonymous(DekiContext.Current.User)) { throw new SiteMustBeLoggedInForbiddenException(); } // build set of libraries List <XDoc> libraries = DekiContext.Current.Instance.RunningServices.ExtensionServices .Select(x => x.Extension.Manifest).ToList(); // add registered libraries libraries.Sort((left, right) => left["title"].Contents.CompareInvariantIgnoreCase(right["title"].Contents)); // add built-in functions XDoc builtinlib = new XDoc("extension"); builtinlib.Elem("title", "Built-in Functions"); builtinlib.Elem("label", "Built-in"); builtinlib.Elem("uri.help", "http://wiki.developer.mindtouch.com/MindTouch_Deki/DekiScript/Reference"); builtinlib.Elem("description", "The following functions and variables are part the DekiScript and MindTouch runtime environment."); foreach (var function in ScriptRuntime.Functions.Values) { if (function.Access == DreamAccess.Public) { builtinlib.Add(function.ToXml(null)); } } libraries.Insert(0, builtinlib); // create composite document bool hasUnsafeContentPermission = PermissionsBL.IsUserAllowed(DekiContext.Current.User, Permissions.UNSAFECONTENT); XDoc extensions = new XDoc("extensions").AddAll(libraries); foreach (XDoc extension in extensions["extension"]) { XUri serviceUri = extension["@uri"].AsUri; // check if extension is protected bool @protected; bool.TryParse(ExtensionBL.GetExtensionPreference(serviceUri, "protected"), out @protected); if (@protected) { if (!hasUnsafeContentPermission) { extension.Remove(); continue; } extension.Attr("protected", @protected); } // read overwriteable settings AddOrReplace(extension, "title", ExtensionBL.GetExtensionPreference(serviceUri, "title.custom")); AddOrReplace(extension, "label", ExtensionBL.GetExtensionPreference(serviceUri, "label.custom")); AddOrReplace(extension, "uri.logo", ExtensionBL.GetExtensionPreference(serviceUri, "uri.logo.custom")); AddOrReplace(extension, "namespace", ExtensionBL.GetExtensionPreference(serviceUri, "namespace.custom")); extension.Elem("description.custom", ExtensionBL.GetExtensionPreference(serviceUri, "description.custom")); // check which functions to keep string[] allowedFunctions = (ExtensionBL.GetExtensionPreference(serviceUri, "functions") ?? string.Empty).Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries); if (allowedFunctions.Length > 0) { foreach (XDoc function in extension["function"]) { // check if user specified a list of functions to show string name = function["name"].Contents; if (Array.FindIndex(allowedFunctions, current => current.EqualsInvariantIgnoreCase(name)) < 0) { function.Remove(); } } } // check if extension has any functions if (extension["function"].ListLength == 0) { extension.Remove(); } } // build response document string format = context.GetParam("format", "html"); if (StringUtil.EqualsInvariant(format, "xml")) { response.Return(DreamMessage.Ok(extensions)); } else { // prepare document string header = string.Format("{0} - Registered Extensions", DekiContext.Current.Instance.SiteName); XDoc result = new XDoc("html").Attr("xmlns", "http://www.w3.org/1999/xhtml") .Start("head") .Elem("title", header) .Start("meta").Attr("http-equiv", "content-type").Attr("content", "text/html;charset=utf-8").End() .End(); result.Start("body"); result.Elem("h1", header); // build table of contents result.Elem("strong", "Table of Contents"); result.Start("ol"); int count = 0; foreach (XDoc library in extensions["extension"]) { ++count; XUri serviceUri = library["@uri"].AsUri; result.Start("li") .Start("a") .Attr("href", "#section" + count) .Value(ExtensionBL.GetExtensionPreference(serviceUri, "title.custom") ?? library["title"].AsText) .End() .End(); } result.End(); // enumerate libraries count = 0; foreach (XDoc library in extensions["extension"]) { ++count; // read overwriteable settings string title = library["title"].AsText; string logo = library["uri.logo"].AsText; string ns = library["namespace"].AsText; bool @protected = library["@protected"].AsBool ?? false; // show & link library name result.Start("h2").Attr("id", "section" + count); if (!string.IsNullOrEmpty(library["uri.help"].AsText)) { result.Start("a").Attr("href", library["uri.help"].AsText).Attr("target", "_blank").Attr("title", library["title"].AsText + " Documentation").Value(title).End(); } else { result.Value(title); } if (@protected) { var resources = DekiContext.Current.Resources; var builder = new DekiResourceBuilder(); builder.Append(" ("); builder.Append(DekiResources.PROTECTED()); builder.Append(")"); result.Value(builder.Localize(resources)); } result.End(); // show optional logo if (!string.IsNullOrEmpty(logo)) { result.Start("img").Attr("src", logo).Attr("alt", title).End(); } // show descriptions if (library["uri.license"].AsText != null) { result.Start("a").Attr("href", library["uri.license"].AsText).Attr("target", "_blank").Value("Read Library License").End(); } if (!string.IsNullOrEmpty(library["description"].AsText)) { result.Elem("p", library["description"].AsText); } if (!string.IsNullOrEmpty(library["description.custom"].AsText)) { result.Elem("p", library["description.custom"].AsText); } // enumerate library functions XDoc functions = new XDoc("functions").AddAll(library["function"]); functions.Sort(delegate(XDoc left, XDoc right) { return(StringUtil.CompareInvariantIgnoreCase(left["name"].Contents, right["name"].Contents)); }); foreach (XDoc function in functions["function"]) { AddFunction(result, ns, function); } } result.End(); switch (format) { default: case "html": response.Return(DreamMessage.Ok(MimeType.HTML, result.ToString())); break; case "body": response.Return(DreamMessage.Ok(MimeType.TEXT_UTF8, result["body"].Contents)); break; } } yield break; }