public string GetImageName(AST.Address addr) { // calculate MD5 MD5 md5 = MD5.Create(); byte[] bytes = System.Text.Encoding.ASCII.GetBytes(addr.A1FullyQualified()); byte[] hash = md5.ComputeHash(bytes); StringBuilder sb = new StringBuilder(); // prepend the job state ID sb.AppendFormat("{0}", _jobstate.ToString()); // convert byte array to hex string for (int i = 0; i < hash.Length; i++) { sb.Append(hash[i].ToString("X2")); } // stick a ".png" on the end sb.Append(".png"); // url encode it return(System.Web.HttpUtility.UrlEncode(sb.ToString())); }
private FSharpOption <BugClass> DualsFor(AST.Address addr) { // extract address environment var env = new AST.Env(addr.Path, addr.WorkbookName, addr.WorksheetName); // duals regexp var r = new Regex(@".*dual\s*=\s*((?<AddrOrRange>[A-Z]+[0-9]+(:?:[A-Z]+[0-9]+)?)(:?\s*,\s*)?)+", RegexOptions.Compiled); // get note for this address var note = _notes[addr]; Match m = r.Match(note); if (!m.Success) { if (note.Contains("dual")) { Console.Out.WriteLine("Malformed dual annotation for cell " + addr.A1FullyQualified() + " : " + note); } return(FSharpOption <BugClass> .None); } else { // init duals list var duals = new List <AST.Address>(); var cs = m.Groups["AddrOrRange"].Captures; foreach (Capture c in cs) { // get string value string addrOrRange = c.Value; AST.Reference xlref = null; try { // parse xlref = Parcel.simpleReferenceParser(addrOrRange, env); } catch (Exception e) { var msg = "Bad reference: '" + addrOrRange + "'"; Console.Out.WriteLine(msg); throw new Exception(msg); } // figure out the reference type if (xlref.Type == AST.ReferenceType.ReferenceRange) { var rrref = (AST.ReferenceRange)xlref; duals.AddRange(rrref.Range.Addresses()); } else if (xlref.Type == AST.ReferenceType.ReferenceAddress) { var aref = (AST.ReferenceAddress)xlref; duals.Add(aref.Address); } else { throw new Exception("Unsupported address reference type."); } } var bugclass = new BugClass(duals); return(FSharpOption <BugClass> .Some(bugclass)); } }