use of com.ichi2.anki.CardBrowser.Column.DECK in project AnkiChinaAndroid by ankichinateam.
the class SchedV2 method deckDueList.
// Overridden
@Nullable
public List<DeckDueTreeNode> deckDueList(@Nullable CollectionTask collectionTask, long did) {
_checkDay();
mCol.getDecks().checkIntegrity();
// ArrayList<Deck> decks = mCol.getDecks().allSorted();
ArrayList<Deck> decks = deckLimitWithParent(did, mCol);
Timber.i("show decks" + did + " size:" + decks.size());
HashMap<String, Integer[]> lims = new HashMap<>();
ArrayList<DeckDueTreeNode> data = new ArrayList<>();
HashMap<Long, HashMap> childMap = mCol.getDecks().childMap();
for (Deck deck : decks) {
if (collectionTask != null && collectionTask.isCancelled()) {
return null;
}
String deckName = deck.getString("name");
String p = Decks.parent(deckName);
// new
int nlim = _deckNewLimitSingle(deck);
Integer plim = null;
if (!TextUtils.isEmpty(p)) {
Integer[] parentLims = lims.get(Decks.normalizeName(p));
// 'temporary for diagnosis of bug #6383'
Assert.that(parentLims != null, "Deck %s is supposed to have parent %s. It has not be found.", deckName, p);
nlim = Math.min(nlim, parentLims[0]);
// reviews
plim = parentLims[1];
}
int _new = _newForDeck(deck.getLong("id"), nlim);
// learning
int lrn = _lrnForDeck(deck.getLong("id"));
// reviews
int rlim = _deckRevLimitSingle(deck, plim);
int rev = _revForDeck(deck.getLong("id"), rlim, childMap);
double[] datas = did == ALL_DECKS_ID ? _getCardDataCount(deck.getLong("id")) : new double[] { 0, 0, 0 };
// save to list
// Timber.i("add deck in tree:%s", deckName);
data.add(new DeckDueTreeNode(mCol, deck.getString("name"), deck.getLong("id"), rev, lrn, _new, datas));
// add deck as a parent
lims.put(Decks.normalizeName(deck.getString("name")), new Integer[] { nlim, rlim });
}
return data;
}
use of com.ichi2.anki.CardBrowser.Column.DECK in project AnkiChinaAndroid by ankichinateam.
the class SchedV2 method quickDeckDueTree.
/**
* Similar to deck due tree, but ignore the number of cards.
*
* It may takes a lot of time to compute the number of card, it
* requires multiple database access by deck. Ignoring this number
* lead to the creation of a tree more quickly.
*/
@Override
@NonNull
public List<DeckTreeNode> quickDeckDueTree() {
// Similar to deckDueTree, ignoring the numbers
// Similar to deckDueList
ArrayList<DeckTreeNode> data = new ArrayList<>();
for (JSONObject deck : mCol.getDecks().allSorted()) {
DeckTreeNode g = new DeckTreeNode(mCol, deck.getString("name"), deck.getLong("id"));
data.add(g);
}
return _groupChildren(data, false);
}
use of com.ichi2.anki.CardBrowser.Column.DECK in project AnkiChinaAndroid by ankichinateam.
the class Collection method _renderQA.
public HashMap<String, String> _renderQA(long cid, Model model, long did, int ord, String tags, String[] flist, int flags, boolean browser, String qfmt, String afmt) {
// data is [cid, nid, mid, did, ord, tags, flds, cardFlags]
// unpack fields and create dict
Map<String, String> fields = new HashMap<>();
Map<String, Pair<Integer, JSONObject>> fmap = Models.fieldMap(model);
for (String name : fmap.keySet()) {
fields.put(name, flist[fmap.get(name).first]);
}
int cardNum = ord + 1;
fields.put("Tags", tags.trim());
fields.put("Type", model.getString("name"));
fields.put("Deck", mDecks.name(did));
String baseName = Decks.basename(fields.get("Deck"));
fields.put("Subdeck", baseName);
fields.put("CardFlag", _flagNameFromCardFlags(flags));
JSONObject template;
if (model.getInt("type") == Consts.MODEL_STD) {
template = model.getJSONArray("tmpls").getJSONObject(ord);
} else {
template = model.getJSONArray("tmpls").getJSONObject(0);
}
fields.put("Card", template.getString("name"));
fields.put(String.format(Locale.US, "c%d", cardNum), "1");
// render q & a
HashMap<String, String> d = new HashMap<>();
d.put("id", Long.toString(cid));
qfmt = TextUtils.isEmpty(qfmt) ? template.getString("qfmt") : qfmt;
afmt = TextUtils.isEmpty(afmt) ? template.getString("afmt") : afmt;
for (Pair<String, String> p : new Pair[] { new Pair<>("q", qfmt), new Pair<>("a", afmt) }) {
String type = p.first;
String format = p.second;
if ("q".equals(type)) {
format = fClozePatternQ.matcher(format).replaceAll(String.format(Locale.US, "{{$1cq-%d:", cardNum));
format = fClozeTagStart.matcher(format).replaceAll(String.format(Locale.US, "<%%cq:%d:", cardNum));
} else {
format = fClozePatternA.matcher(format).replaceAll(String.format(Locale.US, "{{$1ca-%d:", cardNum));
format = fClozeTagStart.matcher(format).replaceAll(String.format(Locale.US, "<%%ca:%d:", cardNum));
// the following line differs from libanki // TODO: why?
// fields.put("FrontSide", mMedia.stripAudio(d.get("q")));
fields.put("FrontSide", d.get("q"));
}
String html = new Template(format, fields).render();
html = ChessFilter.fenToChessboard(html, getContext());
if (!browser) {
// browser don't show image. So compiling LaTeX actually remove information.
html = LaTeX.mungeQA(html, this, model);
}
d.put(type, html);
// empty cloze?
if ("q".equals(type) && model.getInt("type") == Consts.MODEL_CLOZE) {
if (getModels()._availClozeOrds(model, flist, false).size() == 0) {
String link = String.format("<a href=%s#cloze>%s</a>", Consts.HELP_SITE, "help");
d.put("q", mContext.getString(R.string.empty_cloze_warning, link));
}
}
}
return d;
}
use of com.ichi2.anki.CardBrowser.Column.DECK in project AnkiChinaAndroid by ankichinateam.
the class Decks method load.
public void load(String decks, String dconf) {
mDecks = new HashMap<>();
mDconf = new HashMap<>();
JSONObject decksarray = new JSONObject(decks);
JSONArray ids = decksarray.names();
for (int i = 0; i < ids.length(); i++) {
String id = ids.getString(i);
try {
long longId = Long.parseLong(id);
Deck o = new Deck(decksarray.getJSONObject(id));
mDecks.put(longId, o);
} catch (NumberFormatException e) {
Timber.w("id is not valid");
}
}
mNameMap = NameMap.constructor(mDecks.values());
JSONObject confarray = new JSONObject(dconf);
ids = confarray.names();
for (int i = 0; ids != null && i < ids.length(); i++) {
String id = ids.getString(i);
try {
mDconf.put(Long.parseLong(id), new DeckConfig(confarray.getJSONObject(id)));
} catch (NumberFormatException e) {
Timber.w("id is not valid");
}
}
mChanged = false;
}
use of com.ichi2.anki.CardBrowser.Column.DECK in project AnkiChinaAndroid by ankichinateam.
the class Decks method update.
/**
* Add or update an existing deck. Used for syncing and merging.
*/
public void update(Deck g) {
long id = g.getLong("id");
JSONObject oldDeck = get(id, false);
if (oldDeck != null) {
// In case where another update got the name
// `oldName`, it would be a mistake to remove it from nameMap
mNameMap.remove(oldDeck.getString("name"), oldDeck);
}
mNameMap.add(g);
mDecks.put(g.getLong("id"), g);
maybeAddToActive();
// mark registry changed, but don't bump mod time
save();
}
Aggregations