Exemplo n.º 1
0
 private static string RemoveTrailingWhitespaceAndNewLines(string text, PreprocessedTextLocationMap map)
 {
     return(Preprocessor.Replace(
                TrailingReturnPattern,
                Preprocessor.Replace(TrailingWhitespaceAndNewLinesPattern, text, "\n", map),
                "", map));
 }
Exemplo n.º 2
0
        public static string Normalize(string text, PreprocessedTextLocationMap map)
        {
            text = Preprocessor.Replace(NewLinePattern, text, NewLineEvaluator, map);
            text = Preprocessor.Replace(TabPattern, text, m => TabReplacement(m, text), map);

            return text;
        }
Exemplo n.º 3
0
        public static void AddChangesToBounds(
            PreprocessedTextLocationMap map,
            List<PreprocessingTextChange> changes,
            PreprocessedData data,
            PreprocessedTextType type)
        {
            if (data == null)
            {
                return;
            }

            foreach (var change in changes)
            {
                if (change.RemoveCharsCount == 0)
                {
                    continue;
                }

                var start = change.Index;
                var end = change.Index + change.RemoveCharsCount - 1;

                if(map != null)
                {
                    start = map.GetOriginalPosition(start, PositionRounding.Up);
                    end = map.GetOriginalPosition(end, PositionRounding.Down);
                }

                data.PreprocessedTextBounds.Add(
                    new PreprocessedTextBound(
                        type, start, end));
            }
        }
Exemplo n.º 4
0
        public static string ConvertVariableLikeTOCInlines(string text, PreprocessedTextLocationMap map)
        {
            var evaluator = new MatchEvaluator(match => "[" + match.Groups["content"].Value + "]");

            return(map == null
                       ? TOCPatternVariableLike.Replace(text, evaluator)
                       : Preprocessor.Replace(TOCPatternVariableLike, text, evaluator, map));
        }
Exemplo n.º 5
0
        public static string CutoutVariableInclusions(string text, PreprocessedTextLocationMap map)
        {
            text = Preprocessor.EscapeChars(text, map);

            text = Preprocessor.Replace(InLineVariableOrMetadata, text, "", map);

            return Preprocessor.UnescapeChars(text, false, map);
        }
Exemplo n.º 6
0
        public static string ConvertVariableLikeTOCInlines(string text, PreprocessedTextLocationMap map)
        {
            var evaluator = new MatchEvaluator(match => "[" + match.Groups["content"].Value + "]");

            return map == null
                       ? TOCPatternVariableLike.Replace(text, evaluator)
                       : Preprocessor.Replace(TOCPatternVariableLike, text, evaluator, map);
        }
Exemplo n.º 7
0
        private static List <TableRowInformation> GetHeaders(EMDocument doc, EMElementOrigin origin, EMElement parent, TransformationData data, int headerOffset, string tableHeader, out bool useRowHeader)
        {
            // Add headers
            // May be multiple lines, may have columns spanning
            // May also have no header if we are intending the 1st column to be the header

            var map = new PreprocessedTextLocationMap();

            tableHeader = RemoveTrailingWhitespaceAndNewLines(tableHeader, map);

            List <TableRowInformation> templateHeaderRows = null;

            useRowHeader = true;

            if (!String.IsNullOrWhiteSpace(tableHeader))
            {
                templateHeaderRows = new List <TableRowInformation>();

                var headerRowOffset = 0;

                var headerRows = Regex.Split(tableHeader, @"\n");
                foreach (var headerRow in headerRows)
                {
                    var count = 0;

                    var headerColumns = Regex.Matches(headerRow, @"[ ]?([^\|]+)[ ]?([\|]*)");
                    var row           = new TableRowInformation();

                    foreach (Match headerColumn in headerColumns)
                    {
                        var cellGroup        = headerColumn.Groups[1];
                        var columnSpanLength = 1;

                        if (Regex.Match(headerColumn.Groups[2].Value, @"(\|{2,})").Success)
                        {
                            columnSpanLength = Regex.Match(headerColumn.Groups[2].Value, @"(\|{2,})").Length;
                        }

                        var cell = new TableCellInformation(doc, new EMElementOrigin(headerOffset + map.GetOriginalPosition(headerRowOffset + cellGroup.Index, PositionRounding.Down), cellGroup.Value), parent, data, columnSpanLength, null, true);

                        if (count == 0)
                        {
                            useRowHeader = !Regex.Match(cell.ToString(), @"(\S)").Success;
                        }

                        count++;

                        row.Cells.Add(cell);
                    }

                    headerRowOffset += headerRow.Length + 1;
                    templateHeaderRows.Add(row);
                }
            }

            return(templateHeaderRows);
        }
        public PreprocessedData(EMDocument document, ProcessedDocumentCache manager)
        {
            Excerpts = new ExcerptsManager(this);
            Variables = new VariableManager(this);
            Metadata = new MetadataManager(this);
            ReferenceLinks = new ReferenceLinksManager(this);
            TextMap = new PreprocessedTextLocationMap();
            PreprocessedTextBounds = new List<PreprocessedTextBound>();

            Document = document;

            this.manager = manager;
        }
Exemplo n.º 9
0
        public static string CheckAndGenerateInfos(string text, PreprocessedTextLocationMap map)
        {
            if (OffensiveWordList.Count == 0)
            {
                return(text);
            }

            var changes = new List <PreprocessingTextChange>();

            var output = WordSplitPattern.Replace(text, match => Evaluator(match, changes));

            map.ApplyChanges(changes);

            return(output);
        }
        public static string CheckAndGenerateInfos(string text, PreprocessedTextLocationMap map)
        {
            if (OffensiveWordList.Count == 0)
            {
                return text;
            }

            var changes = new List<PreprocessingTextChange>();

            var output = WordSplitPattern.Replace(text, match => Evaluator(match, changes));

            map.ApplyChanges(changes);

            return output;
        }
Exemplo n.º 11
0
        public string ReplaceVariables(EMDocument doc, string text, TransformationData data, PreprocessedTextLocationMap map = null)
        {
            text = EMTOCInline.ConvertVariableLikeTOCInlines(text, map);

            var stack = new Stack<Tuple<string, string>>();
            var currentFile = new FileInfo(doc.LocalPath);

            return map == null
                       ? InLineVariableOrMetadata.Replace(
                           text,
                           everyMatch =>
                           ParseInLineVariableOrMetadata(everyMatch, currentFile, currentFile, data, doc, stack))
                       : Preprocessor.Replace(
                           InLineVariableOrMetadata,
                           text,
                           everyMatch =>
                           ParseInLineVariableOrMetadata(everyMatch, currentFile, currentFile, data, doc, stack),
                           map);
        }
Exemplo n.º 12
0
 public string ParseVariablesDefinition(string text, string relPath, TransformationData data, PreprocessedTextLocationMap map)
 {
     return Preprocessor.Replace(VariableDefinitionPattern, text, everyMatch => ParseVariableDefinition(everyMatch, relPath, data), map);
 }
Exemplo n.º 13
0
        public static string Replace(Regex pattern, string text, MatchEvaluator evaluator, PreprocessedTextLocationMap locationMap, List<PreprocessingTextChange> changesDone = null)
        {
            if (locationMap == null && changesDone == null)
            {
                return pattern.Replace(text, evaluator);
            }

            var changes = changesDone ?? new List<PreprocessingTextChange>();
            
            var output = pattern.Replace(text, m => PreprocessingTextChange.MatchEvaluatorWithTextChangeEmitWrapper(m, evaluator, changes));

            if (locationMap != null)
            {
                locationMap.ApplyChanges(changes);
            }

            return output;
        }
Exemplo n.º 14
0
        public void AugmentCompletionSession(SnapshotSpan span, IList <CompletionSet> completionSets)
        {
            var text = span.GetText();

            var map = new PreprocessedTextLocationMap();

            text = VariableManager.CutoutVariableInclusions(text, map);

            var match = LinkStartPattern.Match(text);

            if (!match.Success)
            {
                return;
            }

            var suggestionMatchGroup = match.Groups["suggestion"];
            var pathMatchGroup       = match.Groups["path"];

            List <PathElement> list;

            if (match.Groups["link"].Success)
            {
                var isImageLink = match.Groups["image"].Success;

                list =
                    PathCompletionHelper.GetSuggestionList(
                        UDNDocRunningTableMonitor.CurrentUDNDocView.ParsingResultsCache.Results.Document,
                        pathMatchGroup.Value,
                        (!isImageLink ? PathElementType.Attachment : 0) | PathElementType.Folder
                        | ((string.IsNullOrWhiteSpace(pathMatchGroup.Value) && !isImageLink)
                               ? PathElementType.Bookmark
                               : 0) | (isImageLink ? PathElementType.Image : 0));
            }
            else if (match.Groups["include"].Success)
            {
                if (pathMatchGroup.Length == 0)
                {
                    if (match.Groups["hash"].Success)
                    {
                        list = GetLocalSuggestions(PathElementType.Excerpt);
                    }
                    else
                    {
                        list = GetLocalSuggestions(PathElementType.Excerpt)
                               .Select(e => new PathElement("#" + e.Text, e.Type))
                               .ToList();

                        list.AddRange(GetRootFolders());
                    }
                }
                else
                {
                    list =
                        PathCompletionHelper.GetSuggestionList(
                            UDNDocRunningTableMonitor.CurrentUDNDocView.CurrentEMDocument,
                            "%ROOT%/" + pathMatchGroup.Value,
                            match.Groups["hash"].Success ? PathElementType.Excerpt : PathElementType.Folder);
                }
            }
            else if (match.Groups["variable"].Success)
            {
                if (pathMatchGroup.Length == 0)
                {
                    list = GetRootFolders();
                    list.AddRange(GetLocalSuggestions(PathElementType.Variable));
                }
                else
                {
                    var types = match.Groups["colon"].Success ? PathElementType.Variable : PathElementType.Folder;
                    var path  = "%ROOT%/" + pathMatchGroup.Value.Substring(0, pathMatchGroup.Length - 1);

                    list = PathCompletionHelper.GetSuggestionList(
                        UDNDocRunningTableMonitor.CurrentUDNDocView.CurrentEMDocument, path, types);
                }
            }
            else
            {
                throw new InvalidOperationException("Should not happen!");
            }

            try
            {
                var trackingSpan = span.Snapshot.CreateTrackingSpan(
                    span.Start + map.GetOriginalPosition(suggestionMatchGroup.Index, PositionRounding.None),
                    suggestionMatchGroup.Length,
                    SpanTrackingMode.EdgeInclusive);

                completionSets.Add(
                    new CompletionSet(
                        "AutoCompletion",
                        "AutoCompletion",
                        trackingSpan,
                        CompletionCreator.SortAndCreateCompletions(list),
                        null));
            }
            catch (UnableToDetectOriginalPositionException)
            {
                // ignore and don't show completions
            }
        }
Exemplo n.º 15
0
 public static string Replace(Regex pattern, string text, string replacement, PreprocessedTextLocationMap locationMap)
 {
     return Replace(pattern, text, m => replacement, locationMap);
 }
Exemplo n.º 16
0
 private static string TrimRight(string text, char c, PreprocessedTextLocationMap textMap)
 {
     return Replace(new Regex(Regex.Escape(c.ToString()) + @"+\z"), text, "", textMap);
 }
Exemplo n.º 17
0
        public static string EscapeChars(string text, PreprocessedTextLocationMap map)
        {
            foreach (var c in BackslashEscapedChars)
            {
                text = Replace(new Regex(Regex.Escape(@"\" + c)), text, string.Format("\x19{0}\x19", c.GetHashCode()), map);
            }

            return text;
        }
Exemplo n.º 18
0
        private static List <TableRowInformation> GetRows(
            EMElement parent,
            TransformationData data,
            int tableDataOffset,
            string tableData,
            string[] alignments,
            bool useRowHeader,
            bool hasHeader)
        {
            // Add body data
            var tableRows = new List <TableRowInformation>();

            var map = new PreprocessedTextLocationMap();

            tableData = RemoveTrailingWhitespaceAndNewLines(tableData, map);

            var dataRows = Regex.Split(tableData, @"\n");

            var rowOffset = 0;

            for (var i = 0; i < dataRows.Count(); ++i)
            {
                var dataRow = dataRows[i];

                // Parse table into List of List of CellInformation
                var count = 0;

                var dataColumns = Regex.Matches(dataRow, @"([^\|]+)([\|]*)");

                var tableRow = new TableRowInformation();

                // Check to see if someone has left an empty row incorrectly formatted, which we can fix.
                if (dataColumns.Count == 0)
                {
                    var fixedDataRow = dataRow;
                    for (var j = dataRow.Length; j < alignments.Length + 1; ++j)
                    {
                        fixedDataRow += '|';
                    }
                    fixedDataRow = fixedDataRow.Insert(1, " ");

                    dataColumns = Regex.Matches(fixedDataRow, @"([^\|]+)([\|]*)");
                }

                foreach (Match dataColumn in dataColumns)
                {
                    int addToOffset;
                    var cell = Normalizer.LeadingWhitespaceRemove(dataColumn.Groups[1].Value, out addToOffset);
                    cell = Normalizer.TrailingWhitespaceRemove(cell);

                    var columnSpanLength = 1;
                    var isRowHeader      = (count == 0 && useRowHeader && dataColumns.Count > 1) ||
                                           (dataColumns.Count == 1 && i == 0 && !hasHeader);

                    if (Regex.Match(dataColumn.Groups[2].Value, @"(\|{2,})").Success)
                    {
                        columnSpanLength = Regex.Match(dataColumn.Groups[2].Value, @"(\|{2,})").Length;
                    }

                    // @UE3 ensure that the index into alignments is not greater than the amount expected. (Users may accidentally add extra || to lines)
                    string alignment = null;
                    if (count >= alignments.Length)
                    {
                        // Report only 1 error per row per run to avoid duplicates
                        if (!tableRow.HasError)
                        {
                            var errorCount = data.ErrorList.Count;
                            tableRow.ErrorId  = errorCount;
                            tableRow.HasError = true;
                            data.ErrorList.Add(
                                Markdown.GenerateError(
                                    Language.Message(
                                        "MoreColumnsThanAllignmentsInOneOfTheTableRowsColumnsIgnored",
                                        Markdown.Unescape(dataRows[i])),
                                    MessageClass.Error,
                                    Markdown.Unescape(dataRows[i]),
                                    errorCount,
                                    data));
                        }
                    }
                    else
                    {
                        alignment = alignments[count];
                    }

                    var cellInformation = (cell.Trim() != "^")
                                              ? new TableCellInformation(
                        parent.Document,
                        new EMElementOrigin(tableDataOffset + map.GetOriginalPosition(addToOffset + rowOffset + dataColumn.Groups[1].Index, PositionRounding.Down), cell),
                        parent, data, columnSpanLength, alignment, isRowHeader)
                                              : new TableCellInformation(columnSpanLength, alignment, isRowHeader, false, 1, true);

                    tableRow.Cells.Add(cellInformation);

                    // Make parsing table easier later, if ColumnSpan > 1 create a blank column for each over one
                    for (var dummyColumnCount = 1; dummyColumnCount < columnSpanLength; ++dummyColumnCount)
                    {
                        tableRow.Cells.Add(new TableCellInformation(0));
                    }

                    // @UE3 this was not in original specification, handles correct alignment of a subsequent column after a long column.
                    count += columnSpanLength;
                }
                // If count is zero check that someone has just not placed a space in the first column indicating it should be empty.

                if (count < alignments.Length)
                {
                    var errorCount = data.ErrorList.Count;
                    tableRow.ErrorId  = errorCount;
                    tableRow.HasError = true;
                    data.ErrorList.Add(
                        Markdown.GenerateError(
                            Language.Message(
                                "LessColumnsThanExpectedInOneOfTheTableRowsEmptyCellsInserted", Markdown.Unescape(dataRows[i])),
                            MessageClass.Error,
                            Markdown.Unescape(dataRows[i]),
                            errorCount,
                            data));
                }

                // If count is less than total expected for a rows data add dummy column and raise error
                for (var dummyColumnCount = count; dummyColumnCount < alignments.Length; ++dummyColumnCount)
                {
                    tableRow.Cells.Add(new TableCellInformation(1, null, false, true));
                }

                tableRows.Add(tableRow);

                rowOffset += dataRow.Length + 1;
            }

            // Now work out rowspans based on Content and character ^
            // Work down rows in columns

            for (var columnNumber = 0; columnNumber < alignments.Length; ++columnNumber)
            {
                var firstNonSpanRow = -1;
                for (var rowNumber = 0; rowNumber < tableRows.Count; ++rowNumber)
                {
                    if (tableRows[rowNumber].Cells[columnNumber].IsRowSpanColumn) //Found a rowspan column
                    {
                        if (rowNumber == 0)
                        {
                            var errorCount = data.ErrorList.Count;
                            tableRows[rowNumber].ErrorId  = errorCount;
                            tableRows[rowNumber].HasError = true;
                            data.ErrorList.Add(
                                Markdown.GenerateError(
                                    Language.Message(
                                        "ColumnCannotBeSetToSpanWithSpecialSymbolInTheFirstRowOfATable", dataRows[0]),
                                    MessageClass.Error,
                                    dataRows[0],
                                    errorCount,
                                    data));
                        }
                        else
                        {
                            if (firstNonSpanRow < 0)
                            {
                                //is this the first detected row for this span?
                                firstNonSpanRow = rowNumber - 1;

                                //Row span above this 1 now should include itself
                                tableRows[firstNonSpanRow].Cells[columnNumber].RowSpanCount = 1;
                            }

                            //Increment the Row above first_row detected by 1
                            tableRows[firstNonSpanRow].Cells[columnNumber].RowSpanCount += 1;
                        }
                    }
                    else if (firstNonSpanRow >= 0)
                    {
                        //This row is not a rowspan but we had one previously so clear for any other rowspans in the column
                        firstNonSpanRow = -1;
                    }
                }
            }

            return(tableRows);
        }
Exemplo n.º 19
0
 protected EMContentElement(EMDocument doc, EMElementOrigin origin, EMElement parent)
     : base(doc, origin, parent)
 {
     localTextMap = new PreprocessedTextLocationMap();
 }
Exemplo n.º 20
0
        public string ParseExcerpts(string text, TransformationData data, PreprocessedTextLocationMap map)
        {
            var excerptInfos = new Dictionary<string, ExcerptInfo>();

            text = ProcessExcerpt(ExcerptBlock, text, data, excerptInfos, map);
            text = ProcessExcerpt(ExcerptInline, text, data, excerptInfos, map);

            foreach (var excerptInfo in excerptInfos)
            {
                AddExcerpt(data, excerptInfo.Value, excerptInfo.Key);
            }

            AddExcerpt(data, new ExcerptInfo(map.GetOriginalPosition(0, PositionRounding.Down), 0, text), "");

            return text;
        }
Exemplo n.º 21
0
 /// <summary>
 /// Remove one level of line-leading spaces
 /// </summary>
 public static string Outdent(string block, PreprocessedTextLocationMap textMap = null)
 {
     return (textMap == null) ? _outDent.Replace(block, "") : MarkdownSharp.Preprocessor.Preprocessor.Replace(_outDent, block, "", textMap);
 }
Exemplo n.º 22
0
        public static string UnescapeChars(string text, bool leaveBackslash = false, PreprocessedTextLocationMap map = null)
        {
            foreach (var c in BackslashEscapedChars)
            {
                text = Replace(
                    new Regex(Regex.Escape(string.Format("\x19{0}\x19", c.GetHashCode()))),
                    text,
                    (leaveBackslash ? "\\" : "") + c.ToString(CultureInfo.InvariantCulture),
                    map);
            }

            return text;
        }
Exemplo n.º 23
0
        /// <summary>
        /// Turn Markdown `code spans` into HTML code tags
        /// </summary>
        private static string DoCodeSpans(string text, PreprocessedTextLocationMap locationMap)
        {
            //    * You can use multiple backticks as the delimiters if you want to
            //        include literal backticks in the code span. So, this input:
            //
            //        Just type ``foo `bar` baz`` at the prompt.
            //
            //        Will translate to:
            //
            //          <p>Just type <code>foo `bar` baz</code> at the prompt.</p>
            //
            //        There's no arbitrary limit to the number of backticks you
            //        can use as delimters. If you need three consecutive backticks
            //        in your code, use four for delimiters, etc.
            //
            //    * You can use spaces to get literal backticks at the edges:
            //
            //          ... type `` `bar` `` ...
            //
            //        Turns to:
            //
            //          ... type <code>`bar`</code> ...         
            //

            return Replace(_codeSpan, text, CodeSpanEvaluator, locationMap);
        }
Exemplo n.º 24
0
        public static string OutdentIfPossible(string block, PreprocessedTextLocationMap textMap = null)
        {
            if (IndentedPattern.Match(block).Success)
            {
                block = Outdent(block, textMap);
            }

            return block;
        }
Exemplo n.º 25
0
 public static string Trim(string text, char c, PreprocessedTextLocationMap textMap)
 {
     text = TrimLeft(text, c, textMap);
     return TrimRight(text, c, textMap);
 }
Exemplo n.º 26
0
        private static string ProcessExcerpt(Regex pattern, string text, TransformationData data, Dictionary<string, ExcerptInfo> excerptsInfos, PreprocessedTextLocationMap map)
        {
            var changes = new List<PreprocessingTextChange>();

            text = pattern.Replace(text, match => ParseExcerpt(match, excerptsInfos, data, changes));

            map.ApplyChanges(changes);

            return text;
        }
Exemplo n.º 27
0
        public void AugmentCompletionSession(SnapshotSpan span, IList<CompletionSet> completionSets)
        {
            var text = span.GetText();

            var map = new PreprocessedTextLocationMap();

            text = VariableManager.CutoutVariableInclusions(text, map);

            var match = LinkStartPattern.Match(text);

            if (!match.Success)
            {
                return;
            }

            var suggestionMatchGroup = match.Groups["suggestion"];
            var pathMatchGroup = match.Groups["path"];

            List<PathElement> list;

            if (match.Groups["link"].Success)
            {
                var isImageLink = match.Groups["image"].Success;

                list =
                    PathCompletionHelper.GetSuggestionList(
                        UDNDocRunningTableMonitor.CurrentUDNDocView.ParsingResultsCache.Results.Document,
                        pathMatchGroup.Value,
                        (!isImageLink ? PathElementType.Attachment : 0) | PathElementType.Folder
                        | ((string.IsNullOrWhiteSpace(pathMatchGroup.Value) && !isImageLink)
                               ? PathElementType.Bookmark
                               : 0) | (isImageLink ? PathElementType.Image : 0));
            }
            else if(match.Groups["include"].Success)
            {
                if (pathMatchGroup.Length == 0)
                {
                    if (match.Groups["hash"].Success)
                    {
                        list = GetLocalSuggestions(PathElementType.Excerpt);
                    }
                    else
                    {
                        list = GetLocalSuggestions(PathElementType.Excerpt)
                                .Select(e => new PathElement("#" + e.Text, e.Type))
                                .ToList();

                        list.AddRange(GetRootFolders());
                    }
                }
                else
                {
                    list =
                        PathCompletionHelper.GetSuggestionList(
                            UDNDocRunningTableMonitor.CurrentUDNDocView.CurrentEMDocument,
                            "%ROOT%/" + pathMatchGroup.Value,
                            match.Groups["hash"].Success ? PathElementType.Excerpt : PathElementType.Folder);
                }
            }
            else if (match.Groups["variable"].Success)
            {
                if (pathMatchGroup.Length == 0)
                {
                    list = GetRootFolders();
                    list.AddRange(GetLocalSuggestions(PathElementType.Variable));
                }
                else
                {
                    var types = match.Groups["colon"].Success ? PathElementType.Variable : PathElementType.Folder;
                    var path = "%ROOT%/" + pathMatchGroup.Value.Substring(0, pathMatchGroup.Length - 1);

                    list = PathCompletionHelper.GetSuggestionList(
                            UDNDocRunningTableMonitor.CurrentUDNDocView.CurrentEMDocument, path, types);
                }
            }
            else
            {
                throw new InvalidOperationException("Should not happen!");
            }

            try
            {
                var trackingSpan = span.Snapshot.CreateTrackingSpan(
                    span.Start + map.GetOriginalPosition(suggestionMatchGroup.Index, PositionRounding.None),
                    suggestionMatchGroup.Length,
                    SpanTrackingMode.EdgeInclusive);

                completionSets.Add(
                    new CompletionSet(
                        "AutoCompletion",
                        "AutoCompletion",
                        trackingSpan,
                        CompletionCreator.SortAndCreateCompletions(list),
                        null));
            }
            catch (UnableToDetectOriginalPositionException)
            {
                // ignore and don't show completions
            }
        }