Beispiel #1
0
        private void AssertRanges(string expected, List <SnippetRange> ranges)
        {
            StringBuilder builder = new StringBuilder();

            foreach (SnippetRange range in ranges)
            {
                builder.Append(StringOf(range) + "\n");
                if (range.next != null)
                {
                    builder.Append("  next:\n");
                    for (SnippetRange subrange = range.next; subrange != null; subrange = subrange.next)
                    {
                        builder.Append("  " + StringOf(subrange) + "\n");
                    }
                }
                if (range.subrange != null)
                {
                    builder.Append("  subrange:\n");
                    for (SnippetRange subrange = range.subrange; subrange != null; subrange = subrange.subrange)
                    {
                        builder.Append("  " + StringOf(subrange) + "\n");
                    }
                }
                if (range.nested != null)
                {
                    builder.Append("  nested:\n");
                    for (SnippetRange subrange = range.nested; subrange != null; subrange = subrange.nested)
                    {
                        builder.Append("  " + StringOf(subrange) + "\n");
                    }
                }
            }
            Assert.AreEqual(expected, builder.ToString());
        }
 private void OnAfterKeyPress()
 {
     if (needNext)
     {
         return;
     }
     SnippetRange current = snippet.ranges[state - 1];
     {
         for (SnippetRange rangeI = current; rangeI != null; rangeI = rangeI.next)
         {
             int  position0 = position + rangeI.index;
             int  position1 = position + rangeI.index + rangeI.count;
             bool isInside  = false;
             foreach (Selection selection in controller.Selections)
             {
                 if (selection.caret >= position0 && selection.caret <= position1)
                 {
                     isInside = true;
                 }
             }
             if (!isInside)
             {
                 Close();
             }
         }
     }
 }
Beispiel #3
0
 public static int Compare(SnippetRange a, SnippetRange b)
 {
     if (a.order != b.order)
     {
         if (a.order == "0")
         {
             return(1);
         }
         if (b.order == "0")
         {
             return(-1);
         }
         return(string.Compare(a.order, b.order));
     }
     if (a.index != b.index)
     {
         return(a.index - b.index);
     }
     return(a.count - b.count);
 }
 public override void RemoveText(int index, int count)
 {
     if (state <= 0 && state >= snippet.ranges.Count)
     {
         return;
     }
     foreach (SnippetRange range in snippet.ranges)
     {
         for (SnippetRange rangeI = range; rangeI != null; rangeI = rangeI.next)
         {
             if (position + rangeI.index >= index)
             {
                 rangeI.index -= count;
             }
             else if (position + rangeI.index + rangeI.count >= index)
             {
                 rangeI.count -= count;
             }
         }
     }
     allowNested = false;
 }
    public override void InsertText(int index, string text)
    {
        if (state <= 0 && state >= snippet.ranges.Count)
        {
            return;
        }
        int offset = text.Length;

        foreach (SnippetRange range in snippet.ranges)
        {
            for (SnippetRange rangeI = range; rangeI != null; rangeI = rangeI.next)
            {
                if (position + rangeI.index >= index)
                {
                    rangeI.index += offset;
                }
                else if (position + rangeI.index + rangeI.count >= index)
                {
                    rangeI.count += offset;
                }
            }
        }
        allowNested = false;
    }
 public void NextEntry()
 {
     if (needNext)
     {
         needNext = false;
         if (allowNested)
         {
             allowNested = false;
             SnippetRange prev  = snippet.ranges[state];
             SnippetRange range = prev.nested;
             ++state;
             int index = state;
             for (; range != null; range = range.nested)
             {
                 range.index += prev.index;
                 snippet.ranges.Insert(index, range);
                 ++index;
             }
         }
         else
         {
             ++state;
             if (state >= snippet.ranges.Count)
             {
                 Close();
             }
         }
     }
     if (state < snippet.ranges.Count)
     {
         SnippetRange range = snippet.ranges[state];
         controller.ClearMinorSelections();
         controller.LastSelection.anchor = position + range.index;
         controller.LastSelection.caret  = position + range.index + range.count;
         for (SnippetRange rangeI = range.next; rangeI != null; rangeI = rangeI.next)
         {
             controller.PutNewCursor(controller.Lines.PlaceOf(position + rangeI.index));
             controller.LastSelection.caret = controller.LastSelection.anchor + rangeI.count;
         }
         foreach (SnippetRange rangeI in snippet.ranges)
         {
             for (SnippetRange rangeJ = rangeI.subrange; rangeJ != null; rangeJ = rangeJ.subrange)
             {
                 if (rangeJ.order == range.order)
                 {
                     controller.PutNewCursor(controller.Lines.PlaceOf(position + rangeI.index + rangeJ.index));
                     controller.LastSelection.caret = controller.LastSelection.anchor + rangeJ.count;
                 }
             }
         }
         controller.NeedScrollToCaret();
     }
     if (state >= snippet.ranges.Count)
     {
         Close();
         return;
     }
     if (snippet.ranges[state].nested == null)
     {
         ++state;
         if (state >= snippet.ranges.Count)
         {
             Close();
         }
     }
     else
     {
         needNext    = true;
         allowNested = true;
     }
 }
Beispiel #7
0
    public Snippet(string rawText,
                   Settings settings,
                   Getter <string, string> replaceDefaultValue)
    {
        rawText = new Regex(@"\$\{(\d):\$\{VISUAL\}\}").Replace(rawText, @"${$1}");
        rawText = rawText.Replace("`g:snips_author`", settings.snipsAuthor.Value);
        rawText = ReplaceTime(rawText);
        List <Part>         parts           = ParseText(rawText);
        List <SnippetRange> secondaryRanges = new List <SnippetRange>();

        foreach (Part part in parts)
        {
            if (part.isEntry)
            {
                if (replaceDefaultValue != null)
                {
                    part.entry_value = replaceDefaultValue(part.entry_value);
                }
                part.entry_range = new SnippetRange(part.entry_order);
                part.entry_range.defaultValue = part.entry_value;
                if (part.entry_secondary)
                {
                    secondaryRanges.Add(part.entry_range);
                }
                else
                {
                    ranges.Add(part.entry_range);
                }
            }
        }
        for (int i = secondaryRanges.Count; i-- > 0;)
        {
            SnippetRange secondaryRange = secondaryRanges[i];
            foreach (SnippetRange range in ranges)
            {
                if (range.order == secondaryRange.order)
                {
                    secondaryRange.next         = range.next;
                    secondaryRange.defaultValue = range.defaultValue;
                    secondaryRange.count        = range.defaultValue.Length;
                    range.next = secondaryRange;
                }
            }
        }
        StringBuilder builder = new StringBuilder();

        foreach (Part part in parts)
        {
            if (part.isEntry)
            {
                int  index     = part.entry_value.IndexOf("${");
                bool needParse =
                    index != -1 &&
                    index + 2 < part.entry_value.Length &&
                    char.IsDigit(part.entry_value[index + 2]);
                if (!needParse)
                {
                    for (int i = part.entry_value.Length - 1; i-- > 0;)
                    {
                        if (part.entry_value[i] == '$' && char.IsDigit(part.entry_value[i + 1]))
                        {
                            needParse = true;
                            break;
                        }
                    }
                }
                if (needParse)
                {
                    List <Part>   nested        = ParseText(part.entry_value);
                    SnippetRange  current       = part.entry_range;
                    SnippetRange  subrange      = part.entry_range;
                    StringBuilder nestedBuilder = new StringBuilder();
                    foreach (Part partI in nested)
                    {
                        if (partI.isEntry)
                        {
                            if (partI.entry_secondary)
                            {
                                subrange.subrange = new SnippetRange(partI.entry_order);
                                subrange          = subrange.subrange;
                                subrange.index    = nestedBuilder.Length;
                                foreach (Part partJ in parts)
                                {
                                    if (partJ.isEntry && !partJ.entry_secondary && partJ.entry_order == subrange.order)
                                    {
                                        subrange.defaultValue = partJ.entry_value;
                                    }
                                }
                                subrange.count = subrange.defaultValue.Length;
                                nestedBuilder.Append(subrange.defaultValue);
                            }
                            else
                            {
                                current.nested       = new SnippetRange(partI.entry_order);
                                current              = current.nested;
                                current.index        = nestedBuilder.Length;
                                current.count        = partI.entry_value.Length;
                                current.defaultValue = partI.entry_value;
                                nestedBuilder.Append(current.defaultValue);
                            }
                        }
                        else
                        {
                            nestedBuilder.Append(partI.text_value);
                        }
                    }
                    part.entry_range.defaultValue = nestedBuilder.ToString();
                    part.entry_range.count        = part.entry_range.defaultValue.Length;
                }
                part.entry_range.index = builder.Length;
                part.entry_range.count = part.entry_range.defaultValue.Length;
                builder.Append(part.entry_range.defaultValue);
            }
            else
            {
                builder.Append(part.text_value);
            }
        }
        int builderLength = builder.Length;

        if (builderLength >= 2 && builder[builderLength - 2] == '\r' && builder[builderLength - 1] == '\n')
        {
            builder.Length -= 2;
        }
        else if (builderLength >= 1 && (builder[builderLength - 1] == '\n' || builder[builderLength - 1] == '\r'))
        {
            --builder.Length;
        }
        _startText = builder.ToString();
        ranges.Sort(SnippetRange.Compare);
    }
Beispiel #8
0
 private string StringOf(SnippetRange range)
 {
     return("-" + range.order + ":" + range.index + "," + range.count + ":" + range.defaultValue);
 }