/*************************************************************************** PreFormatter.cpp - description ------------------- begin : Mo Jan 03 2005 copyright : (C) 2005-2008 by Andre Simon email : andre.simon1@gmx.de ***************************************************************************/ /* This file is part of Highlight. Highlight is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Highlight is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Highlight. If not, see . */ #ifndef PreFormatter_H #define PreFormatter_H #include #include namespace highlight { /** \brief Class which provides intelligent line wrapping. * @author Andre Simon */ class PreFormatter { public: PreFormatter(); ~PreFormatter(); /** Set wrapping mode \param wrap set to true if long lines should be wrapped */ void setWrap ( bool wrap ) {wrapLines = wrap;} /** Replace tabs by spaces \param replTabs set to true if tabs should be replaced by spaces */ void setReplaceTabs ( bool replTabs ) {replaceTabs = replTabs;} /** \return True if current line can be wrapped again */ bool hasMoreLines(); /** Sets new line to be wrapped \param newline New line */ void setLine ( const std::string & newline ); /** The method will indent function calls and statements \return Next line */ std::string getNextLine(); /** \return True if lines following open braces should be indented */ bool indentCode(); /** Maximum line length \param maxlength max. length of output lines */ void setWrapLineLength ( unsigned int maxlength ); /** Indentation mode \param indentAfterOpenBraces set true if lines should be indented after braces */ void setWrapIndentBraces ( bool indentAfterOpenBraces=true ); /** Number of spaces \param num number of spaces which replace a tab */ void setNumberSpaces ( unsigned int num ); /** \return true if preformatting is enabled */ bool isEnabled() { return wrapLines || replaceTabs; } /** reset preformatting state to use the object with new input data */ void reset () { lineNumber=0; wrappedLines.clear(); } /** \param lineNumber line number \return true if input line linenumber was wrapped */ bool isWrappedLine ( int lineNumber ) { return wrappedLines.count ( lineNumber ); } private: unsigned int maxLineLength; std::string line, wsPrefix; unsigned int index; unsigned int numberSpaces; unsigned int lineNumber; size_t wsPrefixLength; bool hasMore, indentAfterOpenBraces; bool redefineWsPrefix; bool wrapLines, replaceTabs; std::set wrappedLines; static const std::string LB_CHARS; static const std::string WS_CHARS; static const std::string INDENT_MARKERS; }; } #endif