A type like System.Text.StringBuilder but only do concat.
예제 #1
0
파일: TokenHelper.cs 프로젝트: dotnet/docfx
 private static IMarkdownToken GroupTextTokens(IMarkdownParser parser, IMarkdownRule rule, bool wrapParagraph, StringBuffer textContent, SourceInfo si)
 {
     if (textContent.EndsWith('\n'))
     {
         textContent = textContent.Substring(0, textContent.GetLength() - 1);
     }
     var rawMarkdown = textContent.ToString();
     return CreateTwoPhaseToken(parser, rule, wrapParagraph, si.Copy(rawMarkdown));
 }
예제 #2
0
 public StringBuffer Concat(StringBuffer another)
 {
     if (another == Empty || another == null)
     {
         return this;
     }
     if (this == Empty)
     {
         return another;
     }
     if (another._index > ShrinkArrayLength)
     {
         var result = EnsureCapacity(1);
         result._buffer[result._index++] = another.ToString();
         return result;
     }
     else
     {
         var result = EnsureCapacity(another._index);
         Array.Copy(another._buffer, 0, result._buffer, result._index, another._index);
         result._index += another._index;
         return result;
     }
 }
예제 #3
0
 /// <summary>
 /// Concat another string buffer. (Create new instance if self is <see cref="Empty"/>, otherwise, modify self).
 /// </summary>
 /// <param name="another">The string buffer.</param>
 /// <returns>The string buffer.</returns>
 public StringBuffer Concat(StringBuffer another)
 {
     if (another == Empty || another == null)
     {
         return(this);
     }
     if (this == Empty)
     {
         return(another);
     }
     if (another._index > ShrinkArrayLength)
     {
         var result = EnsureCapacity(1);
         result._buffer[result._index++] = another.ToString();
         return(result);
     }
     else
     {
         var result = EnsureCapacity(another._index);
         Array.Copy(another._buffer, 0, result._buffer, result._index, another._index);
         result._index += another._index;
         return(result);
     }
 }
예제 #4
0
 public StringBuffer Clone()
 {
     if (this == Empty)
     {
         return this;
     }
     var result = new StringBuffer(_index + MinArrayLength);
     Array.Copy(_buffer, result._buffer, _index);
     result._index = _index;
     return result;
 }
예제 #5
0
 public StringBuffer Substring(int startIndex, int maxCount)
 {
     if (startIndex < 0)
     {
         throw new ArgumentOutOfRangeException(nameof(startIndex));
     }
     if (maxCount < 0)
     {
         throw new ArgumentOutOfRangeException(nameof(maxCount));
     }
     if (maxCount == 0)
     {
         return Empty;
     }
     var result = new StringBuffer(_buffer.Length);
     int skipCount = startIndex;
     int copyCount = maxCount;
     for (int i = 0; i < _index; i++)
     {
         if (skipCount > 0)
         {
             if (skipCount < _buffer[i].Length)
             {
                 result._index = 1;
                 if (_buffer[i].Length - skipCount > copyCount)
                 {
                     result._buffer[0] = _buffer[i].Substring(skipCount, copyCount);
                     return result;
                 }
                 else
                 {
                     result._buffer[0] = _buffer[i].Substring(skipCount);
                     copyCount -= result._buffer[0].Length;
                 }
             }
             skipCount -= _buffer[i].Length;
         }
         else
         {
             if (copyCount > _buffer[i].Length)
             {
                 result._buffer[result._index++] = _buffer[i];
                 copyCount -= _buffer[i].Length;
             }
             else
             {
                 result._buffer[result._index++] = copyCount == _buffer[i].Length ? _buffer[i] : _buffer[i].Remove(copyCount);
                 return result;
             }
         }
     }
     if (skipCount > 0)
     {
         throw new ArgumentOutOfRangeException(nameof(startIndex));
     }
     return result;
 }
예제 #6
0
        private static IMarkdownToken GroupTextTokens(IMarkdownParser parser, IMarkdownRule rule, bool wrapParagraph, StringBuffer textContent, SourceInfo si)
        {
            if (textContent.EndsWith('\n'))
            {
                textContent = textContent.Substring(0, textContent.GetLength() - 1);
            }
            var rawMarkdown = textContent.ToString();

            return(CreateTwoPhaseToken(parser, rule, wrapParagraph, si.Copy(rawMarkdown)));
        }
예제 #7
0
 protected virtual StringBuffer ApplyInline(IMarkdownRenderer engine, StringBuffer content, MarkdownBlockContext context)
 {
     if (content == StringBuffer.Empty)
     {
         return StringBuffer.Empty;
     }
     var result = engine.Engine.Mark(content.ToString(), context.GetInlineContext());
     return result;
 }
예제 #8
0
 private StringBuffer RenderTextInTokens(IMarkdownRenderer renderer, MarkdownBlockContext context, bool wrapParagraph, IMarkdownRule rule, StringBuffer textContent, string rawMarkdown)
 {
     if (wrapParagraph)
     {
         var parser = renderer.Engine.Parser;
         var c = parser.SwitchContext(context);
         var inlineContent = parser.TokenizeInline(textContent);
         parser.SwitchContext(c);
         return Render(renderer, new MarkdownParagraphBlockToken(rule, context, inlineContent, rawMarkdown), context);
     }
     else
     {
         return ApplyInline(renderer, textContent, context);
     }
 }
예제 #9
0
 private static StringBuffer AppendSourceInfoCore(StringBuffer result, IMarkdownToken token)
 {
     return(result + " sourceFile=\"" + StringHelper.HtmlEncode(token.SourceInfo.File) + "\" sourceStartLineNumber=\"" + token.SourceInfo.LineNumber.ToString() + "\" sourceEndLineNumber=\"" + (token.SourceInfo.LineNumber + token.SourceInfo.ValidLineCount - 1).ToString() + "\"");
 }
예제 #10
0
        protected StringBuffer Insert(int startLineNumber, int endLineNumber, StringBuffer name, StringBuffer tokenContent = null)
        {
            StringBuffer result = $"{{\"name\":\"{startLineNumber}>{endLineNumber}>{name}\"";

            if (tokenContent != null)
            {
                // If tokenContent is not empty ,should remove the last character(',')
                if (tokenContent.EndsWith(','))
                {
                    // TODO: add a method 'remove' of StringBuffer
                    string contentTemp = tokenContent;
                    tokenContent = contentTemp.Remove(contentTemp.Length - 1);
                }
                result += $",\"children\":[{tokenContent}]";
            }
            result += "},";

            return(result);
        }
예제 #11
0
 private StringBuffer RenderTextInTokens(IMarkdownRenderer renderer, MarkdownBlockContext context, bool wrapParagraph, IMarkdownRule rule, StringBuffer textContent, string rawMarkdown)
 {
     if (wrapParagraph)
     {
         var parser        = renderer.Engine.Parser;
         var c             = parser.SwitchContext(context);
         var inlineContent = parser.TokenizeInline(textContent);
         parser.SwitchContext(c);
         return(Render(renderer, new MarkdownParagraphBlockToken(rule, context, inlineContent, rawMarkdown), context));
     }
     else
     {
         return(ApplyInline(renderer, textContent, context));
     }
 }
예제 #12
0
 protected virtual StringBuffer ApplyInline(MarkdownEngine engine, StringBuffer content, MarkdownBlockContext context)
 {
     if (content == StringBuffer.Empty)
     {
         return StringBuffer.Empty;
     }
     var c = engine.SwitchContext(context.InlineContext);
     var result = engine.Mark(content.ToString());
     engine.SwitchContext(c);
     return result;
 }
예제 #13
0
 private StringBuffer RenderTextInTokens(MarkdownEngine engine, MarkdownBlockContext context, bool wrapParagraph, IMarkdownRule rule, StringBuffer textContent)
 {
     if (wrapParagraph)
     {
         return Render(engine, new MarkdownParagraphBlockToken(rule, textContent), context);
     }
     else
     {
         return ApplyInline(engine, textContent, context);
     }
 }
예제 #14
0
 private StringBuffer RenderTextInTokens(IMarkdownRenderer engine, MarkdownBlockContext context, bool wrapParagraph, IMarkdownRule rule, StringBuffer textContent, string rawMarkdown)
 {
     if (wrapParagraph)
     {
         return(Render(engine, new MarkdownParagraphBlockToken(rule, context, engine.Engine.Parser.TokenizeInline(textContent), rawMarkdown), context));
     }
     else
     {
         return(ApplyInline(engine, textContent, context));
     }
 }
예제 #15
0
 private StringBuffer RenderTextInTokens(MarkdownEngine engine, MarkdownBlockContext context, bool wrapParagraph, IMarkdownRule rule, StringBuffer textContent)
 {
     if (wrapParagraph)
     {
         return(Render(engine, new MarkdownParagraphBlockToken(rule, textContent), context));
     }
     else
     {
         return(ApplyInline(engine, textContent, context));
     }
 }
예제 #16
0
 private static StringBuffer AppendAttribute(StringBuffer buffer, string attributeName, string value)
 {
     if (string.IsNullOrEmpty(value)) return buffer;
     buffer += " ";
     buffer += attributeName;
     buffer += "=\"";
     buffer += StringHelper.HtmlEncode(value);
     buffer += "\"";
     return buffer;
 }