/*============================================================================
  CMake - Cross Platform Makefile Generator
  Copyright 2000-2013 Kitware, Inc., Insight Software Consortium

  Distributed under the OSI-approved BSD License (the "License");
  see accompanying file Copyright.txt for details.

  This software is distributed WITHOUT ANY WARRANTY; without even the
  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  See the License for more information.
============================================================================*/
#ifndef _cmRST_h
#define _cmRST_h

#include "cmStandardIncludes.h"

#include <cmsys/RegularExpression.hxx>

/** \class cmRST
 * \brief Perform basic .rst processing for command-line help
 *
 * This class implements a subset of reStructuredText and Sphinx
 * document processing.  It is used to print command-line help.
 *
 * If you modify the capabilities of this class, be sure to update
 * the Help/manual/cmake-developer.7.rst documentation and to update
 * the Tests/CMakeLib/testRST.(rst|expect) test input and output.
 */
class cmRST
{
public:
  cmRST(std::ostream& os, std::string const& docroot);
  bool ProcessFile(std::string const& fname, bool isModule = false);

private:
  enum IncludeType
  {
    IncludeNormal,
    IncludeModule,
    IncludeTocTree
  };
  enum MarkupType
  {
    MarkupNone,
    MarkupNormal,
    MarkupEmpty
  };
  enum DirectiveType
  {
    DirectiveNone,
    DirectiveParsedLiteral,
    DirectiveLiteralBlock,
    DirectiveCodeBlock,
    DirectiveReplace,
    DirectiveTocTree
  };

  void ProcessRST(std::istream& is);
  void ProcessModule(std::istream& is);
  void Reset();
  void ProcessLine(std::string const& line);
  void NormalLine(std::string const& line);
  void OutputLine(std::string const& line, bool inlineMarkup);
  std::string ReplaceSubstitutions(std::string const& line);
  void OutputMarkupLines(bool inlineMarkup);
  bool ProcessInclude(std::string file, IncludeType type);
  void ProcessDirectiveParsedLiteral();
  void ProcessDirectiveLiteralBlock();
  void ProcessDirectiveCodeBlock();
  void ProcessDirectiveReplace();
  void ProcessDirectiveTocTree();
  static void UnindentLines(std::vector<std::string>& lines);

  std::ostream& OS;
  std::string DocRoot;
  int IncludeDepth;
  bool OutputLinePending;
  bool LastLineEndedInColonColon;
  MarkupType Markup;
  DirectiveType Directive;
  cmsys::RegularExpression CMakeDirective;
  cmsys::RegularExpression CMakeModuleDirective;
  cmsys::RegularExpression ParsedLiteralDirective;
  cmsys::RegularExpression CodeBlockDirective;
  cmsys::RegularExpression ReplaceDirective;
  cmsys::RegularExpression IncludeDirective;
  cmsys::RegularExpression TocTreeDirective;
  cmsys::RegularExpression ProductionListDirective;
  cmsys::RegularExpression NoteDirective;
  cmsys::RegularExpression ModuleRST;
  cmsys::RegularExpression CMakeRole;
  cmsys::RegularExpression Substitution;
  cmsys::RegularExpression TocTreeLink;

  std::vector<std::string> MarkupLines;
  std::string DocDir;
  std::map<std::string, std::string> Replace;
  std::set<std::string> Replaced;
  std::string ReplaceName;
};

#endif
