Пример #1
0
        public IAssetPlugin AddFont(IBaseFont font, FontTag fontTag)
        {
            List <FontTag> tags = new List <FontTag>();

            tags.Add(fontTag);
            return(AddFont(font, tags));
        }
Пример #2
0
 internal FontFace(int width, int height, FontTag tag, Dictionary <int, string> sheetUrls,
                   Padding?padding     = null, List <WhiteSpaceInfo> empties = null, List <CharOverride> customs = null,
                   bool hideBadUnicode = false)
 {
     CharWidth      = width;
     CharHeight     = height;
     Padding        = padding ?? Padding.Char;
     Tag            = tag;
     SheetUrls      = sheetUrls;
     Whitespace     = empties;
     Overrides      = customs;
     HideBadUnicode = hideBadUnicode;
 }
Пример #3
0
        private static FontTag GetTagValue(bool isMonospace, bool isUnicodeSupported)
        {
            FontTag tag = 0;

            if (isMonospace)
            {
                tag |= FontTag.Monospace;
            }

            if (isUnicodeSupported)
            {
                tag |= FontTag.UnicodeSupported;
            }

            return(tag);
        }
Пример #4
0
        public NSAttributedString ParseToAttributedText(string text, IBaseFont font)
        {
            try
            {
                if (font != null)
                {
                    this.ConvertFontFileNameForPlatform(ref font);

                    var assetPlugin = MvvmCross.Mvx.IoCProvider.Resolve <IAssetPlugin>();

                    string cleanText = string.Empty;

                    var indexPairs = AttributedFontHelper.GetFontTextBlocks(text, font.Name, assetPlugin, out cleanText);

                    NSMutableAttributedString attributedText = new NSMutableAttributedString(cleanText);

                    UIStringAttributes stringAttributes = CreateAttributesByFont(ref attributedText, font);
                    attributedText.AddAttributes(stringAttributes, new NSRange(0, cleanText.Length));

                    //TODO add caching for same fonttags for the attributes
                    foreach (FontIndexPair block in indexPairs)
                    {
                        //get the font for each tag and decorate the text
                        if (block.FontTag != null && !string.IsNullOrEmpty(block.FontTag.OriginalFontName))
                        {
                            FontTag fontTag = null;
                            var     tagFont = assetPlugin.GetFontByTagWithTag(font.Name, block.FontTag.Tag, out fontTag);

                            tagFont = tagFont == null ? font : tagFont;
                            UIStringAttributes attr = CreateAttributesByFont(ref attributedText, tagFont, block, fontTag);
                            attributedText.SetAttributes(attr, new NSRange(block.StartIndex, block.EndIndex - block.StartIndex));
                        }
                    }

                    return(attributedText);
                }
            }
            catch (Exception e)
            {
                //just return the text as passed if something fails
                return(new NSMutableAttributedString(text));
            }
            return(null);
        }
Пример #5
0
        /// <summary>
        /// Set the attributes of a part of the text
        /// </summary>
        /// <param name="converted">Converted.</param>
        /// <param name="pair">Pair.</param>
        private void SetAttributed(SpannableString converted, FontIndexPair pair, Font fallbackFont)
        {
            //get the font by tags

            FontTag fontTag = null;

            if (pair.FontTag != null)
            {
                var taggedFont = _assetPlugin.GetFontByTagWithTag(fallbackFont.Name, pair.FontTag.Tag, out fontTag);

                if (taggedFont != null)
                {
                    SetFont(ref converted, taggedFont, pair, fontTag);
                    return;
                }
            }

            if (fallbackFont != null)
            {
                SetFont(ref converted, fallbackFont, pair, fontTag);
            }
        }
Пример #6
0
        public IBaseFont GetFontByTagWithTag(string originalFontName, string tag, out FontTag originalTag)
        {
            List <FontTag> fontTag;
            string         fontName = string.Empty;

            originalTag = null;

            if (FontsTagged.TryGetValue(originalFontName, out fontTag))
            {
                originalTag = fontTag.FirstOrDefault(c => c.Tag.Equals(tag));
                if (originalTag != null)
                {
                    fontName = originalTag.OriginalFontName;
                }
            }

            if (string.IsNullOrEmpty(fontName))
            {
                return(null);
            }
            var font = GetFontByName(fontName);

            return(font);
        }
Пример #7
0
        public static string ConvertToUbb(string htmlContent, ContentConvert beforeConvert, ContentConvert afterConvert)
        {
            string msg = string.Empty;

            htmlContent = htmlContent.Replace("\n", string.Empty);
            htmlContent = htmlContent.Replace("\r", string.Empty);
            htmlContent = regScript.Replace(htmlContent, string.Empty);
            htmlContent = regStyle.Replace(htmlContent, string.Empty);
            // htmlContent = htmlContent.Trim();

            if (beforeConvert != null)
            {
                htmlContent = beforeConvert(htmlContent);
            }

            MatchCollection matchs   = regTag.Matches(htmlContent);
            int             tagIndex = 0;

            List <HtmlTagBase> tags = new List <HtmlTagBase>()
            , beginTags             = new List <HtmlTagBase>()
            , endTages   = new List <HtmlTagBase>()
            , singleTags = new List <HtmlTagBase>();

            foreach (Match m in matchs)
            {
                HtmlTagBase t;
                string      tagName = m.Groups[1].Value;

                //这里也可以根据HTML标签来反射生成Html标签类, 代码可以少很多, 但是这样性能不好。
                switch (tagName.ToLower())
                {
                case "img":
                    t = new ImgTag(tagIndex, m.Value, m.Index);
                    break;

                case "a":
                    t = new ATag(tagIndex, m.Value, m.Index);
                    break;

                case "font":
                    t = new FontTag(tagIndex, m.Value, m.Index);
                    break;

                case "span":
                    t = new SpanTag(tagIndex, m.Value, m.Index);
                    break;

                case "br":
                    t = new BrTag(tagIndex, m.Value, m.Index);
                    break;

                case "div":
                    t = new DivTag(tagIndex, m.Value, m.Index);
                    break;

                case "p":
                    t = new PTag(tagIndex, m.Value, m.Index);
                    break;

                case "table":
                    t = new TableTag(tagIndex, m.Value, m.Index);
                    break;

                case "ol":
                case "ul":
                    t = new ListTag(tagIndex, m.Value, m.Index);
                    break;

                case "td":
                case "tr":
                case "s":
                case "b":
                case "i":
                case "sub":
                case "sup":
                case "u":
                    t = new PairTag(tagIndex, m.Value, m.Index);
                    break;

                case "th":
                    t = new PairTag(tagIndex, m.Value, m.Index);
                    ((PairTag)t).UbbTag = "td";
                    break;

                case "strong":
                    t = new PairTag(tagIndex, m.Value, m.Index);
                    ((PairTag)t).UbbTag = "b";
                    break;

                case "em":
                    t = new PairTag(tagIndex, m.Value, m.Index);
                    ((PairTag)t).UbbTag = "i";
                    break;

                case "strike":
                    t = new PairTag(tagIndex, m.Value, m.Index);
                    ((PairTag)t).UbbTag = "s";
                    break;

                case "blockquote":
                    t = new PairTag(tagIndex, m.Value, m.Index);
                    ((PairTag)t).UbbTag = "indent";
                    break;

                case "h1":
                case "h2":
                case "h3":
                case "h4":
                case "h5":
                case "h6":
                    t = new HTag(tagIndex, m.Value, m.Index);
                    break;

                case "embed":
                    t = new EmbedTag(tagIndex, m.Value, m.Index);
                    break;

                default:
                    t = new HtmlTagBase(tagIndex, m.Value, m.Index);
                    break;
                }
                tagIndex++;

                t.TagList = tags;
                tags.Add(t);

                if (t.IsSingleTag)
                {
                    singleTags.Add(t);
                }
                else
                {
                    if (!t.IsEndTag)
                    {
                        beginTags.Add(t);
                    }
                    else
                    {
                        int flag = -1;
                        for (int i = beginTags.Count - 1; i >= 0; i--)
                        {
                            if (beginTags[i].TagName == t.TagName)//匹配开始标记和结束标记
                            {
                                flag = i;
                                beginTags[i].Pair = t;
                                t.Pair            = beginTags[i];
                                break;
                            }
                        }

                        if (flag >= 0)
                        {
                            for (int i = beginTags.Count - 1; i >= flag; i--)
                            {
                                beginTags.RemoveAt(i);
                            }
                        }
                    }
                }
            }

            StringBuilder builder = new StringBuilder(htmlContent);

            for (int i = 0; i < tags.Count; i++)
            {
                if (!tags[i].IsSingleTag)
                {
                    if (tags[i].Pair == null)
                    {
                        msg += tags[i].TagName + "没有对应的" + (tags[i].IsEndTag ? "开始" : "结束") + "标记\r\n";
                    }
                }
                if (!tags[i].IsEndTag || tags[i].IsSingleTag)
                {
                    builder = tags[i].ConvertToUBB(builder);
                }
            }

            //builder.Replace(" ", string.Empty);
            builder.Replace("\t", string.Empty);

            htmlContent = builder.ToString();
            htmlContent = new Regex("<.*?>").Replace(htmlContent, string.Empty);
            htmlContent = HttpUtility.HtmlDecode(htmlContent);


            if (afterConvert != null)
            {
                htmlContent = afterConvert(htmlContent);
            }

            return(htmlContent);
        }
Пример #8
0
        private void SetFont(ref SpannableString converted, IBaseFont font, FontIndexPair pair, FontTag fontTag)
        {
            //set the text color
            if (font.Color != System.Drawing.Color.Empty)
            {
                converted.SetSpan(new ForegroundColorSpan(font.Color.ToNativeColor()), pair.StartIndex, pair.EndIndex, SpanTypes.ExclusiveInclusive);
            }

            if (fontTag != null && fontTag.FontAction == FontTagAction.Link)
            {
                CreateLink(ref converted, font, pair);
            }

            //set allignment
            if (font is Font)
            {
                Font taggedExtendedFont = font as Font;

                if (taggedExtendedFont.Alignment != TextAlignment.None)
                {
                    Layout.Alignment alignment = taggedExtendedFont.Alignment == TextAlignment.Center ? Layout.Alignment.AlignCenter : Layout.Alignment.AlignNormal;
                    converted.SetSpan(new AlignmentSpanStandard(alignment), pair.StartIndex, pair.EndIndex, SpanTypes.ExclusiveInclusive);
                }
            }

            if (_extendedFont != null)
            {
                //calculate the relative size to the regular font
                converted.SetSpan(new RelativeSizeSpan((float)font.Size / (float)_extendedFont.Size), pair.StartIndex, pair.EndIndex, SpanTypes.ExclusiveInclusive);
            }
            //set the custom typeface
            converted.SetSpan(new CustomTypefaceSpan("sans-serif", DroidAssetPlugin.GetCachedFont(font, _context)), pair.StartIndex, pair.EndIndex, SpanTypes.ExclusiveInclusive);
        }
        private static List <FontTextPair> IterateThroughTags(IAssetPlugin assetPlugin, string text, string fontName)
        {
            //find the first text
            int findIndex = 0;

            List <FontTextPair> fontTextBlocks = new List <FontTextPair>();

            int beginTagStartIndex = -1;
            int beginTagEndIndex   = -1;

            int endTagStartIndex = -1;
            int endTagEndIndex   = -1;

            //Start searching for tags
            bool foundTag         = true;
            int  previousBeginTag = -1;
            Dictionary <string, string> tagProperties;
            bool skippedUnknownTag = false;

            while (foundTag)
            {
                FontTag fontTag = null;
                tagProperties = new Dictionary <string, string>();

                //find the end of the tag
                beginTagStartIndex = text.IndexOf('<', findIndex);

                string tag    = string.Empty;
                string endTag = string.Empty;

                if (beginTagStartIndex != -1)
                {
                    beginTagEndIndex = text.IndexOf('>', beginTagStartIndex);

                    if (beginTagEndIndex != -1)
                    {
                        //there's a tag, get the description
                        tag = text.Substring(beginTagStartIndex + 1, beginTagEndIndex - beginTagStartIndex - 1);

                        tagProperties = GetTagProperties(ref tag);

                        var tagFont = assetPlugin.GetFontByTagWithTag(fontName, tag, out fontTag);

                        if (tagFont == null)
                        {
                            //if the font is not found, let it remain in the text and embed it in another block
                            //beginTagStartIndex = previousBeginTag;
                            if (findIndex == 0)
                            {
                                previousBeginTag = 0;
                            }
                            findIndex         = beginTagEndIndex + 1;
                            skippedUnknownTag = true;
                            continue;
                        }

                        endTag           = $"</{tag}>";
                        endTagStartIndex = text.IndexOf(endTag, beginTagEndIndex);

                        //end tag not found
                        if (endTagStartIndex == -1)
                        {
                            throw new Exception($"No matching end tag found in {text}");
                        }

                        endTagEndIndex = endTagStartIndex + (endTag.Length - 1);

                        if (beginTagStartIndex != 0)
                        {
                            var startIndex = findIndex;
                            if (skippedUnknownTag)
                            {
                                startIndex = previousBeginTag;
                            }
                            //in case the first block has no tag, add an empty block
                            fontTextBlocks.Add(new FontTextPair()
                            {
                                Text = text.Substring(startIndex, beginTagStartIndex - startIndex), FontTag = null
                            });
                        }

                        fontTextBlocks.Add(new FontTextPair()
                        {
                            Text = text.Substring(beginTagEndIndex + 1, endTagStartIndex - beginTagEndIndex - 1), FontTag = fontTag, TagProperties = tagProperties
                        });
                        findIndex = endTagEndIndex + 1;
                    }
                }
                else
                {
                    foundTag = false;
                }

                skippedUnknownTag = false;
                previousBeginTag  = beginTagStartIndex;
            }

            //check if the end tag is the last character, if not add a final block till the end
            if (endTagEndIndex < text.Length - 1)
            {
                fontTextBlocks.Add(new FontTextPair()
                {
                    Text = text.Substring(endTagEndIndex + 1, text.Length - endTagEndIndex - 1), FontTag = null
                });
            }

            return(fontTextBlocks);
        }
Пример #10
0
        private UIStringAttributes CreateAttributesByFont(ref NSMutableAttributedString text, IBaseFont font, FontIndexPair pair = null, FontTag tag = null)
        {
            UIStringAttributes stringAttributes = new UIStringAttributes {
            };

            //add the font
            stringAttributes.Font = TouchAssetPlugin.GetCachedFont(font);

            //add the color
            if (font.Color != System.Drawing.Color.Empty)
            {
                stringAttributes.ForegroundColor = font.Color.ToNativeColor();
            }

            if (pair != null && tag != null)
            {
                if (tag.FontAction == FontTagAction.Link)
                {
                    CreateLink(ref text, ref stringAttributes, font, pair);
                }
            }

            if (font is Font)
            {
                var extendedFont = font as Font;

                if (stringAttributes.ParagraphStyle == null)
                {
                    stringAttributes.ParagraphStyle = new NSMutableParagraphStyle();
                }

                if (extendedFont.Alignment != TextAlignment.None)
                {
                    UITextAlignment alignment = extendedFont.ToNativeAlignment();
                    stringAttributes.ParagraphStyle.Alignment = alignment;
                }

                //add the lineheight
                stringAttributes.ParagraphStyle.LineSpacing = GetPlatformLineHeight(font.Size, extendedFont.LineHeight);

                stringAttributes.ParagraphStyle.LineBreakMode = extendedFont.ToNativeLineBreakMode();

                stringAttributes.ParagraphStyle.LineHeightMultiple = extendedFont.LineHeightMultiplier.HasValue ? (float)extendedFont.LineHeightMultiplier.Value : 0f;
            }

            return(stringAttributes);
        }