3 * This source code is part of
7 * GROningen MAchine for Chemical Simulations
9 * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
10 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
11 * Copyright (c) 2001-2009, The GROMACS development team,
12 * check out http://www.gromacs.org for more information.
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License
16 * as published by the Free Software Foundation; either version 2
17 * of the License, or (at your option) any later version.
19 * If you want to redistribute modifications, please consider that
20 * scientific software is very special. Version control is crucial -
21 * bugs must be traceable. We will be happy to consider code for
22 * inclusion in the official distribution, but derived work must not
23 * be called official GROMACS. Details are found in the README & COPYING
24 * files - if they are missing, get the official version at www.gromacs.org.
26 * To help us fund GROMACS development, we humbly ask that you cite
27 * the papers on the package - you can find them in the top README file.
29 * For more info, check our website at http://www.gromacs.org
33 * Implements gmx::CommandLineHelpWriter.
35 * \author Teemu Murtola <teemu.murtola@cbr.su.se>
36 * \ingroup module_commandline
38 #include "cmdlinehelpwriter.h"
42 #include "gromacs/onlinehelp/helpformat.h"
43 #include "gromacs/options/basicoptioninfo.h"
44 #include "gromacs/options/filenameoptioninfo.h"
45 #include "gromacs/options/options.h"
46 #include "gromacs/options/optionsvisitor.h"
47 #include "gromacs/options/timeunitmanager.h"
48 #include "gromacs/selection/selectionfileoptioninfo.h"
49 #include "gromacs/selection/selectionoptioninfo.h"
50 #include "gromacs/utility/file.h"
51 #include "gromacs/utility/format.h"
53 #include "cmdlinehelpwriter-impl.h"
61 /********************************************************************
66 * Helper object for writing section descriptions to help.
68 * \ingroup module_commandline
70 class DescriptionWriter : public OptionsVisitor
73 //! Creates a helper object for writing section descriptions.
74 explicit DescriptionWriter(File *file) : file_(*file) {}
76 virtual void visitSubSection(const Options §ion);
77 virtual void visitOption(const OptionInfo & /*option*/) { }
83 void DescriptionWriter::visitSubSection(const Options §ion)
85 if (!section.description().empty())
87 const std::string &title = section.title();
90 file_.writeLine(title);
93 writeHelpTextForConsole(&file_, section.description());
96 OptionsIterator(section).acceptSubSections(this);
100 /********************************************************************
101 * FileParameterWriter
105 * Helper object for writing help for file parameters.
107 * \ingroup module_commandline
109 class FileParameterWriter : public OptionsTypeVisitor<FileNameOptionInfo>
112 //! Creates a helper object for writing file parameters.
113 explicit FileParameterWriter(File *file);
115 //! Returns true if anything was written out.
116 bool didOutput() const { return formatter_.didOutput(); }
118 virtual void visitSubSection(const Options §ion);
119 virtual void visitOptionType(const FileNameOptionInfo &option);
123 TextTableFormatter formatter_;
126 FileParameterWriter::FileParameterWriter(File *file)
129 formatter_.addColumn("Option", 6, false);
130 formatter_.addColumn("Filename", 12, false);
131 formatter_.addColumn("Type", 12, false);
132 formatter_.addColumn("Description", 45, true);
135 void FileParameterWriter::visitSubSection(const Options §ion)
137 OptionsIterator iterator(section);
138 iterator.acceptSubSections(this);
139 iterator.acceptOptions(this);
142 void FileParameterWriter::visitOptionType(const FileNameOptionInfo &option)
144 int firstShortValue = 0; // The first value after which the type fits.
145 int firstLongValue = -1; // First value that overlaps description column.
146 int lastLongValue = -1; // Last value like the above.
148 // Get the values to write and check where text overflows the columns.
150 std::string name(formatString("-%s", option.name().c_str()));
151 formatter_.addColumnLine(0, name);
152 for (int i = 0; i < option.valueCount() || i == 0; ++i)
155 if (option.valueCount() == 0)
157 value = option.formatDefaultValueIfSet();
161 value = option.formatValue(i);
163 formatter_.addColumnLine(1, value);
164 if (value.length() > 12U && i == firstShortValue)
166 firstShortValue = i + 1;
168 if (value.length() > 25U)
170 if (firstLongValue == -1)
178 if (option.isInputOutputFile())
182 else if (option.isInputFile())
186 else if (option.isOutputFile())
190 if (!option.isRequired())
194 if (option.isLibraryFile())
198 bool bLongType = (type.length() > 12U);
199 formatter_.addColumnLine(2, type);
200 formatter_.addColumnLine(3, substituteMarkupForConsole(option.description()));
203 if (name.length() > 6U || firstShortValue > 0)
205 formatter_.setColumnFirstLineOffset(1, 1);
206 // Assume that the name is <20 chars, so that the type fits
207 if (firstLongValue >= 0)
213 int firstDescriptionLine = 0;
216 firstDescriptionLine = 1;
218 formatter_.setColumnFirstLineOffset(3, firstDescriptionLine);
219 if (firstLongValue >= 0 && formatter_.lastColumnLine(3) >= firstLongValue)
221 firstDescriptionLine = lastLongValue + 1;
222 formatter_.setColumnFirstLineOffset(3, firstDescriptionLine);
225 // Do the formatting.
226 file_.writeString(formatter_.formatRow());
230 /********************************************************************
235 * Helper object for writing help for non-file parameters.
237 * \ingroup module_commandline
239 class ParameterWriter : public OptionsVisitor
242 //! Creates a helper object for writing non-file parameters.
243 ParameterWriter(File *file, const char *timeUnit);
245 //! Sets the writer to show hidden options.
246 void setShowHidden(bool bSet) { bShowHidden_ = bSet; }
247 //! Returns true if anything was written out.
248 bool didOutput() const { return formatter_.didOutput(); }
250 virtual void visitSubSection(const Options §ion);
251 virtual void visitOption(const OptionInfo &option);
255 TextTableFormatter formatter_;
256 const char *timeUnit_;
260 ParameterWriter::ParameterWriter(File *file, const char *timeUnit)
261 : file_(*file), timeUnit_(timeUnit), bShowHidden_(false)
263 formatter_.addColumn("Option", 12, false);
264 formatter_.addColumn("Type", 6, false);
265 formatter_.addColumn("Value", 6, false);
266 formatter_.addColumn("Description", 51, true);
269 void ParameterWriter::visitSubSection(const Options §ion)
271 OptionsIterator iterator(section);
272 iterator.acceptSubSections(this);
273 iterator.acceptOptions(this);
276 void ParameterWriter::visitOption(const OptionInfo &option)
278 if (option.isType<FileNameOptionInfo>()
279 || option.isType<SelectionFileOptionInfo>()
280 || option.isType<SelectionOptionInfo>()
281 || (!bShowHidden_ && option.isHidden()))
287 bool bIsBool = option.isType<BooleanOptionInfo>();
288 std::string name(formatString("-%s%s", bIsBool ? "[no]" : "",
289 option.name().c_str()));
290 formatter_.addColumnLine(0, name);
291 formatter_.addColumnLine(1, option.type());
292 if (name.length() > 12U)
294 formatter_.setColumnFirstLineOffset(1, 1);
296 // TODO: Better handling of multiple long values
298 for (int i = 0; i < option.valueCount(); ++i)
304 values.append(option.formatValue(i));
306 formatter_.addColumnLine(2, values);
307 std::string description(substituteMarkupForConsole(option.description()));
308 const DoubleOptionInfo *doubleOption = option.toType<DoubleOptionInfo>();
309 if (doubleOption != NULL && doubleOption->isTime())
311 description = replaceAll(description, "%t", timeUnit_);
313 formatter_.addColumnLine(3, description);
314 if (values.length() > 6U)
316 formatter_.setColumnFirstLineOffset(3, 1);
319 file_.writeString(formatter_.formatRow());
323 /********************************************************************
324 * SelectionParameterWriter
328 * Helper object for writing help for selection parameters.
330 * \ingroup module_commandline
332 class SelectionParameterWriter : public OptionsVisitor
335 //! Creates a helper object for writing selection parameters.
336 explicit SelectionParameterWriter(File *file);
338 //! Returns true if anything was written out.
339 bool didOutput() const { return formatter_.didOutput(); }
341 virtual void visitSubSection(const Options §ion);
342 virtual void visitOption(const OptionInfo &option);
346 TextTableFormatter formatter_;
349 SelectionParameterWriter::SelectionParameterWriter(File *file)
352 formatter_.addColumn("Selection", 10, false);
353 formatter_.addColumn("Description", 67, true);
356 void SelectionParameterWriter::visitSubSection(const Options §ion)
358 OptionsIterator iterator(section);
359 iterator.acceptSubSections(this);
360 iterator.acceptOptions(this);
363 void SelectionParameterWriter::visitOption(const OptionInfo &option)
365 if (!option.isType<SelectionFileOptionInfo>()
366 && !option.isType<SelectionOptionInfo>())
372 std::string name(formatString("-%s", option.name().c_str()));
373 formatter_.addColumnLine(0, name);
374 formatter_.addColumnLine(1, substituteMarkupForConsole(option.description()));
375 file_.writeString(formatter_.formatRow());
377 // TODO: What to do with selection variables?
378 // They are not printed as values for any option.
379 for (int i = 0; i < option.valueCount(); ++i)
381 std::string value(option.formatValue(i));
383 file_.writeLine(formatString(" %s", value.c_str()));
389 /********************************************************************
390 * CommandLineHelpWriter::Impl
393 CommandLineHelpWriter::Impl::Impl(const Options &options)
394 : options_(options), timeUnit_(TimeUnitManager().timeUnitAsString()),
395 bShowDescriptions_(false), bShowHidden_(false)
399 /********************************************************************
400 * CommandLineHelpWriter
403 CommandLineHelpWriter::CommandLineHelpWriter(const Options &options)
404 : impl_(new Impl(options))
408 CommandLineHelpWriter::~CommandLineHelpWriter()
412 CommandLineHelpWriter &CommandLineHelpWriter::setShowHidden(bool bSet)
414 impl_->bShowHidden_ = bSet;
418 CommandLineHelpWriter &CommandLineHelpWriter::setShowDescriptions(bool bSet)
420 impl_->bShowDescriptions_ = bSet;
424 CommandLineHelpWriter &CommandLineHelpWriter::setTimeUnitString(const char *timeUnit)
426 impl_->timeUnit_ = timeUnit;
430 void CommandLineHelpWriter::writeHelp(File *file)
432 if (impl_->bShowDescriptions_)
434 file->writeLine("DESCRIPTION");
435 file->writeLine("-----------");
437 DescriptionWriter(file).visitSubSection(impl_->options_);
440 FileParameterWriter writer(file);
441 writer.visitSubSection(impl_->options_);
442 if (writer.didOutput())
448 ParameterWriter writer(file, impl_->timeUnit_.c_str());
449 writer.setShowHidden(impl_->bShowHidden_);
450 writer.visitSubSection(impl_->options_);
451 if (writer.didOutput())
457 SelectionParameterWriter writer(file);
458 writer.visitSubSection(impl_->options_);
459 if (writer.didOutput())