using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
using System.ComponentModel;
using System.Xml;
using System.Xml.Schema;
using System.IO;
namespace XMLConvert
{
///
/// Root Node
///
[XmlRoot("html")]
public class vlnhtml : VlnHtmlContainer
{
}
[TypeConverter(typeof(ExpandableObjectConverter))]
///
/// Part
///
public class VlnHtmlPart
{
#region ID
protected string _ID = string.Empty;
[System.ComponentModel.DefaultValueAttribute("")]
[XmlIgnore]
public string ID
{
get { return _ID; }
set { _ID = value; }
}
#endregion
//#region Parent and Containing Svg
//// ToDo: MyParent
//private SvgPartGrouping _MyParent;
//[XmlIgnore()]
//public SvgPartGrouping MyParent
//{
// get { return _MyParent; }
// set { _MyParent = value; }
//}
//// ToDo: MySvg
//private Svg _MySvg;
//public Svg MySvg
//{
// get { return _MySvg; }
// set { _MySvg = value; }
//}
//internal void SetParent(SvgPartGrouping myParent)
//{
// _MyParent = myParent;
// _MySvg = myParent.MySvg == null? MyParent : myParent.MySvg;
//}
//#endregion
#region Dictionary of Parts
internal virtual void AddLookup(Dictionary lookUp)
{
if (_ID != string.Empty && !lookUp.ContainsKey(_ID))
lookUp.Add(_ID, this);
}
#endregion
}
[Serializable()]
[TypeConverter(typeof(VlnHtmlPartsConverter))]
///
/// Parts
///
public class VlnHtmlParts : CollectionBase, ICustomTypeDescriptor
{
/// Notifies when the collection has been modified.
public event EventHandler OnItemsChanged;
/// Notifies that an item has been added.
public event VlnHtmlPartHandler OnItemAdd;
/// Notifies that items have been added.
public event VlnHtmlPartHandler OnItemsAdd;
/// Notifies that an item has been removed.
public event VlnHtmlPartHandler OnItemRemove;
///
///
/// Initializes a new instance of .
///
///
public VlnHtmlParts()
{
}
///
///
/// Initializes a new instance of based on another .
///
///
///
/// A from which the contents are copied
///
public VlnHtmlParts(VlnHtmlParts value)
{
this.AddRange(value);
}
///
///
/// Initializes a new instance of containing any array of objects.
///
///
///
/// A array of objects with which to intialize the collection
///
public VlnHtmlParts(VlnHtmlPart[] value)
{
this.AddRange(value);
}
///
/// Represents the entry at the specified index of the .
///
/// The zero-based index of the entry to locate in the collection.
///
/// The entry at the specified index of the collection.
///
/// is outside the valid range of indexes for the collection.
public VlnHtmlPart this[int index]
{
get { return ((VlnHtmlPart)(List[index])); }
set { List[index] = value; }
}
//#region SetupInheritance
//internal void SetupInheritance(SvgInheritedSettings myParentsSettings)
//{
// foreach (vlnhtmlpart vlnhtmlpart in List)
// vlnhtmlpart.SetupInheritance(myParentsSettings);
//}
//#endregion
#region Dictionary of Parts
internal void AddLookup(Dictionary lookUp)
{
foreach (VlnHtmlPart vlnhtmlpart in List)
vlnhtmlpart.AddLookup(lookUp);
}
#endregion
internal static void ShowException(Exception ex)
{
StringBuilder sb = new StringBuilder();
string sep = "";
for (Exception ex1 = ex; ex1 != null; ex1 = ex1.InnerException)
{
sb.Append(sep + string.Format("ShowException {0} - {1}", ex1.GetType().Name, ex1.Message));
sep = "\r\n";
}
Console.WriteLine(sb);
}
///
/// Adds a with the specified value to the
/// .
///
/// The to add.
///
/// The index at which the new element was inserted.
///
///
public int Add(VlnHtmlPart value)
{
int ndx = List.Add(value);
if (OnItemAdd != null) { OnItemAdd(this, new vlnhtmlpartArgs(value)); }
if (OnItemsChanged != null) { OnItemsChanged(value, EventArgs.Empty); }
return ndx;
}
///
/// Copies the elements of an array to the end of the .
///
///
/// An array of type containing the objects to add to the collection.
///
///
/// None.
///
///
public void AddRange(VlnHtmlPart[] value)
{
for (int i = 0; i < value.Length; i++)
{
this.Add(value[i]);
}
if (OnItemsAdd != null) { OnItemsAdd(this, new vlnhtmlpartArgs(value)); }
if (OnItemsChanged != null) { OnItemsChanged(value, EventArgs.Empty); }
}
///
///
/// Adds the contents of another to the end of the collection.
///
///
///
/// A containing the objects to add to the collection.
///
///
/// None.
///
///
public void AddRange(VlnHtmlParts value)
{
for (int i = 0; i < value.Count; i++)
{
this.Add(value[i]);
}
if (OnItemsAdd != null) { OnItemsAdd(this, new vlnhtmlpartArgs(value)); }
if (OnItemsChanged != null) { OnItemsChanged(value, EventArgs.Empty); }
}
///
/// Gets a value indicating whether the
/// contains the specified .
///
/// The to locate.
///
/// if the is contained in the collection;
/// otherwise, .
///
///
public bool Contains(VlnHtmlPart value)
{
return List.Contains(value);
}
///
/// Copies the values to a one-dimensional instance at the
/// specified index.
///
/// The one-dimensional that is the destination of the values copied from .
/// The index in where copying begins.
///
/// None.
///
/// is multidimensional. -or- The number of elements in the is greater than the available space between and the end of .
/// is .
/// is less than 's lowbound.
///
public void CopyTo(VlnHtmlPart[] array, int index)
{
List.CopyTo(array, index);
}
///
/// Returns the index of a in
/// the .
///
/// The to locate.
///
/// The index of the of in the
/// , if found; otherwise, -1.
///
///
public int IndexOf(VlnHtmlPart value)
{
return List.IndexOf(value);
}
///
/// Inserts a into the at the specified index.
///
/// The zero-based index where should be inserted.
/// The to insert.
/// None.
///
public void Insert(int index, VlnHtmlPart value)
{
List.Insert(index, value);
if (OnItemAdd != null) { OnItemAdd(this, new vlnhtmlpartArgs(value)); }
if (OnItemsChanged != null) { OnItemsChanged(value, EventArgs.Empty); }
}
///
/// Removes a specific from the
/// .
///
/// The to remove from the .
/// None.
/// is not found in the Collection.
public void Remove(VlnHtmlPart value)
{
List.Remove(value);
if (OnItemRemove != null) { OnItemRemove(this, new vlnhtmlpartArgs(value)); }
if (OnItemsChanged != null) { OnItemsChanged(value, EventArgs.Empty); }
}
#region ICustomTypeDescriptor impl
public String GetClassName()
{ return TypeDescriptor.GetClassName(this, true); }
public AttributeCollection GetAttributes()
{ return TypeDescriptor.GetAttributes(this, true); }
public String GetComponentName()
{ return TypeDescriptor.GetComponentName(this, true); }
public TypeConverter GetConverter()
{ return TypeDescriptor.GetConverter(this, true); }
public EventDescriptor GetDefaultEvent()
{ return TypeDescriptor.GetDefaultEvent(this, true); }
public PropertyDescriptor GetDefaultProperty()
{ return TypeDescriptor.GetDefaultProperty(this, true); }
public object GetEditor(Type editorBaseType)
{ return TypeDescriptor.GetEditor(this, editorBaseType, true); }
public EventDescriptorCollection GetEvents(System.Attribute[] attributes)
{ return TypeDescriptor.GetEvents(this, attributes, true); }
public EventDescriptorCollection GetEvents()
{ return TypeDescriptor.GetEvents(this, true); }
public object GetPropertyOwner(PropertyDescriptor pd)
{ return this; }
///
/// Called to get the properties of this type. Returns properties with certain
/// attributes. this restriction is not implemented here.
///
///
///
public PropertyDescriptorCollection GetProperties(System.Attribute[] attributes)
{ return GetProperties(); }
///
/// Called to get the properties of this type.
///
///
public PropertyDescriptorCollection GetProperties()
{
// Create a collection object to hold property descriptors
PropertyDescriptorCollection pds = new PropertyDescriptorCollection(null);
// Iterate the list
for (int i = 0; i < this.Count; i++)
{
// Create a property descriptor for the item and add to the property descriptor collection
vlnhtmlpartsPropertyDescriptor pd = new vlnhtmlpartsPropertyDescriptor(this, i);
pds.Add(pd);
}
// return the property descriptor collection
return pds;
}
#endregion
/// Event arguments for the vlnhtmlparts collection class.
public class vlnhtmlpartArgs : EventArgs
{
private VlnHtmlParts t;
/// Default constructor.
public vlnhtmlpartArgs()
{
t = new VlnHtmlParts();
}
/// Initializes with a vlnhtmlpart.
/// Data object.
public vlnhtmlpartArgs(VlnHtmlPart t)
: this()
{
this.t.Add(t);
}
/// Initializes with a collection of vlnhtmlpart objects.
/// Collection of data.
public vlnhtmlpartArgs(VlnHtmlParts ts)
: this()
{
this.t.AddRange(ts);
}
/// Initializes with an array of vlnhtmlpart objects.
/// Array of data.
public vlnhtmlpartArgs(VlnHtmlPart[] ts)
: this()
{
this.t.AddRange(ts);
}
/// Gets or sets the data of this argument.
public VlnHtmlParts vlnhtmlparts
{
get { return t; }
set { t = value; }
}
}
/// vlnhtmlparts event handler.
public delegate void VlnHtmlPartHandler(object sender, vlnhtmlpartArgs e);
#region Property Descriptor
///
/// Summary description for CollectionPropertyDescriptor.
///
public partial class vlnhtmlpartsPropertyDescriptor : vlnListPropertyDescriptor
{
private VlnHtmlPart Item { get { return (VlnHtmlPart)_Item; } }
public vlnhtmlpartsPropertyDescriptor(VlnHtmlParts collection, int index) : base(collection, index) { ;}
public override string DisplayName
{ get { return Item.GetType().Name; } }
}
#endregion
[Serializable()]
public partial class vlnListPropertyDescriptor : PropertyDescriptor
{
protected object _Item = null;
public vlnListPropertyDescriptor(System.Collections.IList collection, int index)
: base("#" + index.ToString(), null)
{ _Item = collection[index]; }
public override bool CanResetValue(object component)
{ return true; }
public override Type ComponentType
{ get { return _Item.GetType(); } }
public override object GetValue(object component)
{ return _Item; }
public override bool IsReadOnly
{ get { return false; } }
public override Type PropertyType
{ get { return _Item.GetType(); } }
public override void ResetValue(object component)
{ ;}
public override bool ShouldSerializeValue(object component)
{ return true; }
public override void SetValue(object component, object value)
{ /*_Item = value*/;}
//public override AttributeCollection Attributes
//{ get { return new AttributeCollection(null); } }
public override string DisplayName
{ get { return _Item.ToString(); } }
public override string Description
{ get { return _Item.ToString(); } }
public override string Name
{ get { return _Item.ToString(); } }
} // Class
#region Converter
internal class VlnHtmlPartsConverter : ExpandableObjectConverter
{
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destType)
{
if (destType == typeof(string) && value is VlnHtmlParts)
{
// Return department and department role separated by comma.
return ((VlnHtmlParts)value).List.Count.ToString() + " SVG Drawing Parts";
}
return base.ConvertTo(context, culture, value, destType);
}
}
#endregion
/// SVGParts event handler.
//public delegate void VlnHtmlPartHandler(object sender, VlnHtmlPartArgs e);
//#region Property Descriptor
/////
///// Summary description for CollectionPropertyDescriptor.
/////
//public partial class VlnHtmlPartsPropertyDescriptor : vlnListPropertyDescriptor
//{
// private VlnHtmlPart Item { get { return (VlnHtmlPart)_Item; } }
// public VlnHtmlPartsPropertyDescriptor(VlnHtmlParts collection, int index) : base(collection, index) { ;}
// public override string DisplayName
// { get { return Item.GetType().Name; } }
//}
//#endregion
//[Serializable()]
//public partial class vlnListPropertyDescriptor : PropertyDescriptor
//{
// protected object _Item = null;
// public vlnListPropertyDescriptor(System.Collections.IList collection, int index)
// : base("#" + index.ToString(), null)
// { _Item = collection[index]; }
// public override bool CanResetValue(object component)
// { return true; }
// public override Type ComponentType
// { get { return _Item.GetType(); } }
// public override object GetValue(object component)
// { return _Item; }
// public override bool IsReadOnly
// { get { return false; } }
// public override Type PropertyType
// { get { return _Item.GetType(); } }
// public override void ResetValue(object component)
// { ;}
// public override bool ShouldSerializeValue(object component)
// { return true; }
// public override void SetValue(object component, object value)
// { /*_Item = value*/;}
// //public override AttributeCollection Attributes
// //{ get { return new AttributeCollection(null); } }
// public override string DisplayName
// { get { return _Item.ToString(); } }
// public override string Description
// { get { return _Item.ToString(); } }
// public override string Name
// { get { return _Item.ToString(); } }
//} // Class
//#region Converter
//internal class VlnHtmlPartsConverter : ExpandableObjectConverter
//{
// public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destType)
// {
// if (destType == typeof(string) && value is VlnHtmlParts)
// {
// // Return department and department role separated by comma.
// return ((VlnHtmlParts)value).List.Count.ToString() + " Vln Html Parts";
// }
// return base.ConvertTo(context, culture, value, destType);
// }
//}
// }
//#endregion
}
///
/// Hyperrlink
///
public class vlnhtml_a
{
//url
}
public class vlnhtmlContent : VlnHtmlPart
{
string _text;
[XmlText]
public string Text
{
get { return _text; }
set { _text = value; }
}
string _style;// -qt-block-indent:1or2
[XmlAttribute("style")]
public string Style
{
get { return _style; }
set { _style = value; }
}
string _align;// Center Right Justify
[XmlAttribute("align")]
public string Align
{
get { return _align; }
set { _align = value; }
}
}
///
/// Paragraph
///
public class vlnhtml_p : vlnhtmlContent
{
}
///
/// Break
///
public class vlnhtml_br : VlnHtmlPart
{
}
///
/// Image
///
public class vlnhtml_img : VlnHtmlPart
{
string _src;//filename and Path
[XmlAttribute("src")]
public string Src
{
get { return _src; }
set { _src = value; }
}
int _width;
[XmlAttribute("width")]
public int Width
{
get { return _width; }
set { _width = value; }
}
}
///
/// Container
///
public class VlnHtmlContainer : VlnHtmlPart
{
VlnHtmlParts _Children = new VlnHtmlParts();
[XmlElement("ul", typeof(vlnhtml_ul))]
[XmlElement("ol", typeof(vlnhtml_ol))]
[XmlElement("li", typeof(vlnhtml_li))]
[XmlElement("p", typeof(vlnhtml_p))]
[XmlElement("a", typeof(vlnhtml_a))]
[XmlElement("br", typeof(vlnhtml_br))]
[XmlElement("img", typeof(vlnhtml_img))]
[XmlElement("table", typeof(vlnhtml_table))]
internal VlnHtmlParts Children
{
get
{
//if (_Children == null)
// _Children = new VlnHtmlParts();
return _Children;
}
set { _Children = value; }
}
}
///
/// Ordered List
///
public class vlnhtml_ol : VlnHtmlContainer
{
string _style;// -qt-block-indent:1or2
[XmlAttribute("style")]
public string Style
{
get { return _style; }
set { _style = value; }
}
}
///
/// Unordered List
///
public class vlnhtml_ul : VlnHtmlContainer
{
string _style;// -qt-block-indent:1or2
[XmlAttribute("style")]
public string Style
{
get { return _style; }
set { _style = value; }
}
}
///
/// List Item
///
public class vlnhtml_li : vlnhtmlContent
{
}
///
/// Table
///
public class vlnhtml_table : VlnHtmlContainer
{
string _style;// -qt-block-indent:1or2
[XmlAttribute("style")]
public string Style
{
get { return _style; }
set { _style = value; }
}
int _border;//
int _cellspacing;
int _cellpadding;
}
public class vlnhtml_tr : VlnHtmlContainer
{
}
public class vlnhtml_td : VlnHtmlContainer
{
}
public static class HtmlSerializer where T : class
{
public static string StringSerialize(T t)
{
string strOutput = string.Empty;
XmlSerializer xs = new XmlSerializer(typeof(T), "http://www.w3.org/2000/html");
using (MemoryStream ms = new MemoryStream())
{
xs.Serialize(new NonXsiTextWriter(ms, Encoding.UTF8), t);
//xs.Serialize(ms, t);
ms.Position = 0;
StreamReader sr = new StreamReader(ms);
strOutput = sr.ReadToEnd();
ms.Close();
}
return strOutput;
}
public static T StringDeserialize(string s)
{
T t;
XmlSerializer xs = new XmlSerializer(typeof(T), "http://www.w3.org/2000/html");
UTF8Encoding enc = new UTF8Encoding();
Byte[] arrBytData = enc.GetBytes(s);
using (MemoryStream ms = new MemoryStream(arrBytData))
{
t = (T)xs.Deserialize(ms);
}
return t;
}
public static void WriteFile(T t, string fileName)
{
string strOutput = string.Empty;
XmlSerializer xs = new XmlSerializer(typeof(T), "http://www.w3.org/2000/html");
using (FileStream fs = new FileStream(fileName, FileMode.Create))
{
xs.Serialize(new NonXsiTextWriter(fs, Encoding.UTF8), t);
fs.Close();
}
}
public static T ReadFile(string fileName)
{
T t;
XmlSerializer xs = new XmlSerializer(typeof(T), "http://www.w3.org/2000/html");
using (FileStream fs = new FileStream(fileName, FileMode.Open))
{
t = (T)xs.Deserialize(fs);
}
return t;
}
}
public class NonXsiTextWriter : XmlTextWriter
{
public NonXsiTextWriter(TextWriter w) : base(w) { }
public NonXsiTextWriter(Stream w, Encoding encoding)
: base(w, encoding)
{
this.Formatting = Formatting.Indented;
}
public NonXsiTextWriter(string filename, Encoding encoding) : base(filename, encoding) { }
bool _skip = false;
public override void WriteStartAttribute(string prefix, string localName, string ns)
{
if ((prefix == "xmlns" && (localName == "xsd" || localName == "xsi")) || // Omits XSD and XSI declarations.
ns == XmlSchema.InstanceNamespace) // Omits all XSI attributes.
{
_skip = true;
return;
}
if (localName == "xlink_href")
base.WriteStartAttribute(prefix, "xlink:href", ns);
else
base.WriteStartAttribute(prefix, localName, ns);
}
public override void WriteString(string text)
{
if (_skip) return;
base.WriteString(text);
}
public override void WriteEndAttribute()
{
if (_skip)
{ // Reset the flag, so we keep writing.
_skip = false;
return;
}
base.WriteEndAttribute();
}
}
}