Esempio n. 1
0
        private static bool AddInternalLink(
            DocumentDefBuilder docBuilder,
            ParsingContext context,
            InternalLinkIdBuilder linkIdBuilder,
            StringBuilder internalLinkDescription)
        {
            Contract.Requires(docBuilder != null);
            Contract.Requires(context != null);
            Contract.Requires(linkIdBuilder != null);

            InternalLinkId linkId = linkIdBuilder.Build(context);

            if (linkId == null)
            {
                return(false);
            }

            string description = null;

            if (internalLinkDescription != null)
            {
                description = internalLinkDescription.ToString().Trim();
                if (description.Length == 0)
                {
                    context.ReportError("Internal link ('{0}') has an empty description".Fmt(linkId));
                    return(false);
                }
            }

            InternalLinkElement linkEl = new InternalLinkElement(linkId, description);

            docBuilder.AddToParagraph(linkEl);

            return(true);
        }
Esempio n. 2
0
        private static bool HandleDoubleSquareBracketsCloseTokenInText(
            DocumentDefBuilder docBuilder,
            ParsingContext context,
            ref TextParsingMode parsingMode,
            WikiTextToken token,
            InternalLinkIdBuilder linkIdBuilder,
            StringBuilder internalLinkDescription)
        {
            Contract.Requires(docBuilder != null);
            Contract.Requires(context != null);
            Contract.Requires(token != null);
            Contract.Requires(linkIdBuilder != null);

            if (parsingMode != TextParsingMode.InternalLinkPageName &&
                parsingMode != TextParsingMode.InternalLinkDescription)
            {
                context.ReportError("Token {0} is not allowed here".Fmt(token.Text));
                return(false);
            }

            parsingMode = TextParsingMode.RegularText;
            bool result = AddInternalLink(docBuilder, context, linkIdBuilder, internalLinkDescription);

            linkIdBuilder.Clear();

            if (internalLinkDescription != null)
            {
                internalLinkDescription.Clear();
            }

            return(result);
        }
Esempio n. 3
0
        private static bool HandleNamespaceSeparatorTokenInText(
            ParsingContext context, TextParsingMode parsingMode, InternalLinkIdBuilder linkIdBuilder, WikiTextToken token)
        {
            Contract.Requires(context != null);
            Contract.Requires(linkIdBuilder != null);
            Contract.Requires(token != null);

            if (parsingMode != TextParsingMode.InternalLinkPageName)
            {
                context.ReportError("Token {0} is not allowed here".Fmt(token.Text));
                return(false);
            }

            linkIdBuilder.AddSeparator();

            return(true);
        }
Esempio n. 4
0
        private static bool HandleTextTokenInText(
            DocumentDefBuilder docBuilder,
            TextParsingMode parsingMode,
            WikiTextToken token,
            bool isFirstElementOfContinuedLine,
            InternalLinkIdBuilder linkIdBuilder,
            ref StringBuilder textBuilder)
        {
            Contract.Requires(docBuilder != null);
            Contract.Requires(token != null);
            Contract.Requires(linkIdBuilder != null);

            switch (parsingMode)
            {
            case TextParsingMode.RegularText:
                docBuilder.AddTextToParagraph(token.Text, isFirstElementOfContinuedLine);
                return(true);

            case TextParsingMode.InternalLinkPageName:
                linkIdBuilder.AppendText(token.Text);
                return(true);

            case TextParsingMode.InternalLinkDescription:
                if (textBuilder == null)
                {
                    textBuilder = new StringBuilder();
                }
                textBuilder.Append(token.Text);
                return(true);

            case TextParsingMode.ExternalLinkDescription:
                if (textBuilder == null)
                {
                    textBuilder = new StringBuilder();
                }
                textBuilder.Append(token.Text);
                return(true);

            default:
                throw new NotImplementedException("todo next:");
            }
        }
Esempio n. 5
0
        private static void HandleText(
            DocumentDefBuilder docBuilder,
            ParsingContext context,
            TokenBuffer tokenBuffer)
        {
            Contract.Requires(docBuilder != null);
            Contract.Requires(context != null);
            Contract.Requires(tokenBuffer != null);

            TextParsingMode       parsingMode         = TextParsingMode.RegularText;
            InternalLinkIdBuilder internalLinkBuilder = new InternalLinkIdBuilder();
            StringBuilder         textBuilder         = null;
            Uri  externalLinkUrl = null;
            bool isFirstTextElementOfContinuedLine = true;

            bool processingSuccessful = tokenBuffer.ProcessUntilEnd(
                t =>
            {
                bool flagCopy = isFirstTextElementOfContinuedLine;

                switch (t.Type)
                {
                case WikiTextToken.TokenType.BulletList:
                    return(HandleBulletListTokenInText(docBuilder, t));

                case WikiTextToken.TokenType.NumberedList:
                    return(HandleNumberedListTokenInText(docBuilder, t));

                case WikiTextToken.TokenType.Indent:
                    return(HandleIndentTokenInText(docBuilder, t));

                case WikiTextToken.TokenType.Text:
                    {
                        isFirstTextElementOfContinuedLine = false;
                        return(HandleTextTokenInText(
                                   docBuilder, parsingMode, t, flagCopy, internalLinkBuilder, ref textBuilder));
                    }

                case WikiTextToken.TokenType.TripleApostrophe:
                    return(HandleTripleApostropheTokenInText(docBuilder));

                case WikiTextToken.TokenType.DoubleApostrophe:
                    return(HandleDoubleApostropheTokenInText(docBuilder));

                case WikiTextToken.TokenType.DoubleSquareBracketsOpen:
                    return(HandleDoubleSquareBracketsOpenTokenInText(context, t, ref parsingMode));

                case WikiTextToken.TokenType.NamespaceSeparator:
                    return(HandleNamespaceSeparatorTokenInText(context, parsingMode, internalLinkBuilder, t));

                case WikiTextToken.TokenType.Pipe:
                    return(HandlePipeTokenInText(context, t, ref parsingMode));

                case WikiTextToken.TokenType.DoubleSquareBracketsClose:
                    return(HandleDoubleSquareBracketsCloseTokenInText(
                               docBuilder,
                               context,
                               ref parsingMode,
                               t,
                               internalLinkBuilder,
                               textBuilder));

                case WikiTextToken.TokenType.SingleSquareBracketsOpen:
                    return(HandleSingleSquareBracketsOpenTokenInText(context, t, ref parsingMode));

                case WikiTextToken.TokenType.ExternalLinkUrlLeadingSpace:
                    return(HandleExternalLinkUrlLeadingSpaceTokenInText(context, t, parsingMode));

                case WikiTextToken.TokenType.ExternalLinkUrl:
                    return(HandleExternalLinkUrlTokenInText(context, t, ref parsingMode, ref externalLinkUrl));

                case WikiTextToken.TokenType.SingleSquareBracketsClose:
                    return(HandleSingleSquareBracketsCloseTokenInText(
                               docBuilder,
                               context,
                               ref parsingMode,
                               t,
                               externalLinkUrl,
                               textBuilder));

                default:
                    throw new NotImplementedException("todo next: {0}".Fmt(t.Type));
                }
            });

            if (processingSuccessful)
            {
                switch (parsingMode)
                {
                case TextParsingMode.InternalLinkPageName:
                case TextParsingMode.InternalLinkDescription:
                    context.ReportError("Missing token ']]'");
                    break;

                case TextParsingMode.ExternalLinkUrl:
                case TextParsingMode.ExternalLinkDescription:
                    context.ReportError("Missing token ']'");
                    break;
                }
            }
        }