public IAssetPlugin AddFont(IBaseFont font, FontTag fontTag) { List <FontTag> tags = new List <FontTag>(); tags.Add(fontTag); return(AddFont(font, tags)); }
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; }
private static FontTag GetTagValue(bool isMonospace, bool isUnicodeSupported) { FontTag tag = 0; if (isMonospace) { tag |= FontTag.Monospace; } if (isUnicodeSupported) { tag |= FontTag.UnicodeSupported; } return(tag); }
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); }
/// <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); } }
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); }
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); }
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); }
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); }