public void HandleTag(bool opening, string tag, Android.Text.IEditable output, IXMLReader xmlReader) { if (opening) { // opening tag // if (HtmlTextView.DEBUG) { // Log.d(HtmlTextView.TAG, "opening, output: " + output.ToString()); // } if (tag.ToLower() == "ul") { lists.Push(tag); } else if (tag.EqualsIgnoreCase("ol")) { lists.Push(tag); olNextIndex.Push(1); } else if (tag.EqualsIgnoreCase("li")) { if (output.Length() > 0 && output.CharAt(output.Length() - 1) != '\n') { output.Append("\n"); } var parentList = lists.Peek(); if (parentList.EqualsIgnoreCase("ol")) { Start(output, new Ol()); output.Append(olNextIndex.Peek().ToString()).Append('.').Append(' '); olNextIndex.Push(olNextIndex.Pop() + 1); } else if (parentList.EqualsIgnoreCase("ul")) { Start(output, new Ul()); } } else if (tag.EqualsIgnoreCase("code")) { Start(output, new Code()); } else if (tag.EqualsIgnoreCase("center")) { Start(output, new Center()); } else if (tag.EqualsIgnoreCase("s") || tag.EqualsIgnoreCase("strike")) { Start(output, new Strike()); } } else { // closing tag // if (HtmlTextView.DEBUG) { // Log.d(HtmlTextView.TAG, "closing, output: " + output.ToString()); // } if (tag.EqualsIgnoreCase("ul")) { lists.Pop(); } else if (tag.EqualsIgnoreCase("ol")) { lists.Pop(); olNextIndex.Pop(); } else if (tag.EqualsIgnoreCase("li")) { if (lists.Peek().EqualsIgnoreCase("ul")) { if (output.Length() > 0 && output.CharAt(output.Length() - 1) != '\n') { output.Append("\n"); } // Nested BulletSpans increases distance between bullet and Text, so we must prevent it. int bulletMargin = indent; if (lists.Count > 1) { bulletMargin = indent - bullet.GetLeadingMargin(true); if (lists.Count > 2) { // This get's more complicated when we add a LeadingMarginSpan into the same line: // we have also counter it's effect to BulletSpan bulletMargin -= (lists.Count - 2) * listItemIndent; } } BulletSpan newBullet = new BulletSpan(bulletMargin); End( output, typeof(Ul), false, new LeadingMarginSpanStandard(listItemIndent * (lists.Count - 1)), newBullet); } else if (lists.Peek().EqualsIgnoreCase("ol")) { if (output.Length() > 0 && output.CharAt(output.Length() - 1) != '\n') { output.Append("\n"); } int numberMargin = listItemIndent * (lists.Count - 1); if (lists.Count > 2) { // Same as in ordered lists: counter the effect of nested Spans numberMargin -= (lists.Count - 2) * listItemIndent; } End(output, typeof(Ol), false, new LeadingMarginSpanStandard(numberMargin)); } } else if (tag.EqualsIgnoreCase("code")) { End(output, typeof(Code), false, new TypefaceSpan("monospace")); } else if (tag.EqualsIgnoreCase("center")) { End(output, typeof(Center), true, new AlignmentSpanStandard(Layout.Alignment.AlignCenter)); } else if (tag.EqualsIgnoreCase("s") || tag.EqualsIgnoreCase("strike")) { End(output, typeof(Strike), false, new StrikethroughSpan()); } } }
private static void HandleFormatRun(ISpannable spannableString, IAttributedTextRun run) { var attributes = run.Attributes; var start = run.Start; var end = start + run.Length; var fontName = attributes.GetFontName(); if (fontName != null) { var typefaceSpan = new TypefaceSpan(fontName); spannableString.SetSpan(typefaceSpan, start, end, SpanTypes.ExclusiveExclusive); } if (attributes.GetBold() && attributes.GetItalic()) { var span = new StyleSpan(TypefaceStyle.BoldItalic); spannableString.SetSpan(span, start, end, SpanTypes.ExclusiveExclusive); } else if (attributes.GetBold()) { var span = new StyleSpan(TypefaceStyle.Bold); spannableString.SetSpan(span, start, end, SpanTypes.ExclusiveExclusive); } else if (attributes.GetItalic()) { var span = new StyleSpan(TypefaceStyle.Italic); spannableString.SetSpan(span, start, end, SpanTypes.ExclusiveExclusive); } if (attributes.GetUnderline()) { var span = new UnderlineSpan(); spannableString.SetSpan(span, start, end, SpanTypes.ExclusiveExclusive); } var foregroundColor = attributes.GetForegroundColor()?.ParseAsInts()?.ToColor(); if (foregroundColor != null) { var span = new ForegroundColorSpan((global::Android.Graphics.Color)foregroundColor); spannableString.SetSpan(span, start, end, SpanTypes.ExclusiveExclusive); } var backgroundColor = attributes.GetBackgroundColor()?.ParseAsInts()?.ToColor(); if (backgroundColor != null) { var span = new BackgroundColorSpan((global::Android.Graphics.Color)backgroundColor); spannableString.SetSpan(span, start, end, SpanTypes.ExclusiveExclusive); } if (attributes.GetSubscript()) { var span = new SubscriptSpan(); spannableString.SetSpan(span, start, end, SpanTypes.ExclusiveExclusive); } if (attributes.GetSuperscript()) { var span = new SuperscriptSpan(); spannableString.SetSpan(span, start, end, SpanTypes.ExclusiveExclusive); } if (attributes.GetStrikethrough()) { var span = new StrikethroughSpan(); spannableString.SetSpan(span, start, end, SpanTypes.ExclusiveExclusive); } if (attributes.GetUnorderedList()) { var bulletSpan = new BulletSpan(); spannableString.SetSpan(bulletSpan, start, end, SpanTypes.ExclusiveExclusive); } }