|  |  |  |  | using System; | 
					
						
							|  |  |  |  | using System.Text; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | namespace FairyGUI.Utils | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  |     /// <summary> | 
					
						
							|  |  |  |  |     ///  | 
					
						
							|  |  |  |  |     /// </summary> | 
					
						
							|  |  |  |  |     public class XMLUtils | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         public static string DecodeString(string aSource) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             int len = aSource.Length; | 
					
						
							|  |  |  |  |             StringBuilder sb = new StringBuilder(); | 
					
						
							|  |  |  |  |             int pos1 = 0, pos2 = 0; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             while (true) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 pos2 = aSource.IndexOf('&', pos1); | 
					
						
							|  |  |  |  |                 if (pos2 == -1) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     sb.Append(aSource.Substring(pos1)); | 
					
						
							|  |  |  |  |                     break; | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |                 sb.Append(aSource.Substring(pos1, pos2 - pos1)); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 pos1 = pos2 + 1; | 
					
						
							|  |  |  |  |                 pos2 = pos1; | 
					
						
							|  |  |  |  |                 int end = Math.Min(len, pos2 + 10); | 
					
						
							|  |  |  |  |                 for (; pos2 < end; pos2++) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     if (aSource[pos2] == ';') | 
					
						
							|  |  |  |  |                         break; | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |                 if (pos2 < end && pos2 > pos1) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     string entity = aSource.Substring(pos1, pos2 - pos1); | 
					
						
							|  |  |  |  |                     int u = 0; | 
					
						
							|  |  |  |  |                     if (entity[0] == '#') | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         if (entity.Length > 1) | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             if (entity[1] == 'x') | 
					
						
							|  |  |  |  |                                 u = Convert.ToInt16(entity.Substring(2), 16); | 
					
						
							|  |  |  |  |                             else | 
					
						
							|  |  |  |  |                                 u = Convert.ToInt16(entity.Substring(1)); | 
					
						
							|  |  |  |  |                             sb.Append((char)u); | 
					
						
							|  |  |  |  |                             pos1 = pos2 + 1; | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                         else | 
					
						
							|  |  |  |  |                             sb.Append('&'); | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                     else | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         switch (entity) | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             case "amp": | 
					
						
							|  |  |  |  |                                 u = 38; | 
					
						
							|  |  |  |  |                                 break; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                             case "apos": | 
					
						
							|  |  |  |  |                                 u = 39; | 
					
						
							|  |  |  |  |                                 break; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                             case "gt": | 
					
						
							|  |  |  |  |                                 u = 62; | 
					
						
							|  |  |  |  |                                 break; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                             case "lt": | 
					
						
							|  |  |  |  |                                 u = 60; | 
					
						
							|  |  |  |  |                                 break; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                             case "nbsp": | 
					
						
							|  |  |  |  |                                 u = 32; | 
					
						
							|  |  |  |  |                                 break; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                             case "quot": | 
					
						
							|  |  |  |  |                                 u = 34; | 
					
						
							|  |  |  |  |                                 break; | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                         if (u > 0) | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             sb.Append((char)u); | 
					
						
							|  |  |  |  |                             pos1 = pos2 + 1; | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                         else | 
					
						
							|  |  |  |  |                             sb.Append('&'); | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |                 else | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     sb.Append('&'); | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             return sb.ToString(); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         private static string[] ESCAPES = new string[] { | 
					
						
							|  |  |  |  |             "&", "&", | 
					
						
							|  |  |  |  |             "<", "<", | 
					
						
							|  |  |  |  |             ">", ">", | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             "'", "'", | 
					
						
							|  |  |  |  |             "\"", """, | 
					
						
							|  |  |  |  |             "\t", "	", | 
					
						
							|  |  |  |  |             "\n", "
", | 
					
						
							|  |  |  |  |             "\r", "
" | 
					
						
							|  |  |  |  |         }; | 
					
						
							|  |  |  |  |         public static void EncodeString(StringBuilder sb, int start, bool isAttribute = false) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             int count; | 
					
						
							|  |  |  |  |             int len = isAttribute ? ESCAPES.Length : 6; | 
					
						
							|  |  |  |  |             for (int i = 0; i < len; i += 2) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 count = sb.Length - start; | 
					
						
							|  |  |  |  |                 sb.Replace(ESCAPES[i], ESCAPES[i + 1], start, count); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         public static string EncodeString(string str, bool isAttribute = false) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             if (string.IsNullOrEmpty(str)) | 
					
						
							|  |  |  |  |                 return ""; | 
					
						
							|  |  |  |  |             else | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 StringBuilder sb = new StringBuilder(str); | 
					
						
							|  |  |  |  |                 EncodeString(sb, 0); | 
					
						
							|  |  |  |  |                 return sb.ToString(); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | } |