diff --git a/Core-Tests/ReverseFormatterTests.cs b/Core-Tests/ReverseFormatterTests.cs index bfa7edf..01a8cc4 100644 --- a/Core-Tests/ReverseFormatterTests.cs +++ b/Core-Tests/ReverseFormatterTests.cs @@ -24,14 +24,20 @@ namespace ScrewTurn.Wiki.Tests { [TestCase("text", "text")] [TestCase("
text
", "@@text@@")] [TestCase("text", "{{'''text'''}}")] - [TestCase("
text
","(((text))){br}")] + [TestCase("
text
", "(((text))){br}")] [TestCase("
text
", "text{br}")] - [TestCase("
  1. 1
  2. 2
","{br}# 1{br}# 2{br}{br}")] - [TestCase("", "{br}* 1{br}* 2{br}{br}")] - [TestCase("I'm an anchor", "[anchor|#init]I'm an anchor")] - [TestCase("This recall an anchor", "[#init|This recall an anchor]")] - [TestCase("BIG TITLE","[^google.com|BIG TITLE]")] - [TestCase("try to esc tag","try to esc tag")] + [TestCase("
  1. 1
  2. 2
", "# 1{br}# 2{br}{br}")] + [TestCase("", "* 1{br}* 2{br}{br}")] + //[TestCase("", "* it 1{br}** 1.1{br}** 1.2{br}* it2{br}{br}")] + //[TestCase("", "* it 1{br}*# 1.1{br}*# 1.2{br}* it2{br}{br}")] + [TestCase("I'm an anchor", "[anchor|#init]I'm an anchor")] + [TestCase("This recall an anchor", "[#init|This recall an anchor]")] + [TestCase("BIG TITLE", "[^google.com|BIG TITLE]")] + [TestCase("try to esc tag", "try to esc tag")] + [TestCase("
\"left

leftalign

", "[imageleft|leftalign|{UP(MainPage)}image.png|^www.link.com]{br}")] + [TestCase("\"inlineimage\"", "[image|inlineimage|{UP(MainPage)}image.png]{br}")] + [TestCase("
\"autoalign\"

autoalign

", "[imageauto|autoalign|{UP(MainPage)}image.png]{br}")] + [TestCase("
\"Auto

Auto align

", "[imageauto|Auto align|{UP(MainPage)}image.png|^www.link.com]")] public void PlainTest(string input, string output) { Assert.AreEqual(output, ReverseFormatter.ReverseFormat(input)); } diff --git a/Core/ReverseFormatter.cs b/Core/ReverseFormatter.cs index 6f60692..2c45932 100644 --- a/Core/ReverseFormatter.cs +++ b/Core/ReverseFormatter.cs @@ -80,6 +80,61 @@ namespace ScrewTurn.Wiki { //private static string result = ""; + /// + /// Processes the sub list text. + /// + /// The node. + /// + private static string processSubListText(XmlNode node) { + string result = ""; + if(node.HasChildNodes) + result += processChild(node.ChildNodes); + else + result += node.InnerText.ToString(); + return result; + } + + /// + /// Processes the list. + /// + /// The nodes. + /// + private static string processList(XmlNodeList nodes) { + string result = ""; + string ul = "*"; + string ol = "#"; + + foreach(XmlNode node in nodes) { + string marker = ""; + string text = ""; + + if(node.NodeType.ToString().ToLowerInvariant() == "text") + { + text += " " + processSubListText(node) + "{br}"; + } + else { + switch(node.Name.ToLowerInvariant().ToString()) { + case "li": + if(node.ParentNode.Name.ToLowerInvariant().ToString() == "ul") + marker += ul + processList(node.ChildNodes); + if(node.ParentNode.Name.ToLowerInvariant().ToString() == "ol") + marker += ol + processList(node.ChildNodes); + //else + // marker += "PIPPO2" + processList(node.ChildNodes); + break; + case "ol": + marker += ol + processList(node.ChildNodes); + break; + case "ul": + marker += ul + processList(node.ChildNodes); + break; + } + } + result += marker + text; + } + return result; + } + /// /// Processes the image. /// @@ -92,7 +147,7 @@ namespace ScrewTurn.Wiki { if(attName.Name.ToString() == "src") { string[] path = attName.Value.ToString().Split('='); //result += "|" + processChild(node.ChildNodes); - result += "{" + "UP(" + path[1].Split('&')[0] + ")}" + path[2]; + result += "{"+"UP("+ path[1].Split('&')[0] +")}" + path[2]; } } } @@ -209,16 +264,22 @@ namespace ScrewTurn.Wiki { case "br": result += ("{br}" + processChild(node.ChildNodes)); break; - case "ol": - result += processChild(node.ChildNodes) + "{br}"; - break; - case "ul": - result += processChild(node.ChildNodes) + "{br}"; - break; case "table": - result += processChild(node.ChildNodes); - break; - case "tbody": + string image = ""; + bool isImage = false; + foreach(XmlAttribute attName in node.Attributes) { + if(attName.Value.ToString() == "imageauto") { + isImage = true; + image += "[imageauto|" + processChild(node.ChildNodes) + "]{br}"; + } + } + if (isImage){ + result += image; + break; + } + else result += processChild(node.ChildNodes); + break; + case "tbody": result += processChild(node.ChildNodes); break; case "tr": @@ -227,16 +288,14 @@ namespace ScrewTurn.Wiki { case "td": result += processChild(node.ChildNodes); break; + case "ol": + result += processList(node.ChildNodes) + "{br}"; + break; + case "ul": + result += processList(node.ChildNodes) + "{br}"; + break; case "li": - if (node.ParentNode.Name.ToLowerInvariant() == "ol") - result += ("#" + " "+processChild(node.ChildNodes) + "{br}"); - else if (node.ParentNode.Name.ToLowerInvariant() == "ul") - result += ("*" + " "+ processChild(node.ChildNodes) + "{br}"); - else if(node.ParentNode.Name.ToLowerInvariant() == "li") - if(node.ParentNode.ParentNode.Name.ToLowerInvariant() == "ol") - result += ("*#" + " " + processChild(node.ChildNodes)); - else if(node.ParentNode.ParentNode.Name.ToLowerInvariant() == "ul") - result += ("#*" + " " + processChild(node.ChildNodes)); + result += processChild(node.ChildNodes); break; case "sup": result += ("" + processChild(node.ChildNodes) + ""); @@ -264,9 +323,9 @@ namespace ScrewTurn.Wiki { result += "[imageleft" + processChildImage(node.ChildNodes) + "]{br}"; } if(attName.Value.ToString() == "imageright") - result += "[imageleft" + processChildImage(node.ChildNodes) + "]{br}"; + result += "[imageright" + processChildImage(node.ChildNodes) + "]{br}"; if(attName.Value.ToString() == "imageauto") - result += "[imageleft" + processChildImage(node.ChildNodes) + "]{br}"; + result += "[imageauto" + processChildImage(node.ChildNodes) + "]{br}"; } } else @@ -274,45 +333,52 @@ namespace ScrewTurn.Wiki { break; case "img": - if(node.Attributes.Count != 0) { - XmlAttributeCollection attribute = node.Attributes; - foreach(XmlAttribute attName in attribute) { - //if(attName.Name.ToString() == "src") { - // string[] path = attName.Value.ToString().Split('='); - //result += "|" + processChild(node.ChildNodes); - result += processImage(node); - //} + string description = ""; + bool hasClass = false; + if(node.Attributes.Count != 0){ + foreach(XmlAttribute attName in node.Attributes) { + if(attName.Name.ToString() == "alt") + description = attName.Value.ToString(); + if(attName.Name.ToString() == "class") + hasClass = true; } } + if(!hasClass) + result += "[image|" + description + "|" + processImage(node) + "]{br}"; + else + result += description+"|"+processImage(node); break; case "a": string link=""; string target=""; string title=""; - if(node.Attributes.Count != 0) { - XmlAttributeCollection attribute = node.Attributes; - foreach(XmlAttribute attName in attribute) { - if(attName.Name.ToString() != "id".ToLowerInvariant()) { - if(attName.Value.ToString() == "_blank") - target += "^"; - if(attName.Name.ToString() == "href") - link += attName.Value.ToString(); - if(attName.Name.ToString() == "title") - title += attName.Value.ToString(); - } - else{ - anchor = true; - result += "[anchor|#" + attName.Value.ToString().ToLowerInvariant() + "]" + processChild(node.ChildNodes); - break; +// if(node.FirstChild.Name.ToLowerInvariant() != "img") { + if(node.Attributes.Count != 0) { + XmlAttributeCollection attribute = node.Attributes; + foreach(XmlAttribute attName in attribute) { + if(attName.Name.ToString() != "id".ToLowerInvariant()) { + if(attName.Value.ToString() == "_blank") + target += "^"; + if(attName.Name.ToString() == "href") + link += attName.Value.ToString(); + if(attName.Name.ToString() == "title") + title += attName.Value.ToString(); + } + else { + anchor = true; + result += "[anchor|#" + attName.Value.ToString().ToLowerInvariant() + "]" + processChild(node.ChildNodes); + break; + } } + if(!anchor) + if(title != link) + result += "[" + target + link + "|" + processChild(node.ChildNodes) + "]"; + else + result += "[" + target + link + "|" + "]" + processChild(node.ChildNodes); } - if(!anchor) - if(title != link) - result += "[" + target + link + "|" + processChild(node.ChildNodes) + "]"; - else - result += "[" + target + link + "|" + "]" + processChild(node.ChildNodes); - } - break; + //} + //else processChild(node.ChildNodes); + break; default: result += (node.OuterXml);