Esempio n. 1
0
        }     //method

        //Called at the start of each line
        private void CheckTableStatus(Token token)
        {
            var  wikiTerm   = token.Terminal as WikiTerminalBase;
            bool isTableTag = wikiTerm != null && wikiTerm.TermType == WikiTermType.Table;

            if (!_insideTable && !isTableTag)
            {
                return;
            }
            _insideCell   = false; //if we are at line start, drop this flag
            _lastTableTag = null;
            //New table begins
            if (!_insideTable && isTableTag)
            {
                _output.AppendLine("<table border=1>");
                _output.Append("<tr>");
                _insideTable = true;
                return;
            }
            //existing table continues
            if (_insideTable && isTableTag)
            {
                _output.AppendLine("</tr>");
                _output.Append("<tr>");
                return;
            }
            //existing table ends
            if (_insideTable && !isTableTag)
            {
                _output.AppendLine("</tr>");
                _output.AppendLine("</table>");
                _insideTable = false;
                return;
            }
        } //method
Esempio n. 2
0
        }//method

        private void ProcessWikiToken(Token token)
        {
            //we check that token actually contains some chars - to allow "invisible spaces" after last table tag
            if (_lastTableTag != null && !_insideCell && token.ValueString.Trim().Length > 0)
            {
                _output.Append(_lastTableTag.OpenHtmlTag);
                _insideCell = true;
            }
            var wikiTerm = token.Terminal as WikiTerminalBase;

            switch (wikiTerm.TermType)
            {
            case WikiTermType.Element:
                _output.Append(wikiTerm.OpenHtmlTag);
                _output.Append(wikiTerm.CloseHtmlTag);
                break;

            case WikiTermType.Format:
                ProcessFormatTag(token);
                break;

            case WikiTermType.Heading:
            case WikiTermType.List:
                _output.Append(wikiTerm.OpenHtmlTag);
                _currentHeader = wikiTerm;
                break;

            case WikiTermType.Block:
                ProcessWikiBlockTag(token);
                break;

            case WikiTermType.Text:
                _output.Append(HtmlEncode(token.ValueString));
                break;

            case WikiTermType.Table:
                if (_insideCell)
                {
                    _output.Append(_lastTableTag.CloseHtmlTag); //write out </td> or </th>
                }
                //We do not write opening tag immediately: we need to know if it is the last table tag on the line.
                // if yes, we don't write it at all; _lastTableTag will be cleared when we start new line
                _lastTableTag = wikiTerm as WikiTagTerminal;
                _insideCell   = false;
                break;
            }
        }
Esempio n. 3
0
        public WikiCodeplexGrammar()
        {
            this.GrammarComments =
                @"A grammar for reading codeplex wiki files and transforming them into HTML 
http://codeplex.codeplex.com/wikipage?title=Wiki%20Formatting
http://wikiplex.codeplex.com
";
            //Terminals
            var text = new WikiTextTerminal("text");
            //Quote-like terminals
            var bold      = new WikiTagTerminal("bold", WikiTermType.Format, "*", "b");
            var italic    = new WikiTagTerminal("italic", WikiTermType.Format, "_", "i");
            var underline = new WikiTagTerminal("underline", WikiTermType.Format, "+", "u");
            var strike    = new WikiTagTerminal("strike", WikiTermType.Format, "~~", "del");
            var super     = new WikiTagTerminal("super", WikiTermType.Format, "^^", "sup");
            var sub       = new WikiTagTerminal("sub", WikiTermType.Format, ",,", "sub");

            //Headings
            var h1 = new WikiTagTerminal("h1", WikiTermType.Heading, "!", "h1");
            var h2 = new WikiTagTerminal("h2", WikiTermType.Heading, "!!", "h2");
            var h3 = new WikiTagTerminal("h3", WikiTermType.Heading, "!!!", "h3");
            var h4 = new WikiTagTerminal("h4", WikiTermType.Heading, "!!!!", "h4");
            var h5 = new WikiTagTerminal("h5", WikiTermType.Heading, "!!!!!", "h5");
            var h6 = new WikiTagTerminal("h6", WikiTermType.Heading, "!!!!!!", "h6");

            //Ruler
            var ruler = new WikiTagTerminal("ruler", WikiTermType.Heading, "----", "hr");

            //Bulletted lists
            var bl1 = new WikiTagTerminal("bl1", WikiTermType.List, "*", "li")
            {
                ContainerHtmlElementName = "ul"
            };
            var bl2 = new WikiTagTerminal("bl2", WikiTermType.List, "**", "li")
            {
                ContainerHtmlElementName = "ul"
            };
            var bl3 = new WikiTagTerminal("bl3", WikiTermType.List, "***", "li")
            {
                ContainerHtmlElementName = "ul"
            };

            //Numbered lists
            var nl1 = new WikiTagTerminal("nl1", WikiTermType.List, "#", "li")
            {
                ContainerHtmlElementName = "ol"
            };
            var nl2 = new WikiTagTerminal("nl2", WikiTermType.List, "##", "li")
            {
                ContainerHtmlElementName = "ol"
            };
            var nl3 = new WikiTagTerminal("nl3", WikiTermType.List, "###", "li")
            {
                ContainerHtmlElementName = "ol"
            };

            //Block tags
            var codeBlock    = new WikiBlockTerminal("codeBlock", WikiBlockType.CodeBlock, "{{", "}}", "pre");
            var escapedBlock = new WikiBlockTerminal("escapedBlock", WikiBlockType.EscapedText, "{\"", "\"}", "pre");
            var anchor       = new WikiBlockTerminal("anchor", WikiBlockType.Anchor, "{anchor:", "}", string.Empty);

            //Links
            var linkToAnchor = new WikiBlockTerminal("linkToAnchor", WikiBlockType.LinkToAnchor, "[#", "]", string.Empty);
            var url          = new WikiBlockTerminal("url", WikiBlockType.Url, "[url:", "]", string.Empty);
            var fileLink     = new WikiBlockTerminal("fileLink", WikiBlockType.FileLink, "[file:", "]", string.Empty);
            var image        = new WikiBlockTerminal("image", WikiBlockType.Image, "[image:", "]", string.Empty);

            //Tables
            var tableHeading = new WikiTagTerminal("tableHeading", WikiTermType.Table, "||", "th");
            var tableRow     = new WikiTagTerminal("tableRow", WikiTermType.Table, "|", "td");

            //Alignment, indents
            var leftAlignStart = new WikiTagTerminal("leftAlignStart", WikiTermType.Format, "<{", string.Empty)
            {
                OpenHtmlTag = "<div style=\"text-align:left;float:left;\">"
            };
            var leftAlignEnd = new WikiTagTerminal("leftAlignEnd", WikiTermType.Format, "}<", string.Empty)
            {
                OpenHtmlTag = "</div>"
            };
            var rightAlignStart = new WikiTagTerminal("rightAlignStart", WikiTermType.Format, ">{", string.Empty)
            {
                OpenHtmlTag = "<div style=\"text-align:right;float:right;\">"
            };
            var rightAlignEnd = new WikiTagTerminal("rightAlignEnd", WikiTermType.Format, "}>", string.Empty)
            {
                OpenHtmlTag = "</div>"
            };
            var indentOne = new WikiTagTerminal("indentOne", WikiTermType.Heading, ":", string.Empty)
            {
                OpenHtmlTag = "<blockquote>", CloseHtmlTag = "</blockquote>"
            };
            var indentTwo = new WikiTagTerminal("indentTwo", WikiTermType.Heading, "::", string.Empty)
            {
                OpenHtmlTag = "<blockquote><blockquote>", CloseHtmlTag = "</blockquote></blockquote>"
            };

            //Non-terminals
            var wikiElement = new NonTerminal("wikiElement");
            var wikiText    = new NonTerminal("wikiText");

            //Rules
            wikiElement.Rule = text | bold | italic | strike | underline | super | sub
                               | h1 | h2 | h3 | h4 | h5 | h6 | ruler
                               | bl1 | bl2 | bl3
                               | nl1 | nl2 | nl3
                               | codeBlock | escapedBlock | anchor
                               | linkToAnchor | url | fileLink | image
                               | tableHeading | tableRow
                               | leftAlignStart | leftAlignEnd | rightAlignStart | rightAlignEnd | indentOne | indentTwo
                               | NewLine;
            wikiText.Rule = MakeStarRule(wikiText, wikiElement);

            this.Root            = wikiText;
            this.WhitespaceChars = string.Empty;
            MarkTransient(wikiElement);
            //We need to clear punctuation flag on NewLine, so it is not removed from parse tree
            NewLine.SetFlag(TermFlags.IsPunctuation, false);
            this.LanguageFlags |= LanguageFlags.DisableScannerParserLink | LanguageFlags.NewLineBeforeEOF | LanguageFlags.CanRunSample;
        }
Esempio n. 4
0
        public WikiCreoleGrammar()
        {
            this.GrammarComments =
                @"A grammar for parsing Creole wiki files and transforming them into HTML 
http://www.wikicreole.org/";
            //Terminals
            var text = new WikiTextTerminal("text")
            {
                EscapeChar = '~'
            };
            var lineBreak = new WikiTagTerminal("lineBreak", WikiTermType.Element, @"\\", string.Empty)
            {
                OpenHtmlTag = "<br/>\n"
            };
            //Quote-like terminals
            var bold   = new WikiTagTerminal("bold", WikiTermType.Format, "**", "strong");
            var italic = new WikiTagTerminal("italic", WikiTermType.Format, "//", "em");

            //Headings
            var h1 = new WikiBlockTerminal("h1", WikiBlockType.EscapedText, "=", "\n", "h1");
            var h2 = new WikiBlockTerminal("h2", WikiBlockType.EscapedText, "==", "\n", "h2");
            var h3 = new WikiBlockTerminal("h3", WikiBlockType.EscapedText, "===", "\n", "h3");
            var h4 = new WikiBlockTerminal("h4", WikiBlockType.EscapedText, "====", "\n", "h4");
            var h5 = new WikiBlockTerminal("h5", WikiBlockType.EscapedText, "=====", "\n", "h5");
            var h6 = new WikiBlockTerminal("h6", WikiBlockType.EscapedText, "======", "\n", "h6");

            //Bulletted lists
            var bl1 = new WikiTagTerminal("bl1", WikiTermType.List, "*", "li")
            {
                ContainerHtmlElementName = "ul"
            };
            var bl2 = new WikiTagTerminal("bl2", WikiTermType.List, "**", "li")
            {
                ContainerHtmlElementName = "ul"
            };
            var bl3 = new WikiTagTerminal("bl3", WikiTermType.List, "***", "li")
            {
                ContainerHtmlElementName = "ul"
            };

            //Numbered lists
            var nl1 = new WikiTagTerminal("nl1", WikiTermType.List, "#", "li")
            {
                ContainerHtmlElementName = "ol"
            };
            var nl2 = new WikiTagTerminal("nl2", WikiTermType.List, "##", "li")
            {
                ContainerHtmlElementName = "ol"
            };
            var nl3 = new WikiTagTerminal("nl3", WikiTermType.List, "###", "li")
            {
                ContainerHtmlElementName = "ol"
            };

            //Ruler
            var ruler = new WikiTagTerminal("ruler", WikiTermType.Heading, "----", "hr");

            //Image
            var image = new WikiBlockTerminal("image", WikiBlockType.Image, "{{", "}}", string.Empty);

            //Link
            var link = new WikiBlockTerminal("link", WikiBlockType.Url, "[[", "]]", string.Empty);

            //Tables
            var tableHeading = new WikiTagTerminal("tableHeading", WikiTermType.Table, "|=", "th");
            var tableRow     = new WikiTagTerminal("tableRow", WikiTermType.Table, "|", "td");

            //Block tags
            //TODO: implement full rules for one-line and multi-line nowiki element
            var nowiki = new WikiBlockTerminal("nowiki", WikiBlockType.EscapedText, "{{{", "}}}", "pre");

            //Paragraph - not used in rules but added by postprocessing
            //_paragraph = new WikiTagTerminal("para", WikiTermType.
            //Non-terminals
            var wikiElement = new NonTerminal("wikiElement");
            var wikiText    = new NonTerminal("wikiText");

            //Rules
            wikiElement.Rule = text | lineBreak | bold | italic
                               | h1 | h2 | h3 | h4 | h5 | h6
                               | bl1 | bl2 | bl3
                               | nl1 | nl2 | nl3
                               | ruler | image | nowiki | link
                               | tableHeading | tableRow
                               | NewLine;
            wikiText.Rule = MakeStarRule(wikiText, wikiElement);

            this.Root = wikiText;
            MarkTransient(wikiElement);
            //We need to clear punctuation flag on NewLine, so it is not removed from parse tree
            NewLine.SetFlag(TermFlags.IsPunctuation, false);
            this.LanguageFlags |= LanguageFlags.DisableScannerParserLink | LanguageFlags.NewLineBeforeEOF;
        }