/** Generates a .tsv file */ public void ExportTextFile(List <CardInfo> cardInfoList, Settings settings, InfoProgress progressInfo) { String tsvFilename = settings.OutputDirectoryPath + Path.DirectorySeparatorChar + settings.DeckName + ".tsv"; Console.WriteLine(tsvFilename); // value that will be imported into Anki/SRS-Programs-Field => [sound:???.ogg] and <img src="???.jpg"/> var snapshotFields = new List <String>(cardInfoList.Count); var audioFields = new List <String>(cardInfoList.Count); foreach (var cardInfo in cardInfoList) { if (cardInfo.HasImage()) { var outputSnapshotFilename = GetSnapshotFileName(settings, cardInfo); snapshotFields.Add("<img src=\"" + outputSnapshotFilename + "\"/>"); // TODO: make this flexible } else { snapshotFields.Add(""); } if (cardInfo.HasAudio()) { var outputAudioFilename = GetAudioFileName(settings, cardInfo); audioFields.Add("[sound:" + outputAudioFilename + "]"); // TODO: make this flexible } else { audioFields.Add(""); } } using (var outputStream = new StreamWriter(tsvFilename)) { for (int i = 0; i < cardInfoList.Count; i++) { CardInfo cardInfo = cardInfoList[i]; // XXX: performance analasys then --- generate a episode-filtered list for context card search (because it has O(n^2) steps) var contextCardsTuple = UtilsSubtitle.GetContextCards(cardInfo.episodeInfo.Index, cardInfo, m_cardInfos); var previousCards = contextCardsTuple.Item1; var nextCards = contextCardsTuple.Item2; var previousCardsNativeLanguage = UtilsSubtitle.CardListToMultilineString(previousCards, UtilsCommon.LanguageType.NATIVE); var previousCardsTargetLanguage = UtilsSubtitle.CardListToMultilineString(previousCards, UtilsCommon.LanguageType.TARGET); var nextCardsNativeLanguage = UtilsSubtitle.CardListToMultilineString(nextCards, UtilsCommon.LanguageType.NATIVE); var nextCardsTargetLanguage = UtilsSubtitle.CardListToMultilineString(nextCards, UtilsCommon.LanguageType.TARGET); String keyField = cardInfo.GetKey(); String audioField = audioFields[i]; String imageField = snapshotFields[i]; String tags = String.Format("SubtitleMemorize {0} ep{1:000} {2}", settings.DeckNameModified, cardInfo.episodeInfo.Number, InfoLanguages.languages[settings.TargetLanguageIndex].tag); outputStream.WriteLine(UtilsCommon.HTMLify(keyField) + "\t" + UtilsCommon.HTMLify(imageField) + "\t" + UtilsCommon.HTMLify(audioField) + "\t" + UtilsCommon.HTMLify(cardInfo.ToSingleLine(UtilsCommon.LanguageType.TARGET)) + "\t" + UtilsCommon.HTMLify(cardInfo.ToSingleLine(UtilsCommon.LanguageType.NATIVE)) + "\t" + UtilsCommon.HTMLify(previousCardsTargetLanguage) + "\t" + UtilsCommon.HTMLify(previousCardsNativeLanguage) + "\t" + UtilsCommon.HTMLify(nextCardsTargetLanguage) + "\t" + UtilsCommon.HTMLify(nextCardsNativeLanguage) + "\t" + UtilsCommon.HTMLify(tags) ); } } }