示例#1
0
        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;
        }
示例#2
0
        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);
        }