public virtual void StarredExportPleco() { string stars = sharedPrefs.GetString("stars", ""); if (stars.Length < 2) { Toast.MakeText(this, "Starred list is empty. Nothing to export.", ToastLength.Long).Show(); return; } try { File dir = new File(global::Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, "/ChineseReader"); dir.Mkdirs(); System.IO.FileStream os = new System.IO.FileStream(dir.AbsolutePath + "/chinesereader_starred.txt", System.IO.FileMode.Create, System.IO.FileAccess.Write); BufferedOutputStream bos = new BufferedOutputStream(os); StringBuilder english = new StringBuilder(); int oldIndex = 0, nIndex; while ((nIndex = stars.IndexOf("\n", oldIndex)) > -1) { english.Length = 0; int entry = Dict.BinarySearch(stars.SubstringSpecial(oldIndex, nIndex), false); oldIndex = nIndex + 1; if (entry == -1) { continue; } english.Append(Dict.GetCh(entry)).Append("\t").Append(Regex.Replace(Dict.GetPinyin(entry), @"(\\d)", "$1 ")).Append("\t"); string[] parts = Regex.Split(Regex.Replace(Dict.GetEnglish(entry), @"/", "; "), @"\\$"); int j = 0; foreach (string str in parts) { if (j++ % 2 == 1) { english.Append(" [ ").Append(Regex.Replace(str, @"(\\d)", "$1 ")).Append("] "); } else { english.Append(str); } } english.Append("\n"); bos.Write(Encoding.UTF8.GetBytes(english.ToString())); } os.Flush(); bos.Flush(); bos.Close(); os.Close(); Toast.MakeText(this, "Successfully exported to " + dir.AbsolutePath + "/chinesereader_starred.txt", ToastLength.Long).Show(); } catch (Exception e) { Toast.MakeText(this, "Could not export: " + e.Message, ToastLength.Long).Show(); } }
public virtual void show(View anchor, List <object> line, int wordNum, int showX, bool redraw) { try { this.showX = showX; if (redraw) { this.dismiss(); } if (line != null) { this.line = line; this.wordIndex = wordNum; this.entry = (int)line[wordNum]; splitButton.Visibility = ViewStates.Visible; bookmarkButton.Visibility = ViewStates.Visible; } else { this.entry = wordNum; splitButton.Visibility = ViewStates.Gone; bookmarkButton.Visibility = ViewStates.Gone; } string sTrad = Dict.GetCh(entry, "traditional"); string sSimp = Dict.GetCh(entry, "simplified"); SpannableStringBuilder text = new SpannableStringBuilder(); if (sSimp.Length > 1) { List <object> subWords = BreakWord(sSimp); foreach (object word in subWords) { if (word is int) { //was found string ch = Dict.GetCh((int)word, "simplified"); text.Append(ch).Append(new Java.Lang.String(" ")); WordSpan clickable = new WordSpan(this); clickable.link = ch; text.SetSpan(clickable, text.Length() - ch.Length - 1, text.Length() - 1, SpanTypes.User); } else { text.Append((string)word).Append(new Java.Lang.String(" ")); } } } else { text.Append(sSimp).Append(new Java.Lang.String(" ")); text.SetSpan(new AbsoluteSizeSpan(24, true), text.Length() - sSimp.Length - 1, text.Length() - 1, SpanTypes.User); splitButton.Visibility = ViewStates.Gone; } if (!sTrad.Equals(sSimp)) { text.Append(sTrad); } mChars.SetText(text, TextView.BufferType.Spannable); text.Clear(); string pinyin = Dict.PinyinToTones(Dict.GetPinyin(entry)); text.Append("[ ").Append(new Java.Lang.String(pinyin)).Append(new Java.Lang.String(" ] ")); appendInlineButtons(text, pinyin); text.Append("\n"); string[] parts = Regex.Split(Regex.Replace(Dict.GetEnglish(entry), @"/", "\n• "), @"\\$"); int i = 0; foreach (string s in parts) { if (i++ % 2 == 1) { pinyin = Dict.PinyinToTones(s); text.Append("\n\n[ ").Append(new Java.Lang.String(pinyin)).Append(new Java.Lang.String(" ] ")); appendInlineButtons(text, pinyin); text.Append("\n"); } else { text.Append("• "); int beforeAppended = text.Length(); int bracketIndex, bracketEnd = 0; while ((bracketIndex = s.IndexOf("[", bracketEnd, StringComparison.Ordinal)) > -1) { text.Append(s, bracketEnd, bracketIndex); bracketEnd = s.IndexOf("]", bracketIndex); text.Append(Dict.PinyinToTones(s.SubstringSpecial(bracketIndex, bracketEnd))); } text.Append(s, bracketEnd, s.Length); int afterAppended = text.Length(); for (int m = beforeAppended; m < afterAppended; m++) { if (text.CharAt(m) >= '\u25CB' && text.CharAt(m) <= '\u9FA5') { int n = m + 1; while (n < text.Length() && text.CharAt(n) >= '\u25CB' && text.CharAt(n) <= '\u9FA5') { n++; } WordSpan clickable = new WordSpan(this); clickable.link = text.SubSequence(m, n - m).ToString(); text.SetSpan(clickable, m, n, SpanTypes.User); } } } } mContent.SetText(text, TextView.BufferType.Spannable); LinearLayout bookmarkTitleLayout = (LinearLayout)mRootView.FindViewById(Resource.Id.bookmark); if (mContext.annoMode != AnnotationActivity.ANNOTATE_FILE) { bookmarkButton.Visibility = ViewStates.Gone; bookmarkTitleLayout.Visibility = ViewStates.Gone; } else { int lineNum = mContext.lines.IndexOf(line); long bookmarkPos = mContext.GetPosition(mContext.lines, lineNum + 1, wordIndex, true); int bookmarksPos = Bookmark.SearchClosest(bookmarkPos, mContext.mBookmarks); bool isBookmarked = mContext.mBookmarks.Count > bookmarksPos && mContext.mBookmarks[bookmarksPos].mPosition == bookmarkPos; ToggleBookmark(bookmarkButton, isBookmarked); if (isBookmarked) { bookmarkTitleLayout.Visibility = ViewStates.Visible; ((TextView)mRootView.FindViewById(Resource.Id.bookmarkTitle)).Text = mContext.mBookmarks[bookmarksPos].mTitle; } else { bookmarkTitleLayout.Visibility = ViewStates.Gone; } } ToggleStar(null, AnnotationActivity.sharedPrefs.GetString("stars", "").StartsWith(Dict.GetCh(entry, "simplified") + "\n") || AnnotationActivity.sharedPrefs.GetString("stars", "").Contains("\n" + Dict.GetCh(entry, "simplified") + "\n")); this.parent = anchor; float xPos = 0, yPos = 0, arrowPos; int[] location = new int[2]; anchor.GetLocationOnScreen(location); Rect anchorRect = new Rect(location[0], location[1], location[0] + anchor.Width, location[1] + anchor.Height); if (redraw) { mWindow.ShowAtLocation(anchor, GravityFlags.NoGravity, 0, 0); } mBubble.Measure(ViewGroup.LayoutParams.WrapContent, ViewGroup.LayoutParams.WrapContent); float rootHeight = mBubble.MeasuredHeight; float rootWidth = mBubble.MeasuredWidth; xPos = showX - (rootWidth / 2); if ((xPos + rootWidth) > screenX) { xPos = screenX - rootWidth; } else if (xPos < 0) { xPos = 0; } arrowPos = showX - xPos; float dyTop = anchorRect.Top - 60 * scale; float dyBottom = screenY - anchorRect.Bottom - 20 * scale; bool onTop = dyBottom <rootHeight && dyTop> dyBottom; if (onTop) { if (rootHeight + 20 * scale > dyTop) { yPos = 60 * scale; rootHeight = anchorRect.Top - yPos - 20 * scale; } else { yPos = anchorRect.Top - rootHeight - 20 * scale; } } else { yPos = anchorRect.Bottom; if (rootHeight > dyBottom) { rootHeight = dyBottom; } } showArrow((onTop ? Resource.Id.arrow_down : Resource.Id.arrow_up), arrowPos, rootWidth); mWindow.Update((int)Math.Round(xPos), (int)Math.Round(yPos), (int)Math.Round(rootWidth), (int)Math.Round(rootHeight + 21 * scale)); mScroll.FullScroll(FocusSearchDirection.Up); } catch (Exception e) { Toast.MakeText(mContext, "Error: " + e.Message, ToastLength.Long).Show(); } }
public void StarredExport(int exportId) { string stars = sharedPrefs.GetString("stars", ""); if (stars == null || stars.Length < 2) { Toast.MakeText(this, "Starred list is empty. Nothing to export.", ToastLength.Long).Show(); return; } System.Random random = new System.Random(); SQLiteDatabase db = OpenOrCreateDatabase("anki.db", FileCreationMode.Private, null); string[] commands = Regex.Split(GetString(Resource.String.anki_scheme), ";;"); foreach (string command in commands) { db.ExecSQL(command); } int oldIndex = 0; int nIndex; while ((nIndex = stars.IndexOf("\n", oldIndex)) > -1) { int entry = Dict.BinarySearch(stars.SubstringSpecial(oldIndex, nIndex), false); oldIndex = nIndex + 1; if (entry == -1) { continue; } string id = Convert.ToString(Math.Abs(random.Next())), uuid = UUID.RandomUUID().ToString().SubstringSpecial(0, 10); StringBuilder english = new StringBuilder(); if (exportId == Resource.Id.menu_starred_export_pinyin) { english.Append(Dict.PinyinToTones(Dict.GetPinyin(entry))).Append("<br/>"); } english.Append(Dict.GetCh(entry)).Append("\u001F"); if (exportId == Resource.Id.menu_starred_export) { english.Append("[ ").Append(Dict.PinyinToTones(Dict.GetPinyin(entry))).Append(" ]<br/>"); } string[] parts = Regex.Split(Regex.Replace(Dict.GetEnglish(entry), @"/", "<br/>• "), @"\\$"); int j = 0; foreach (string str in parts) { if (j++ % 2 == 1) { english.Append("<br/><br/>[ ").Append(Dict.PinyinToTones(str)).Append(" ]<br/>"); } else { english.Append("• "); int bracketIndex, bracketEnd = 0; while ((bracketIndex = str.IndexOf("[", bracketEnd)) > -1) { english.Append(str, bracketEnd, bracketIndex); bracketEnd = str.IndexOf("]", bracketIndex); english.Append(Dict.PinyinToTones(str.SubstringSpecial(bracketIndex, bracketEnd))); } english.Append(str, bracketEnd, str.Length); } } db.ExecSQL("insert into notes values(?, ?, 1399962367564, 1400901624, -1, '', ?, 0, 147133787, 0, '')", new Java.Lang.Object[] { id, uuid, english.ToString() }); db.ExecSQL("insert into cards values(?, ?, 1400901287521, 0, 1400901624, -1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, '')", new Java.Lang.Object[] { Convert.ToString(random.Next()), id }); } db.Close(); try { File dir = new File(global::Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, "/AnkiDroid"); if (!dir.Exists()) { dir = new File(global::Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, "/ChineseReader"); } dir.Mkdirs(); System.IO.Stream fos = new System.IO.FileStream(dir.AbsolutePath + "/chinesereader_starred.apkg", System.IO.FileMode.Create, System.IO.FileAccess.Write); System.IO.Stream fiz = new System.IO.FileStream(GetDatabasePath("anki.db").Path, System.IO.FileMode.Open, System.IO.FileAccess.Read); ZipOutputStream zos = new ZipOutputStream(fos); zos.PutNextEntry(new ZipEntry("collection.anki2")); byte[] buffer = new byte[1024]; int readLen = 0; while ((readLen = fiz.Read(buffer, 0, buffer.Length)) > 0) { zos.Write(buffer, 0, readLen); } zos.CloseEntry(); zos.PutNextEntry(new ZipEntry("media")); buffer[0] = 0x7b; buffer[1] = 0x7d; zos.Write(buffer, 0, 2); zos.CloseEntry(); zos.Flush(); zos.Close(); fiz.Close(); fos.Flush(); fos.Close(); Toast.MakeText(this, "Successfully exported to " + dir.AbsolutePath + "/chinesereader_starred.apkg", ToastLength.Long).Show(); } catch (Exception e) { Toast.MakeText(this, "Could not export: " + e.Message, ToastLength.Long).Show(); } }