private void UpdateRequired(JsonObject m) { if (m.GetNamedNumber("type") == (int)ModelType.CLOZE) { return; } JsonArray req = new JsonArray(); List <string> flds = new List <string>(); JsonArray fields = m.GetNamedArray("flds"); for (uint i = 0; i < fields.Count; i++) { flds.Add(fields.GetObjectAt(i).GetNamedString("name")); } JsonArray templates = m.GetNamedArray("tmpls"); for (uint i = 0; i < templates.Count; i++) { JsonObject t = templates.GetObjectAt(i); ReqTemplateStruct ret = RequestForTemplate(m, flds, t); JsonArray r = new JsonArray(); r.Add(JsonValue.CreateNumberValue(t.GetNamedNumber("ord"))); r.Add(JsonValue.CreateStringValue(ret.Type)); r.Add(ret.Request[0]); req.Add(r); } m["req"] = req; }
private ReqTemplateStruct RequestForTemplate(JsonObject m, List <string> flds, JsonObject t) { List <string> a = new List <string>(); List <string> b = new List <string>(); ReqTemplateStruct returnResult = new ReqTemplateStruct(); foreach (string f in flds) { a.Add("ankiflag"); b.Add(""); } object[] data = new object[] { 1L, 1L, (long)m.GetNamedNumber("id"), 1L, (int)t.GetNamedNumber("ord"), "", Utils.JoinFields(a.ToArray()) }; string full = collection.RenderQA(data)["q"]; data = new object[] { 1L, 1L, (long)m.GetNamedNumber("id"), 1L, (int)t.GetNamedNumber("ord"), "", Utils.JoinFields(b.ToArray()) }; string empty = collection.RenderQA(data)["q"]; // if full and empty are the same, the template is invalid and there is no way to satisfy it if (full.Equals(empty)) { returnResult.Type = "none"; //java and python source return 2 empty jsonarray here. Why? returnResult.Request = new JsonArray[] { new JsonArray(), new JsonArray() }; return(returnResult); } returnResult.Type = "all"; returnResult.Request = new JsonArray[] { new JsonArray() }; List <string> tmp = new List <string>(); for (int i = 0; i < flds.Count; i++) { tmp.Clear(); tmp.AddRange(a); tmp[i] = ""; data[6] = Utils.JoinFields(tmp.ToArray()); // if no field content appeared, field is required if (!collection.RenderQA(data)["q"].Contains("ankiflag")) { returnResult.Request[0].Add(JsonValue.CreateNumberValue(i)); } } if (returnResult.Request[0].Count > 0) { return(returnResult); } // if there are no required fields, switch to any mode returnResult.Type = "any"; returnResult.Request = new JsonArray[] { new JsonArray() }; for (int i = 0; i < flds.Count; i++) { tmp.Clear(); tmp.AddRange(b); tmp[i] = "1"; data[6] = Utils.JoinFields(tmp.ToArray()); // if not the same as empty, this field can make the card non-blank if (!collection.RenderQA(data)["q"].Equals(empty)) { returnResult.Request[0].Add(JsonValue.CreateNumberValue(i)); } } return(returnResult); }