public string Compile(bool minify) { var js = jslastvalid; var html = htmllastvalid; // Merge fields var output = new StringBuilder(html); output.Replace("%resourcepath%", Program.BlobPathResource); output.Replace("%build%", Program.Config.Configuration.Build.ToString()); output.Replace("%buildserial%", Program.Config.Configuration.BuildSerial.ToString()); html = output.ToString(); // Minify if (minify) { js = Minify.MinifyJS(js); html = Minify.MinifyHTML(html); } // Add JS var doc = new HtmlDocument(); doc.LoadHtml(html); doc.GetElementbyId("_script_").AppendChild(doc.CreateComment(js)); return doc.DocumentNode.OuterHtml; }
public void Parse(string input, string[] args = null) { var xxr = new XamlXmlReader(new StringReader(input), new XamlSchemaContext()); var graphReader = new XamlObjectWriter(xxr.SchemaContext); while (xxr.Read()) graphReader.WriteNode(xxr); var page = (Page)graphReader.Result; // Map our generators var g = new Generator(); g.Map<Page, PageGeneratorBlock>(); g.Map<Button, ButtonGeneratorBlock>(); g.Map<StackPanel, StackPanelGeneratorBlock>(); var doc = new HtmlDocument(); var html = doc.CreateElement("html"); g.Generate(html, page); // HTML5 Doc type doc.DocumentNode.AppendChild(doc.CreateComment("<!DOCTYPE html>")); doc.DocumentNode.AppendChild(html); doc.Save("test.htm"); var cssContents = g.GenerateStyles(page); File.WriteAllText("XamlCore.css", cssContents); }
public IHtmlComment AddComment(IHtmlContainer container, int index, string comment) { var node = _document.CreateComment(comment); AddNode(container, index, node); return(node.AsComment()); }
public static string Html(string value) { Contract.Requires(null != value, "value"); // Load var doc = new HtmlDocument(); doc.LoadHtml(value); // Minify all embeded CSS var styleNodes = doc.DocumentNode.SelectNodes("//style"); if (null != styleNodes) { foreach (var item in styleNodes) { item.InnerHtml = CascadingStyle(item.InnerHtml); } } // Strip comments var comments = doc.DocumentNode.SelectNodes("//comment()"); if (null != comments) { foreach (var item in comments) { if (item.InnerText.Substr(0, 9) != "<!DOCTYPE") { item.Remove(); } } } // Minify all embeded JS var scriptNodes = doc.DocumentNode.SelectNodes("//script"); if (null != scriptNodes) { foreach (var item in scriptNodes) { var script = JavaScript(item.InnerHtml); item.RemoveAllChildren(); item.AppendChild(doc.CreateComment(script)); } } //https://github.com/markbeaton/TidyManaged ? // Convert back to string value = doc.DocumentNode.OuterHtml; value = Regex.Replace(value, @"\>\s+\<", "><", RegexOptions.Compiled | RegexOptions.Multiline);// Convert multiple concecutive spaces into one value = Regex.Replace(value, @"\s+", " ", RegexOptions.Compiled | RegexOptions.Multiline);// Convert multiple concecutive spaces into one value = Regex.Replace(value, @"^\s+", "", RegexOptions.Compiled | RegexOptions.Multiline);// Strip space at start of line value = Regex.Replace(value, "[\\r\\n]", string.Empty, RegexOptions.Compiled | RegexOptions.Multiline);// Strip newlines return value; }
/// <summary> /// Converts the MathML blocks to be readable by OneNote /// </summary> /// <param name="htmlDoc"></param> private void ConvertMathMl(HtmlDocument htmlDoc) { HtmlNodeCollection mathNodes = htmlDoc.DocumentNode.SelectNodes("//math"); if (mathNodes == null) { return; } foreach (var mathNode in mathNodes.ToList()) { mathNode.Attributes.RemoveAll(); HtmlAttribute mathMlNamespaceAttr = htmlDoc.CreateAttribute("xmlns:mml", MathMlNameSpace); mathNode.Attributes.Add(mathMlNamespaceAttr); foreach (var node in mathNode.DescendantsAndSelf()) { node.Name = "mml:" + node.Name; } string newMathMlString = String.Format(MathMlOutline, mathNode.OuterHtml); HtmlCommentNode newMathNode = htmlDoc.CreateComment(newMathMlString); mathNode.ParentNode.ReplaceChild(newMathNode, mathNode); } }
public static string ParseEntity(string entityHtml) { //HTML Agility pack drops closing option tags for some reason (bug?) HtmlNode.ElementsFlags.Remove("option"); HtmlDocument html = new HtmlDocument(); html.LoadHtml(String.Format("<html>{0}</html>", entityHtml)); var entities = html.DocumentNode.SelectNodes("//*[@data-componentid]"); var dummyTemplateId = NullUri; var dummyTemplateModified = Epoch; string isRepositoryPublished = "false"; if (entities != null) { foreach (var entity in entities) { string compId = ReadAndRemoveAttribute(entity, "data-componentid"); string compModified = ReadAndRemoveAttribute(entity, "data-componentmodified", Epoch); string templateId = ReadAndRemoveAttribute(entity, "data-componenttemplateid", NullUri); string templateModified = ReadAndRemoveAttribute(entity, "data-componenttemplatemodified", Epoch); // store template id as dummy default for next round (all our component templates generate the same output anyways) if (!templateId.Equals(NullUri)) { dummyTemplateId = templateId; dummyTemplateModified = templateModified; } else { // XPM does not like null uris for templates, so use defaults set before templateId = dummyTemplateId; templateModified = dummyTemplateModified; // using a dummy template, so this should be considered a dynamic cp isRepositoryPublished = IsQueryBased; } if (!String.IsNullOrEmpty(compId)) { HtmlCommentNode cpData = html.CreateComment(String.Format(ComponentPresentationFormat, compId, compModified, templateId, templateModified, isRepositoryPublished)); entity.ChildNodes.Insert(0, cpData); } //string lastProperty = ""; //int index = 1; var properties = entity.SelectNodes("//*[@data-xpath]"); if (properties != null && properties.Count > 0) { foreach (var property in properties) { var xpath = ReadAndRemoveAttribute(property, "data-xpath"); //TODO index of mv fields //index = propName == lastProperty ? index+1 : 1; //lastProperty = propName; HtmlCommentNode fieldData = html.CreateComment(String.Format(FieldFormat, xpath)); if (property.HasChildNodes) { property.ChildNodes.Insert(0, fieldData); } else { property.ParentNode.InsertBefore(fieldData, property); } } } } } return html.DocumentNode.SelectSingleNode("/html").InnerHtml; }
public static string ParseRegion(string regionHtml) { HtmlDocument html = new HtmlDocument(); html.LoadHtml(String.Format("<html>{0}</html>", regionHtml)); var entity = html.DocumentNode.SelectSingleNode("//*[@data-region]"); if (entity != null) { string name = ReadAndRemoveAttribute(entity, "data-region"); // TODO determine min occurs and max occurs for the region HtmlCommentNode regionData = html.CreateComment(MarkRegion(name)); entity.ChildNodes.Insert(0, regionData); } return html.DocumentNode.SelectSingleNode("/html").InnerHtml; }
/// <summary> /// Replace http url link to ScriptNotify container in order to open IE in preview webview. /// </summary> /// <param name="content">A html content</param> /// <returns></returns> private static string injectScriptNotifyToHttpLink(string content) { var doc = new HtmlDocument(); doc.LoadHtml(content); var headNode = doc.DocumentNode.FirstChild.FirstChild; // head tag if (headNode.Name.Equals("head")) Debug.WriteLine("head"); // insert javascript function HtmlNode scriptElement = doc.CreateElement("script"); scriptElement.Attributes.Add("type", "text/javascript"); const string scriptContent = @"function gotoLink(args){ window.external.notify('url:' + args); return false;}"; scriptElement.AppendChild(doc.CreateComment(scriptContent)); headNode.AppendChild(scriptElement); // replace all a-tag. http://stackoverflow.com/a/23966320/361100 foreach (HtmlNode node in doc.DocumentNode.FirstChild.Element("body").Descendants("a")) { if (node.Name.Equals("a")) { HtmlAttribute att = node.Attributes.FirstOrDefault(l => l.Name.Equals("href")); if (att != null) { node.Attributes.Add("onClick", String.Format("gotoLink('{0}');", att.Value)); att.Value = "#"; } } } return doc.DocumentNode.OuterHtml; }