//--- Class Methods --- public static bool TryParse(string source, out XDataUri uri) { if(string.IsNullOrEmpty(source)) { uri = null; return false; } // check if source starts with "data:" if(!source.StartsWithInvariantIgnoreCase(DATA_SCHEME)) { uri = null; return false; } // check if source contains a comma var comma = source.IndexOf(",", DATA_SCHEME.Length, StringComparison.Ordinal); if(comma < 0) { uri = null; return false; } // parse key-value pairs between scheme and comma string mime = null; string charset = null; var base64 = false; var temp = source.Substring(DATA_SCHEME.Length, comma - DATA_SCHEME.Length); foreach(var header in temp.Split(';')) { var equal = header.IndexOfInvariant("="); string name; string value; if(equal == -1) { name = string.IsNullOrEmpty(mime) ? "mime" : "base64"; value = XUri.Decode(header).Trim(); } else { name = XUri.Decode(header.Substring(0, equal)).Trim(); value = XUri.Decode(header.Substring(equal + 1)).Trim(); } switch(name.ToLowerInvariant()) { case "mime": mime = value; break; case "charset": charset = value; break; case "base64": base64 = value.EqualsInvariantIgnoreCase(BASE64_ENCODING); break; default: // NOTE (steveb): we're ignoring additional meta-data since it's not useful for our use case break; } } // compute mime-type var mimeType = MimeType.TEXT; if(!string.IsNullOrEmpty(mime)) { mimeType = !string.IsNullOrEmpty(charset) ? new MimeType(string.Format("{0};charset={1}", mime, charset)) : new MimeType(mime); } // create data uri wrapper uri = new XDataUri { MimeType = mimeType, Base64 = base64 }; return true; }
//--- Class Methods --- public static bool TryParse(string source, out XDataUri uri) { if (string.IsNullOrEmpty(source)) { uri = null; return(false); } // check if source starts with "data:" if (!source.StartsWithInvariantIgnoreCase(DATA_SCHEME)) { uri = null; return(false); } // check if source contains a comma var comma = source.IndexOf(",", DATA_SCHEME.Length, StringComparison.Ordinal); if (comma < 0) { uri = null; return(false); } // parse key-value pairs between scheme and comma string mime = null; string charset = null; var base64 = false; var temp = source.Substring(DATA_SCHEME.Length, comma - DATA_SCHEME.Length); foreach (var header in temp.Split(';')) { var equal = header.IndexOfInvariant("="); string name; string value; if (equal == -1) { name = string.IsNullOrEmpty(mime) ? "mime" : "base64"; value = XUri.Decode(header).Trim(); } else { name = XUri.Decode(header.Substring(0, equal)).Trim(); value = XUri.Decode(header.Substring(equal + 1)).Trim(); } switch (name.ToLowerInvariant()) { case "mime": mime = value; break; case "charset": charset = value; break; case "base64": base64 = value.EqualsInvariantIgnoreCase(BASE64_ENCODING); break; default: // NOTE (steveb): we're ignoring additional meta-data since it's not useful for our use case break; } } // compute mime-type var mimeType = MimeType.TEXT; if (!string.IsNullOrEmpty(mime)) { mimeType = !string.IsNullOrEmpty(charset) ? new MimeType(string.Format("{0};charset={1}", mime, charset)) : new MimeType(mime); } // create data uri wrapper uri = new XDataUri { MimeType = mimeType, Base64 = base64 }; return(true); }