grammar ExtractFulltext; /* * Das primäre Ziel der weiteren Verarbeitung des Markdown-Inhalts besteht in der Extraktion von Volltext * für dessen Indexierung und der entsprechenden Herstellung der Auffindbarkeit. Hierfür sind die Inhalte * insbesondere um Markdown-Syntax zu bereinigen. Wichtig ist weiterhin beispielsweise, inhaltlich * irrelevante bzw. falsche Zeilenumbrüche zu entfernen, um eine Phrasensuche zu begünstigen * */ // -------------------------------------- // Syntaktische Regeln // -------------------------------------- // Syntaktisch besteht das Dokument aus Überschriften und Textblöcken document : (heading | text)+; // Die Textregel fasst die erlaubten lexikalischen Elemente für Inhalte zusammen text : (TEXT | ASTERISK | NL | OPENQUOTE | WS | CODEBLOCK_CONTENT | CODEBLOCK_CLOSE | CODEINLINE_CONTENT | CLOSETAG)+; // Inhalte von Überschriften werden durch einen Lexer MODE abgebildet und werden dadurch durch // andere lexikalische Elemente repräsentiert, als die Textregel heading : HEADING_CONTENT HEADING_CLOSE; // -------------------------------------- // Lexikalische Regeln // -------------------------------------- // Überschriften werden durch #-Zeichen in einer neuen Zeile angezeigt // Die Regel erkennt solche Überschriften, verweist auf den HEADING Mode und // verwirft die \n# Token, da diese inhaltlich irrelevant sind HEADING_OPEN : '\n#' HEADING_TYPE? { setText("\n\n"); } -> skip, pushMode(HEADING); // Inline-Code und Code-Blöcke erlauben viele Zeichen, die in normalen Inhaltsbereichen // nicht zulässig sind. Es wird in entsprechende Modi verwiesen. Die Symbole zur Kennzeichnung // von Codeblöcken werden verworfen. CODEBLOCK_OPEN : ' ' -> skip, pushMode(CODEBLOCK); CODEINLINE_OPEN : '`' -> skip, pushMode(CODEINLINE); // Bei Blockzitat-Angaben wird das vorangestellte '\n>' verworfen OPENQUOTE : '\n> ' { setText(" "); }; // Reguläre Zeilenumbrüche werden durch ein Leerzeichen ersetzt NL : '\n' { setText(" "); }; // Leerzeichen werden getrennt verarbeitet, da nur so die ' ' vier vorangestellten Leerzeichen // bei Codeblöcken erkannt werden können WS : ' '; // Wenn nicht in Blockzitat-Angabe werden '>' in text Parserregel zusammengefügt CLOSETAG : [>]; // Zu entfernende Zeichen _~[ und ] dienen nur der Präsentation SKIPCHARS : [_~\u005B\u005D] -> skip; // Fettdruck-Angaben werden entfernt SKIPBF : '**' -> skip; // Asterisk-Symbole, die nicht Teil der Fettdruck-Angaben sind, werden in text Parserregel zusammengefügt ASTERISK : '*'; // Alle übrigen Zeichen TEXT : ~[\n>_~* \u005B\u005D`]+; //---------------------------------------------------------------------- //---- Alle Überschriftenebenen //---------------------------------------------------------------------- mode HEADING; HEADING_TYPE : ' ' | '# ' | '## ' | '### ' | '#' | '##' | '###'; HEADING_CONTENT : ~'\n'+; HEADING_CLOSE : '\n' { setText("\n\n"); } -> popMode; //---------------------------------------------------------------------- //---- Blockcode //---------------------------------------------------------------------- mode CODEBLOCK; CODEBLOCK_CONTENT : ~'\n'+?; CODEBLOCK_CLOSE : '\n' -> popMode; //---------------------------------------------------------------------- //---- Inline-code //---------------------------------------------------------------------- mode CODEINLINE; CODEINLINE_CONTENT : ~'`'+?; CODEINLINE_CLOSE : '`' -> skip, popMode;