コード例 #1
0
        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());
                }
            }
        }
コード例 #2
0
        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);
            }
        }