lyx_mirror/src/texstream.h

194 lines
4.5 KiB
C
Raw Normal View History

// -*- C++ -*-
/**
* \file texstream.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Enrico Forestieri
*
* Full author contact details are available in file CREDITS.
*/
#ifndef LYX_TEXSTREAM_H
#define LYX_TEXSTREAM_H
#include "support/docstream.h"
#include "support/unique_ptr.h"
namespace lyx {
class TexRow;
struct TexString;
/** Wrapper class for odocstream.
This class is used to automatically count the lines of the exported latex
code.
*/
class otexrowstream {
public:
///
explicit otexrowstream(odocstream & os);
/// defaulted
~otexrowstream();
///
odocstream & os() { return os_; }
///
TexRow & texrow() { return *texrow_; }
///
2016-07-04 02:43:22 +00:00
unique_ptr<TexRow> releaseTexRow();
///
void put(char_type const & c);
///
void append(TexString ts);
private:
///
odocstream & os_;
///
unique_ptr<TexRow> texrow_;
};
///
otexrowstream & operator<<(otexrowstream &, odocstream_manip);
///
otexrowstream & operator<<(otexrowstream &, TexString);
///
otexrowstream & operator<<(otexrowstream &, docstring const &);
///
otexrowstream & operator<<(otexrowstream &, std::string const &);
///
otexrowstream & operator<<(otexrowstream &, char const *);
///
otexrowstream & operator<<(otexrowstream &, char);
///
template <typename Type>
otexrowstream & operator<<(otexrowstream & ots, Type value);
/** Subclass for otexrowstream.
This class is used to ensure that no blank lines may be inadvertently output.
To this end, use the special variables "breakln" and "safebreakln" as if
they were iomanip's to ensure that the next output will start at the
beginning of a line. Using "breakln", a '\n' char will be output if needed,
while using "safebreakln", "%\n" will be output if needed.
The class also records the last output character and can tell whether
a paragraph break was just output.
*/
class otexstream : public otexrowstream {
public:
///
explicit otexstream(odocstream & os)
: otexrowstream(os), canbreakline_(false),
protectspace_(false), terminate_command_(false),
parbreak_(true), blankline_(true), lastchar_(0) {}
///
void put(char_type const & c);
///
void append(TexString ts);
///
void canBreakLine(bool breakline) { canbreakline_ = breakline; }
///
bool canBreakLine() const { return canbreakline_; }
///
void protectSpace(bool protectspace) { protectspace_ = protectspace; }
///
bool protectSpace() const { return protectspace_; }
///
void terminateCommand(bool terminate) { terminate_command_ = terminate; }
///
bool terminateCommand() const { return terminate_command_; }
///
void lastChar(char_type const & c)
{
parbreak_ = (!canbreakline_ && c == '\n');
blankline_ = ((!canbreakline_ && c == ' ') || c == '\n');
canbreakline_ = (c != '\n');
lastchar_ = c;
}
///
char_type lastChar() const { return lastchar_; }
///
bool afterParbreak() const { return parbreak_; }
///
bool blankLine() const { return blankline_; }
private:
///
bool canbreakline_;
///
bool protectspace_;
///
bool terminate_command_;
///
bool parbreak_;
///
bool blankline_;
///
char_type lastchar_;
};
/// because we need to pass ods_ to the base class
struct otexstringstream_helper { odocstringstream ods_; };
/// otexstringstream : a odocstringstream with tex/row correspondence
class otexstringstream : otexstringstream_helper, public otexstream {
public:
otexstringstream() : otexstringstream_helper(), otexstream(ods_) {}
///
docstring str() const { return ods_.str(); }
///
size_t length();
///
bool empty() { return 0 == length(); }
/// move-returns the contents and reset the texstream
TexString release();
};
/// Helper structs for breaking a line
struct BreakLine {
char n;
};
struct SafeBreakLine {
char n;
};
/// Helper structs for terminating a command
struct TerminateCommand {
char n;
};
extern BreakLine breakln;
extern SafeBreakLine safebreakln;
extern TerminateCommand termcmd;
///
otexstream & operator<<(otexstream &, BreakLine);
///
otexstream & operator<<(otexstream &, SafeBreakLine);
///
otexstream & operator<<(otexstream &, TerminateCommand);
///
otexstream & operator<<(otexstream &, odocstream_manip);
///
otexstream & operator<<(otexstream &, TexString);
///
otexstream & operator<<(otexstream &, docstring const &);
///
otexstream & operator<<(otexstream &, std::string const &);
///
otexstream & operator<<(otexstream &, char const *);
///
otexstream & operator<<(otexstream &, char);
///
template <typename Type>
otexstream & operator<<(otexstream & ots, Type value);
Bulk cleanup/fix incorrect annotation at the end of namespaces. This commit does a bulk fix of incorrect annotations (comments) at the end of namespaces. The commit was generated by initially running clang-format, and then from the diff of the result extracting the hunks corresponding to fixes of namespace comments. The changes being applied and all the results have been manually reviewed. The source code successfully builds on macOS. Further details on the steps below, in case they're of interest to someone else in the future. 1. Checkout a fresh and up to date version of src/ git pull && git checkout -- src && git status src 2. Ensure there's a suitable .clang-format in place, i.e. with options to fix the comment at the end of namespaces, including: FixNamespaceComments: true SpacesBeforeTrailingComments: 1 and that clang-format is >= 5.0.0, by doing e.g.: clang-format -dump-config | grep Comments: clang-format --version 3. Apply clang-format to the source: clang-format -i $(find src -name "*.cpp" -or -name "*.h") 4. Create and filter out hunks related to fixing the namespace git diff -U0 src > tmp.patch grepdiff '^} // namespace' --output-matching=hunk tmp.patch > fix_namespace.patch 5. Filter out hunks corresponding to simple fixes into to a separate patch: pcregrep -M -e '^diff[^\n]+\nindex[^\n]+\n--- [^\n]+\n\+\+\+ [^\n]+\n' \ -e '^@@ -[0-9]+ \+[0-9]+ @@[^\n]*\n-\}[^\n]*\n\+\}[^\n]*\n' \ fix_namespace.patch > fix_namespace_simple.patch 6. Manually review the simple patch and then apply it, after first restoring the source. git checkout -- src patch -p1 < fix_namespace_simple.path 7. Manually review the (simple) changes and then stage the changes git diff src git add src 8. Again apply clang-format and filter out hunks related to any remaining fixes to the namespace, this time filter with more context. There will be fewer hunks as all the simple cases have already been handled: clang-format -i $(find src -name "*.cpp" -or -name "*.h") git diff src > tmp.patch grepdiff '^} // namespace' --output-matching=hunk tmp.patch > fix_namespace2.patch 9. Manually review/edit the resulting patch file to remove hunks for files which need to be dealt with manually, noting the file names and line numbers. Then restore files to as before applying clang-format and apply the patch: git checkout src patch -p1 < fix_namespace2.patch 10. Manually fix the files noted in the previous step. Stage files, review changes and commit.
2017-07-23 11:11:54 +00:00
} // namespace lyx
#endif