예제 #1
0
        // Parse an autolink or HTML tag.
        // Assumes the subject has a '<' character at the current position.
        static Inline handle_pointy_brace(Subject subj)
        {
            int    matchlen;
            string contents;

            // advance past first <
            subj.Position++;

            // first try to match a URL autolink
            matchlen = Scanner.scan_autolink_uri(subj.Buffer, subj.Position, subj.Length);
            if (matchlen > 0)
            {
                contents = subj.Buffer.Substring(subj.Position, matchlen - 1);
                var resultContents = ParseStringEntities(contents);
                var result         = Inline.CreateLink(resultContents, contents, string.Empty);

                result.SourcePosition         = subj.Position - 1;
                resultContents.SourcePosition = subj.Position;
                subj.Position                    += matchlen;
                result.SourceLastPosition         = subj.Position;
                resultContents.SourceLastPosition = subj.Position - 1;

                return(result);
            }

            // next try to match an email autolink
            matchlen = Scanner.scan_autolink_email(subj.Buffer, subj.Position, subj.Length);
            if (matchlen > 0)
            {
                contents = subj.Buffer.Substring(subj.Position, matchlen - 1);
                var resultContents = ParseStringEntities(contents);
                var result         = Inline.CreateLink(resultContents, "mailto:" + contents, string.Empty);

                result.SourcePosition         = subj.Position - 1;
                resultContents.SourcePosition = subj.Position;
                subj.Position                    += matchlen;
                result.SourceLastPosition         = subj.Position;
                resultContents.SourceLastPosition = subj.Position - 1;

                return(result);
            }

            // finally, try to match an html tag
            matchlen = Scanner.scan_html_tag(subj.Buffer, subj.Position, subj.Length);
            if (matchlen > 0)
            {
                var result = new Inline(InlineTag.RawHtml, subj.Buffer, subj.Position - 1, matchlen + 1);
                result.SourcePosition     = subj.Position - 1;
                subj.Position            += matchlen;
                result.SourceLastPosition = subj.Position;
                return(result);
            }
            else
            {
                // if nothing matches, just return the opening <:
                return(new Inline("<", subj.Position - 1, subj.Position));
            }
        }