Пример #1
0
 public EMHeader(EMDocument doc, EMElementOrigin origin, EMElement parent, int level, string text, bool isOptional = false)
     : base(doc, origin, parent, ToName(text))
 {
     Text = text;
     Level = level;
     IsOptional = isOptional;
 }
Пример #2
0
 public EMHeader(EMDocument doc, EMElementOrigin origin, EMElement parent, int level, string text, bool isOptional = false)
     : base(doc, origin, parent, ToName(text))
 {
     Text       = text;
     Level      = level;
     IsOptional = isOptional;
 }
Пример #3
0
 private EMObject(EMDocument doc, EMElementOrigin origin, EMElement parent, string templateFile)
     : base(doc, origin, parent)
 {
     template            = Templates.GetCached(templateFile);
     this.literalParams  = new Dictionary <string, List <string> >();
     this.markdownParams = new Dictionary <string, List <EMObjectParam> >();
 }
Пример #4
0
        public static EMElement CreateRegion(EMElementOrigin origin, EMDocument doc, EMElement parent, TransformationData data, EMMarkdownTaggedElementMatch match, string regionParameters)
        {
            var content = new EMRegion(doc, origin, parent, match, regionParameters);

            content.Elements.Parse(0, Markdown.OutdentIfPossible(match.Content, content.Elements.TextMap), data);

            return(content);
        }
Пример #5
0
 public EMInclude(EMDocument doc, EMElementOrigin origin, EMElement parent, EMExcerpt excerpt, int headerOffset = 1, bool languageChanged = false, bool includeTOC = true)
     : base(doc, origin, parent)
 {
     Excerpt         = excerpt;
     HeaderOffset    = headerOffset;
     LanguageChanged = languageChanged;
     IncludeTOC      = includeTOC;
 }
Пример #6
0
        protected EMElement(EMDocument doc, EMElementOrigin origin, EMElement parent = null)
        {
            Origin   = origin;
            Parent   = parent;
            Document = doc;

            Messages = new List <EMReadingMessage>();
        }
Пример #7
0
        public static EMElement CreateRegion(EMElementOrigin origin, EMDocument doc, EMElement parent, TransformationData data, EMMarkdownTaggedElementMatch match, string regionParameters)
        {
            var content = new EMRegion(doc, origin, parent, match, regionParameters);

            content.Elements.Parse(0, Markdown.OutdentIfPossible(match.Content, content.Elements.TextMap), data);

            return content;
        }
Пример #8
0
        private static EMElement CreateItem(Match match, EMDocument doc, EMElementOrigin origin, EMElement parent, TransformationData data)
        {
            var item = new EMDefinitionListItem(doc, origin, parent);

            item.Parse(doc, match, data);

            return(item);
        }
Пример #9
0
        public static EMElement CreateFromInline(EMDocument doc, EMElementOrigin orig, EMElement parent, TransformationData data, EMSpanElements content, string parameters)
        {
            var match = InlineParametersPattern.Match(parameters);
            var path  = match.Groups["path"].Value.Trim();
            var title = match.Groups["title"].Value;

            return(Create(doc, orig, parent, data, content, path, title));
        }
Пример #10
0
 private EMTOCInline(EMDocument doc, EMElementOrigin origin, EMElement parent, int startLevel, int endLevel, EMDocument linkedDocument, string path)
     : base(doc, origin, parent)
 {
     this.startLevel     = startLevel;
     this.endLevel       = endLevel != 0 ? endLevel : int.MaxValue;
     this.linkedDocument = linkedDocument;
     this.path           = path;
 }
        public static EMElement CreateList(EMListParserMatch match, EMDocument doc, EMElementOrigin origin, EMElement parent, TransformationData data)
        {
            var list = new EMList(doc, origin, parent, match.Type);

            list.Parse(match.Text, data);

            return(list);
        }
Пример #12
0
 private EMTOCInline(EMDocument doc, EMElementOrigin origin, EMElement parent, int startLevel, int endLevel, EMDocument linkedDocument, string path)
     : base(doc, origin, parent)
 {
     this.startLevel = startLevel;
     this.endLevel = endLevel != 0 ? endLevel : int.MaxValue;
     this.linkedDocument = linkedDocument;
     this.path = path;
 }
Пример #13
0
 private EMImage(EMDocument doc, EMElementOrigin origin, EMElement parent, EMLocalFilePath path, string title, string alt, ImageOptions options)
     : base(doc, origin, parent)
 {
     Path    = path;
     Title   = title;
     Alt     = alt;
     Options = options;
 }
Пример #14
0
 private EMImage(EMDocument doc, EMElementOrigin origin, EMElement parent, EMLocalFilePath path, string title, string alt, ImageOptions options)
     : base(doc, origin, parent)
 {
     Path = path;
     Title = title;
     Alt = alt;
     Options = options;
 }
Пример #15
0
        private static EMElement CreateParagraph(Match match, EMDocument doc, EMElementOrigin origin, EMElement parent, TransformationData data)
        {
            var contentGroup = match.Groups["content"];
            var spanContent  = new EMSpanElements(doc, new EMElementOrigin(origin.Start, contentGroup.Value), parent);

            spanContent.Parse(contentGroup.Value, data);

            return(new EMParagraph(doc, origin, parent, spanContent));
        }
Пример #16
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);
        }
Пример #17
0
        private static EMHeader CreateFromSetextMatch(Match match, EMDocument doc, EMElementOrigin origin, EMElement parent, TransformationData data)
        {
            var headerText = match.Groups[2].Value;
            var level = match.Groups[3].Value.StartsWith("=") ? 1 : 2;
            var isOptional = string.IsNullOrWhiteSpace(match.Groups[1].Value);

            headerText = Markdown.Unescape(data.Markdown.RunSpanGamut(headerText, data));

            return new EMHeader(doc, origin, parent, level, headerText, isOptional);
        }
Пример #18
0
 public static EMErrorElement Create(
     EMDocument doc,
     EMElementOrigin origin,
     EMElement parent,
     TransformationData data,
     string messageId,
     params string[] messageArgs)
 {
     return new EMErrorElement(doc, origin, parent, new EMReadingMessage(MessageClass.Error, messageId, messageArgs), data);
 }
Пример #19
0
 public static EMErrorElement Create(
     EMDocument doc,
     EMElementOrigin origin,
     EMElement parent,
     TransformationData data,
     string messageId,
     params string[] messageArgs)
 {
     return(new EMErrorElement(doc, origin, parent, new EMReadingMessage(MessageClass.Error, messageId, messageArgs), data));
 }
Пример #20
0
        private static EMHeader CreateFromSetextMatch(Match match, EMDocument doc, EMElementOrigin origin, EMElement parent, TransformationData data)
        {
            var headerText = match.Groups[2].Value;
            var level      = match.Groups[3].Value.StartsWith("=") ? 1 : 2;
            var isOptional = string.IsNullOrWhiteSpace(match.Groups[1].Value);

            headerText = Markdown.Unescape(data.Markdown.RunSpanGamut(headerText, data));

            return(new EMHeader(doc, origin, parent, level, headerText, isOptional));
        }
Пример #21
0
        private static EMElement CreateTOCInline(
            Match match, EMDocument doc, EMElementOrigin origin, EMElement parent, TransformationData data)
        {
            var start = 0;
            var end   = 0;

            SpacePattern.Split(match.Groups["params"].Value).ToList().ForEach(
                param =>
            {
                if (string.IsNullOrWhiteSpace(param))
                {
                    return;
                }

                var parts = param.Split(':');
                var name  = parts[0];
                var value = int.Parse(parts[1]);

                switch (name)
                {
                case "start":
                    start = value;
                    break;

                case "end":
                    end = value;
                    break;
                }
            });

            var path = match.Groups["path"].Value;
            ClosestFileStatus status;
            var linkedDoc = data.ProcessedDocumentCache.GetClosest(path, out status);

            if (status == ClosestFileStatus.FileMissing)
            {
                return(EMErrorElement.Create(doc, origin, parent, data, "BadIncludeOrMissingMarkdownFile", path));
            }

            if (status == ClosestFileStatus.ChangedToIntVersion || status == ClosestFileStatus.ExactMatch)
            {
                EMElement output = new EMTOCInline(doc, origin, parent, start, end, linkedDoc, path);

                if (status == ClosestFileStatus.ChangedToIntVersion)
                {
                    output.AddMessage(new EMReadingMessage(MessageClass.Info, "BadIncludeOrMissingMarkdownFileINTUsed", path), data);
                }

                return(output);
            }

            // should never happen!
            throw new InvalidOperationException("Bad linking file status.");
        }
Пример #22
0
        public EMTable(EMDocument doc, EMElementOrigin origin, EMElement parent, Match match, TransformationData data)
            : base(doc, origin, parent)
        {
            var tableAlignment = RemoveTrailingWhitespaceAndNewLines(match.Groups[3].Value, null);

            bool useRowHeader;

            optionalCaption       = data.Markdown.RunSpanGamut(GetOptionalCaption(match.Groups[0].Value), data);
            tableHeaderRows       = GetHeaders(doc, origin, this, data, match.Groups[2].Index - match.Index, match.Groups[2].Value, out useRowHeader);
            tableColumnAlignments = new List <Hash>();
            tableRows             = GetRows(this, data, match.Groups[5].Index - match.Index, match.Groups[5].Value, GetAlignments(tableAlignment, tableColumnAlignments), useRowHeader, !String.IsNullOrWhiteSpace(match.Groups[2].Value));
        }
        public static EMElement CreateFromText(string text, EMDocument doc, EMElementOrigin origin, EMElement parent, TransformationData data, bool imageLink = false)
        {
            try
            {
                var path = EMPathProvider.CreatePath(text, doc, data);

                return(new EMRelativeLink(doc, origin, parent, path));
            }
            catch (EMPathVerificationException e)
            {
                return(new EMErrorElement(doc, origin, parent, e.AddToErrorList(data, origin.Text)));
            }
        }
Пример #24
0
        private static EMElement CreateItem(EMListType type, EMDocument doc, Match match, EMElementOrigin origin, EMElement parent, TransformationData data)
        {
            var itemGroup = match.Groups[4];

            var item = new EMListItem(doc, origin, parent, type);

            // adding offset to text map
            item.Elements.TextMap.ApplyChanges(new List<PreprocessingTextChange>() { new PreprocessingTextChange(0, itemGroup.Index - match.Index, 0) });

            item.Elements.Parse(0, Markdown.Outdent(itemGroup.Value, item.Elements.TextMap), data);

            return item;
        }
Пример #25
0
        public static EMElement CreateFromText(string text, EMDocument doc, EMElementOrigin origin, EMElement parent, TransformationData data, bool imageLink = false)
        {
            try
            {
                var path = EMPathProvider.CreatePath(text, doc, data);

                return new EMRelativeLink(doc, origin, parent, path);
            }
            catch (EMPathVerificationException e)
            {
                return new EMErrorElement(doc, origin, parent, e.AddToErrorList(data, origin.Text));
            }
        }
        private static EMElement Create(Match match, EMDocument doc, EMElementOrigin origin, EMElement parent, TransformationData data)
        {
            var bqTextGroup = match.Groups[1];
            var bqText      = bqTextGroup.Value;

            bqText = Regex.Replace(bqText, @"^[ ]*>[ ]?", "", RegexOptions.Multiline);       // trim one level of quoting
            bqText = Regex.Replace(bqText, @"^[ ]+$", "", RegexOptions.Multiline);           // trim whitespace-only lines

            var bq = new EMBlockQuotes(doc, origin, parent);

            bq.Elements.Parse(origin.Start + bqTextGroup.Index, bqText, data);

            return(bq);
        }
Пример #27
0
        private static EMElement Create(Match match, EMDocument doc, EMElementOrigin origin, EMElement parent, TransformationData data)
        {
            var bqTextGroup = match.Groups[1];
            var bqText = bqTextGroup.Value;

            bqText = Regex.Replace(bqText, @"^[ ]*>[ ]?", "", RegexOptions.Multiline);       // trim one level of quoting
            bqText = Regex.Replace(bqText, @"^[ ]+$", "", RegexOptions.Multiline);           // trim whitespace-only lines

            var bq = new EMBlockQuotes(doc, origin, parent);

            bq.Elements.Parse(origin.Start + bqTextGroup.Index, bqText, data);

            return bq;
        }
Пример #28
0
 public TableCellInformation(
     EMDocument doc,
     EMElementOrigin origin,
     EMElement parent,
     TransformationData data,
     int colSpanCount     = 1,
     string alignment     = null,
     bool isRowHeader     = false,
     bool isDummy         = false,
     int rowSpanCount     = 1,
     bool isRowSpanColumn = false)
     : this(colSpanCount, alignment, isRowHeader, isDummy, rowSpanCount, isRowSpanColumn)
 {
     Content = new EMSpanElements(doc, origin, parent);
     Content.Parse(0, origin.Text, data);
 }
Пример #29
0
        private static EMHeader CreateFromAtxMatch(Match match, EMDocument doc, EMElementOrigin origin, EMElement parent, TransformationData data)
        {
            var headerText = match.Groups[3].Value;

            if (headerText.Contains("ifndef") || headerText.Contains("endif"))
            {
                return null;
            }

            var level = match.Groups[1].Value.Length;
            var isOptional = string.IsNullOrWhiteSpace(match.Groups[2].Value);

            headerText = Markdown.Unescape(data.Markdown.RunSpanGamut(headerText, data));

            return new EMHeader(doc, origin, parent, level, headerText, isOptional);
        }
Пример #30
0
        private static EMHeader CreateFromAtxMatch(Match match, EMDocument doc, EMElementOrigin origin, EMElement parent, TransformationData data)
        {
            var headerText = match.Groups[3].Value;

            if (headerText.Contains("ifndef") || headerText.Contains("endif"))
            {
                return(null);
            }

            var level      = match.Groups[1].Value.Length;
            var isOptional = string.IsNullOrWhiteSpace(match.Groups[2].Value);

            headerText = Markdown.Unescape(data.Markdown.RunSpanGamut(headerText, data));

            return(new EMHeader(doc, origin, parent, level, headerText, isOptional));
        }
Пример #31
0
        public static EMElement CreateFromAnchorRef(EMDocument doc, EMElementOrigin orig, EMElement parent, TransformationData data, EMSpanElements content, string parameters)
        {
            var match = AnchorRefParametersPattern.Match(parameters);

            var linkId = match.Groups["id"].Value.ToLowerInvariant();

            if (!data.ReferenceLinks.Urls.ContainsKey(linkId))
            {
                throw new EMSkipParsingException();
            }

            var url = data.ReferenceLinks.Urls[linkId];

            return(Create(doc, orig, parent, data, content, url,
                          GetReferenceTitle(data, linkId)));
        }
Пример #32
0
        public EMLink(EMDocument doc, EMElementOrigin origin, EMElement parent, TransformationData data, EMPathProvider path, string title, EMSpanElements content)
            : base(doc, origin, parent)
        {
            Path = path;

            Title   = title;
            Content = content;

            if (path.ChangedLanguage)
            {
                AddMessage(
                    new EMReadingMessage(
                        MessageClass.Info, "BadLinkOrMissingMarkdownFileForLinkINTUsed", path.GetPath(data)),
                    data);
            }
        }
Пример #33
0
        private void ParseParams(EMMarkdownTaggedElementMatch contentMatch, TransformationData data)
        {
            foreach (Match paramMatch in ParamPattern.Matches(contentMatch.Content))
            {
                var isLiteral = paramMatch.Groups["tagName"].Value.ToLower() == "paramliteral";
                var paramName = paramMatch.Groups["paramName"].Value;

                if (isLiteral)
                {
                    var text = new Regex("^" + Regex.Escape(paramMatch.Groups["indentation"].Value), RegexOptions.Multiline).Replace(paramMatch.Groups["content"].Value, "");

                    text = text.Trim('\n');

                    text = Markdown.OutdentIfPossible(text);
                    if (literalParams.ContainsKey(paramName))
                    {
                        literalParams[paramName].Add(text);
                    }
                    else
                    {
                        List <string> literalStrings = new List <string>();
                        literalStrings.Add(text);
                        literalParams.Add(paramName, literalStrings);
                    }
                }
                else
                {
                    var origin   = new EMElementOrigin(paramMatch.Groups["contentWithTags"].Index + contentMatch.ContentStart, paramMatch.Groups["contentWithTags"].Value);
                    var tagMatch = new EMMarkdownTaggedElementMatch(origin.Start, origin.Text, paramName,
                                                                    paramMatch.Groups["content"].Index - paramMatch.Groups["contentWithTags"].Index, paramMatch.Groups["content"].Length, paramName);

                    var param = EMObjectParam.CreateParam(origin, Document, this, data,
                                                          tagMatch, paramName, paramMatch.Groups["indentation"].Value);

                    if (literalParams.ContainsKey(paramName))
                    {
                        markdownParams[paramName].Add(param);
                    }
                    else
                    {
                        List <EMObjectParam> paramList = new List <EMObjectParam>();
                        paramList.Add(param);
                        markdownParams.Add(paramName, paramList);
                    }
                }
            }
        }
Пример #34
0
        private static EMElement CreateFromInline(Match match, EMDocument doc, EMElementOrigin origin, EMElement parent, TransformationData data)
        {
            var alt            = match.Groups[2].Value;
            var url            = match.Groups[3].Value;
            var title          = match.Groups[6].Value;
            var width          = match.Groups[9].Value;
            var height         = match.Groups[11].Value;
            var align          = match.Groups[13].Value;
            var convert        = match.Groups[15].Value;
            var convertType    = match.Groups[17].Value;
            var convertQuality = match.Groups[19].Value;
            var hexFillColor   = match.Groups[21].Value;

            return(Create(
                       data, doc, origin, parent, url, alt, title, convert, width,
                       height, convertQuality, hexFillColor, convertType,
                       new ImageOptions(width, height, align)));
        }
Пример #35
0
        private static EMElement CreateFromReference(Match match, EMDocument doc, EMElementOrigin origin, EMElement parent, TransformationData data)
        {
            var alt = match.Groups[2].Value;


            var linkId = match.Groups[3].Value.ToLowerInvariant();

            // for shortcut links like ![this][].
            if (linkId == "")
            {
                linkId = alt.ToLowerInvariant();
            }

            alt = alt.Replace("\"", "&quot;");

            if (!data.ReferenceLinks.Urls.ContainsKey(linkId))
            {
                return(EMErrorElement.Create(doc, origin, parent, data, "MissingImageRef", linkId));
            }

            var url = data.ReferenceLinks.Urls[linkId];

            var imageFormat = data.ReferenceLinks.ReferenceAttributes[linkId];

            var width          = imageFormat.Width;
            var height         = imageFormat.Height;
            var convert        = imageFormat.DoCompressImages;
            var convertType    = imageFormat.ConvertImageFormat;
            var convertQuality = imageFormat.ImageQuality;
            var hexFillColor   = imageFormat.ImageFill;

            var options = data.ReferenceLinks.ImageAlignment.ContainsKey(linkId)
                              ? data.ReferenceLinks.ImageAlignment[linkId]
                              : new ImageOptions();

            var title = data.ReferenceLinks.Titles.ContainsKey(linkId)
                            ? Markdown.EscapeBoldItalic(data.ReferenceLinks.Titles[linkId])
                            : null;

            return(Create(
                       data, doc, origin, parent, url, alt, title, convert, width,
                       height, convertQuality, hexFillColor, convertType, options));
        }
Пример #36
0
        public static EMObjectParam CreateParam(EMElementOrigin origin, EMDocument doc, EMElement parent, TransformationData data, EMMarkdownTaggedElementMatch match, string paramName, string paramIndentation)
        {
            var content = new EMObjectParam(doc, origin, parent, match, paramName);

            var text =
                Preprocessor.Replace(
                    new Regex(
                        "^" + Regex.Escape(paramIndentation), RegexOptions.Multiline),
                    content.Elements.Origin.Text,
                    "",
                    content.Elements.TextMap);

            text = Preprocessor.Trim(text, '\n', content.Elements.TextMap);

            text = Markdown.OutdentIfPossible(text, content.Elements.TextMap);

            content.Elements.Parse(0, text, data);

            return(content);
        }
Пример #37
0
        public static EMObjectParam CreateParam(EMElementOrigin origin, EMDocument doc, EMElement parent, TransformationData data, EMMarkdownTaggedElementMatch match, string paramName, string paramIndentation)
        {
            var content = new EMObjectParam(doc, origin, parent, match, paramName);

            var text =
                Preprocessor.Replace(
                    new Regex(
                        "^" + Regex.Escape(paramIndentation), RegexOptions.Multiline),
                    content.Elements.Origin.Text,
                    "",
                    content.Elements.TextMap);

            text = Preprocessor.Trim(text, '\n', content.Elements.TextMap);

            text = Markdown.OutdentIfPossible(text, content.Elements.TextMap);

            content.Elements.Parse(0, text, data);

            return content;
        }
Пример #38
0
        public static EMElement CreateIncludeFilesFromText(string text, EMDocument doc, EMElementOrigin origin, EMElement parent, TransformationData data)
        {
            var specs = Preprocessor.UnescapeChars(IncludeFilesPattern.Match(text).Groups["specs"].Value, true);

            var paths = GetIncludesFromPathSpecs(specs, data);

            var inclusions = new EMElements(doc, origin, parent);

            var i = 0;

            foreach (var path in paths)
            {
                var pathOrigin = new EMElementOrigin(i, "");

                try
                {
                    bool languageChanged;

                    var excerpt =
                        ExcerptsManager.Get(data.ProcessedDocumentCache,
                                            Path.Combine(data.CurrentFolderDetails.AbsoluteMarkdownPath, path),
                                            data.CurrentFolderDetails.Language,
                                            "",
                                            out languageChanged);

                    inclusions.Add(new EMInclude(doc, pathOrigin, inclusions, excerpt, 0, languageChanged, false));
                }
                catch (ExcerptsManagerException e)
                {
                    inclusions.Add(EMErrorElement.Create(doc, pathOrigin, inclusions, data, e.MessageId, e.MessageArgs));
                }

                ++i;
            }

            return(inclusions);
        }
Пример #39
0
 public EMObjectParam(EMDocument doc, EMElementOrigin origin, EMElement parent, EMMarkdownTaggedElementMatch match, string paramName)
     : base(doc, origin, parent, match.ContentStart, match.ContentLength)
 {
     ParamName = paramName;
 }
Пример #40
0
 public EMErrorElement(EMDocument doc, EMElementOrigin origin, EMElement parent, int errorId)
     : base(doc, origin, parent)
 {
     ErrorId = errorId;
 }
Пример #41
0
 public EMSpanElements(EMDocument doc, EMElementOrigin origin, EMElement parent)
     : base(doc, origin, parent)
 {
 }
Пример #42
0
        private static EMElement CreateFromInline(Match match, EMDocument doc, EMElementOrigin origin, EMElement parent, TransformationData data)
        {
            var alt = match.Groups[2].Value;
            var url = match.Groups[3].Value;
            var title = match.Groups[6].Value;
            var width = match.Groups[9].Value;
            var height = match.Groups[11].Value;
            var align = match.Groups[13].Value;
            var convert = match.Groups[15].Value;
            var convertType = match.Groups[17].Value;
            var convertQuality = match.Groups[19].Value;
            var hexFillColor = match.Groups[21].Value;

            return Create(
                data, doc, origin, parent, url, alt, title, convert, width,
                height, convertQuality, hexFillColor, convertType,
                new ImageOptions(width, height, align));
        }
 public EMRawHTML(EMDocument doc, EMElementOrigin origin, EMElement parent, string name, string attributesString)
     : base(doc, origin, parent, 0, origin.Length)
 {
     this.name             = name;
     this.attributesString = attributesString;
 }
Пример #44
0
 private EMHorizontalRule(EMDocument doc, EMElementOrigin origin, EMElement parent)
     : base(doc, origin, parent)
 {
 }
Пример #45
0
 private static EMElement Create(Match match, EMDocument doc, EMElementOrigin origin, EMElement parent, TransformationData data)
 {
     return new EMHorizontalRule(doc, origin, parent);
 }
Пример #46
0
 protected EMBookmark(EMDocument doc, EMElementOrigin origin, EMElement parent, string bookmark)
     : base(doc, origin, parent)
 {
     Name = bookmark;
     UniqueKey = MakeUniqueKey(Name.ToLower());
 }
Пример #47
0
 public EMRegion(EMDocument doc, EMElementOrigin origin, EMElement parent, EMMarkdownTaggedElementMatch match, string regionParam, bool singleLine = false)
     : base(doc, origin, parent, match.ContentStart, match.ContentLength)
 {
     this.singleLine = singleLine;
     RegionParam = regionParam;
 }
Пример #48
0
        private static EMElement Create(Match match, EMDocument doc, EMElementOrigin origin, EMElement parent, TransformationData data)
        {
            var bookmark = match.Groups["BookmarkName"].Value;

            return new EMBookmark(doc, origin, parent, bookmark);
        }
Пример #49
0
        private static EMElement Create(
            TransformationData data,
            EMDocument doc,
            EMElementOrigin origin,
            EMElement parent,
            string url,
            string alt,
            string title,
            string convert,
            string width,
            string height,
            string convertQuality,
            string hexFillColor,
            string convertType,
            ImageOptions options)
        {
            ImageFormat imageFormatType;

            if (String.IsNullOrWhiteSpace(url))
            {
                return EMErrorElement.Create(doc, origin, parent, data, "EmptyLink", origin.Text);
            }

            alt = alt.Replace("\"", "&quot;");

            if (title != null)
            {
                title = title.Replace("\"", "&quot;");
            }

            if (url.StartsWith("<") && url.EndsWith(">"))
            {
                url = url.Substring(1, url.Length - 2); // Remove <>'s surrounding URL, if present
            }

            if (String.IsNullOrWhiteSpace(alt))
            {
                //if no alt text provided use the file name.
                alt = Regex.Replace(url, @".*[\\|/](.*)", "$1");
            }

            var doConvert = !convert.ToLower().Equals("false") && data.Markdown.DefaultImageDoCompress;

            int widthIntConverted;
            int heightIntConverted;
            int quality;

            Color fillColor;

            if (doConvert)
            {
                //if we are converting try to get the other values
                //try parse the strings for width and height into integers
                try
                {
                    widthIntConverted = Int32.Parse(width);
                }
                catch (FormatException)
                {
                    widthIntConverted = 0;
                }

                try
                {
                    heightIntConverted = Int32.Parse(height);
                }
                catch (FormatException)
                {
                    heightIntConverted = 0;
                }

                try
                {
                    quality = Int32.Parse(convertQuality);
                }
                catch (FormatException)
                {
                    quality = data.Markdown.DefaultImageQuality;
                }

                try
                {
                    fillColor = ImageConversion.GetColorFromHexString(hexFillColor);
                }
                catch (Exception)
                {
                    fillColor = data.Markdown.DefaultImageFillColor;
                }

                if (String.IsNullOrWhiteSpace(convertType))
                {
                    convertType = data.Markdown.DefaultImageFormatExtension;
                    imageFormatType = data.Markdown.DefaultImageFormat;
                }
                else
                {
                    try
                    {
                        imageFormatType = ImageConversion.GetImageFormat(convertType.ToLower());
                    }
                    catch (Exception)
                    {
                        return EMErrorElement.Create(
                            doc,
                            origin,
                            parent,
                            data,
                            "UnsupportedImageFileTypeConversion",
                            Markdown.Unescape(url),
                            convertType.ToLower());
                    }
                }
            }
            else
            {
                //set width and height to zero indicating to converter that we want to use the images values
                widthIntConverted = 0;
                heightIntConverted = 0;

                //set conversion type to itself, but do check it is a supported image type.
                convertType =
                    Regex.Match(Markdown.Unescape(url), @"\.(png|gif|tga|bmp|jpg)", RegexOptions.IgnoreCase).Groups[1].Value;

                try
                {
                    imageFormatType = ImageConversion.GetImageFormat(convertType.ToLower());
                }
                catch (Exception)
                {
                    return EMErrorElement.Create(
                        doc,
                        origin,
                        parent,
                        data,
                        "UnsupportedImageFileTypeConversion",
                        Markdown.Unescape(url),
                        convertType.ToLower());
                }

                quality = 100;
                fillColor = data.Markdown.DefaultImageFillColor;
            }

            if (!String.IsNullOrWhiteSpace(convertType))
            {
                try
                {
                    var path = new EMLocalFilePath(Markdown.Unescape(url), doc, data,
                        fileName => System.IO.Path.GetFileNameWithoutExtension(fileName) + "." + ImageConversion.GetImageExt(imageFormatType));

                    if (!path.IsImage)
                    {
                        throw new EMPathVerificationException(Language.Message("GivenPathIsNotAnImage", url));
                    }

                    data.ImageDetails.Add(
                        new ImageConversion(
                            path.GetSource(),
                            path.GetAbsolutePath(data),
                            widthIntConverted,
                            heightIntConverted,
                            doConvert,
                            imageFormatType,
                            fillColor,
                            quality));

                    return new EMImage(doc, origin, parent, path, title, alt, options);
                }
                catch (EMPathVerificationException e)
                {
                    return new EMErrorElement(doc, origin, parent, e.AddToErrorList(data, origin.Text));
                }
            }

            throw new InvalidOperationException("Should not happen!");
        }
Пример #50
0
 private EMErrorElement(EMDocument doc, EMElementOrigin origin, EMElement parent, EMReadingMessage error, TransformationData data)
     : base(doc, origin, parent)
 {
     AddMessage(error, data);
 }
        private static EMElement CreateItem(EMListType type, EMDocument doc, Match match, EMElementOrigin origin, EMElement parent, TransformationData data)
        {
            var itemGroup = match.Groups[4];

            var item = new EMListItem(doc, origin, parent, type);

            // adding offset to text map
            item.Elements.TextMap.ApplyChanges(new List <PreprocessingTextChange>()
            {
                new PreprocessingTextChange(0, itemGroup.Index - match.Index, 0)
            });

            item.Elements.Parse(0, Markdown.Outdent(itemGroup.Value, item.Elements.TextMap), data);

            return(item);
        }
Пример #52
0
 private EMListItem(EMDocument doc, EMElementOrigin origin, EMElement parent, EMListType type)
     : base(doc, origin, parent, 0, origin.Length)
 {
 }
Пример #53
0
        private static EMElement CreateTOCInline(
            Match match, EMDocument doc, EMElementOrigin origin, EMElement parent, TransformationData data)
        {
            var start = 0;
            var end = 0;
            
            SpacePattern.Split(match.Groups["params"].Value).ToList().ForEach(
                param =>
                    {
                        if (string.IsNullOrWhiteSpace(param))
                        {
                            return;
                        }

                        var parts = param.Split(':');
                        var name = parts[0];
                        var value = int.Parse(parts[1]);

                        switch (name)
                        {
                            case "start":
                                start = value;
                                break;
                            case "end":
                                end = value;
                                break;
                        }
                    });

            var path = match.Groups["path"].Value;
            ClosestFileStatus status;
            var linkedDoc = data.ProcessedDocumentCache.GetClosest(path, out status);

            if (status == ClosestFileStatus.FileMissing)
            {
                return EMErrorElement.Create(doc, origin, parent, data, "BadIncludeOrMissingMarkdownFile", path);
            }

            if (status == ClosestFileStatus.ChangedToIntVersion || status == ClosestFileStatus.ExactMatch)
            {
                EMElement output = new EMTOCInline(doc, origin, parent, start, end, linkedDoc, path);

                if (status == ClosestFileStatus.ChangedToIntVersion)
                {
                    output.AddMessage(new EMReadingMessage(MessageClass.Info, "BadIncludeOrMissingMarkdownFileINTUsed", path), data);
                }

                return output;
            }

            // should never happen!
            throw new InvalidOperationException("Bad linking file status.");
        }
 private EMListItem(EMDocument doc, EMElementOrigin origin, EMElement parent, EMListType type)
     : base(doc, origin, parent, 0, origin.Length)
 {
 }
Пример #55
0
 private EMBlockQuotes(EMDocument doc, EMElementOrigin origin, EMElement parent)
     : base(doc, origin, parent, 0, origin.Length)
 {
 }
Пример #56
0
 public EMFormattedText(EMDocument doc, EMElementOrigin origin, EMElement parent)
     : base(doc, origin, parent)
 {
 }
Пример #57
0
 private EMRelativeLink(EMDocument doc, EMElementOrigin origin, EMElement parent, EMPathProvider path)
     : base(doc, origin, parent)
 {
     this.path = path;
 }
Пример #58
0
 public EMRawHTML(EMDocument doc, EMElementOrigin origin, EMElement parent, string name, string attributesString)
     : base(doc, origin, parent, 0, origin.Length)
 {
     this.name = name;
     this.attributesString = attributesString;
 }
Пример #59
0
        private static EMElement CreateFromReference(Match match, EMDocument doc, EMElementOrigin origin, EMElement parent, TransformationData data)
        {
            var alt = match.Groups[2].Value;


            var linkId = match.Groups[3].Value.ToLowerInvariant();

            // for shortcut links like ![this][].
            if (linkId == "")
            {
                linkId = alt.ToLowerInvariant();
            }

            alt = alt.Replace("\"", "&quot;");

            if (!data.ReferenceLinks.Urls.ContainsKey(linkId))
            {
                return EMErrorElement.Create(doc, origin, parent, data, "MissingImageRef", linkId);
            }

            var url = data.ReferenceLinks.Urls[linkId];

            var imageFormat = data.ReferenceLinks.ReferenceAttributes[linkId];
            
            var width = imageFormat.Width;
            var height = imageFormat.Height;
            var convert = imageFormat.DoCompressImages;
            var convertType = imageFormat.ConvertImageFormat;
            var convertQuality = imageFormat.ImageQuality;
            var hexFillColor = imageFormat.ImageFill;

            var options = data.ReferenceLinks.ImageAlignment.ContainsKey(linkId)
                              ? data.ReferenceLinks.ImageAlignment[linkId]
                              : new ImageOptions();

            var title = data.ReferenceLinks.Titles.ContainsKey(linkId)
                            ? Markdown.EscapeBoldItalic(data.ReferenceLinks.Titles[linkId])
                            : null;

            return Create(
                data, doc, origin, parent, url, alt, title, convert, width,
                height, convertQuality, hexFillColor, convertType, options);
        }