// -*- mode: c++; tab-width: 4; indent-tabs-mode: t; eval: (progn (c-set-style "stroustrup") (c-set-offset 'innamespace 0)); -*-
// vi:set ts=4 sts=4 sw=4 noet :
//
// Copyright 2010, 2011 wkhtmltopdf authors
//
// This file is part of wkhtmltopdf.
//
// wkhtmltopdf is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// wkhtmltopdf 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 Lesser General Public License
// along with wkhtmltopdf. If not, see .
#include "arghandler.inl"
#include "pdfcommandlineparser.hh"
#include
#include
#include
/*!
\class ArgHandler
\brief Class responsible for handling an argument
*/
/*!
\var ArgHandler::longName
\brief The long name of the argument, e.g. "help" for "--help"
*/
/*!
\var ArgHandler::desc
\brief A descriptive text of the argument
*/
/*!
\var ArgHandler::shortSwitch
\brief Sort name, e.g. 'h' for '-h', if 0 there is no short name
*/
/*!
\var ArgHandler::argn
\brief The names of the arguments to the switch
*/
/*!
\var ArgHandler::display
\brief Indicate that the argument is not hidden
*/
/*!
\var ArgHandler::extended
\brief Indicate if the argument is an extended argument
*/
/*!
\var ArgHandler::qthack
\brief Indicate that the argument is only available with hacked qt
*/
/*!
\fn ArgHandler::operator()(const char ** args, CommandLineParserPrivate & parser)
Callend when the switch was specified
\param args The arguments to the switch, guarantied to have size of argn
\param settings The settings to store the information in
*/
/*!
\class CommandLineParserPrivate
Implementation details for CommandLineParser
*/
using namespace wkhtmltopdf::settings;
struct UnitRealTM: public SomeSetterTM {
static UnitReal strToT(const char * val, bool &ok) {
return strToUnitReal(val, &ok);
}
static QString TToStr(const UnitReal & u, bool & ok) {
return unitRealToStr(u, &ok);
}
};
/*!
Argument handler setting a real-number/unit combo variable
*/
typedef SomeSetter UnitRealSetter;
struct PageSizeTM: public SomeSetterTM {
static QPrinter::PageSize strToT(const char * val, bool &ok) {
return strToPageSize(val, &ok);
}
static QString TToStr(const QPrinter::PageSize & s, bool & ok) {
ok=true;
return pageSizeToStr(s);
}
};
/*!
Argument handler setting a page size variable
*/
typedef SomeSetter PageSizeSetter;
struct OrientationTM: public SomeSetterTM {
static QPrinter::Orientation strToT(const char * val, bool &ok) {
return strToOrientation(val, &ok);
}
static QString TToStr(const QPrinter::Orientation & o, bool & ok) {
ok=true;
return orientationToStr(o);
}
};
/*!
Argument handler setting a orientation variable
*/
typedef SomeSetter OrientationSetter;
struct DefaultTocFunc {
bool operator()(const char **, CommandLineParserBase &, char *) {
QFile file;
file.open(stdout, QIODevice::WriteOnly | QIODevice::Text);
QTextStream stream(&file);
wkhtmltopdf::settings::TableOfContent toc;
wkhtmltopdf::dumpDefaultTOCStyleSheet(stream, toc);
exit(0);
}
};
/*!
Set the default header
*/
struct DefaultHeaderFunc {
bool operator()(const char **, CommandLineParserBase & p, char * page) {
reinterpret_cast(page)->header.left="[webpage]";
reinterpret_cast(page)->header.right="[page]/[topage]";
reinterpret_cast(page)->header.line=true;
static_cast(p).globalSettings.margin.top = strToUnitReal("2cm");
return true;
}
};
/*!
Setup default book mode
*/
struct BookFunc {
bool operator()(const char **, CommandLineParserBase &) {
//p.settings.header.left="[section]";
//p.settings.header.right="[page]/[toPage]";
//p.settings.header.line=true;
//p.settings.outline = true;
//p.settings.printToc = true;
//p.settings.margin.top = Settings::strToUnitReal("2cm");
return true;
}
};
/*!
Construct the commandline parser adding all the arguments
\param s The settings to store values in
*/
PdfCommandLineParser::PdfCommandLineParser(PdfGlobal & s, QList & ps):
readArgsFromStdin(false),
globalSettings(s),
pageSettings(ps) {
section("Global Options");
mode(global);
addDocArgs();
extended(false);
qthack(false);
addarg("quiet", 'q', "Be less verbose", new ConstSetter(s.quiet,true));
addarg("no-collate", 0, "Do not collate when printing multiple copies", new ConstSetter(s.collate, false));
addarg("collate", 0, "Collate when printing multiple copies", new ConstSetter(s.collate, true));
addarg("copies", 0, "Number of copies to print into the pdf file", new IntSetter(s.copies, "number"));
addarg("orientation",'O',"Set orientation to Landscape or Portrait", new OrientationSetter(s.orientation, "orientation"));
addarg("page-size",'s',"Set paper size to: A4, Letter, etc.", new PageSizeSetter(s.size.pageSize, "Size"));
addarg("grayscale",'g',"PDF will be generated in grayscale", new ConstSetter(s.colorMode,QPrinter::GrayScale));
addarg("lowquality",'l',"Generates lower quality pdf/ps. Useful to shrink the result document space", new ConstSetter(s.resolution,QPrinter::ScreenResolution));
addarg("title", 0, "The title of the generated pdf file (The title of the first document is used if not specified)", new QStrSetter(s.documentTitle,"text"));
addarg("read-args-from-stdin", 0, "Read command line arguments from stdin", new ConstSetter(readArgsFromStdin, true) );
extended(true);
qthack(false);
addarg("margin-bottom",'B',"Set the page bottom margin", new UnitRealSetter(s.margin.bottom,"unitreal"));
addarg("margin-left",'L',"Set the page left margin", new UnitRealSetter(s.margin.left,"unitreal"));
addarg("margin-right",'R',"Set the page right margin", new UnitRealSetter(s.margin.right,"unitreal"));
addarg("margin-top",'T',"Set the page top margin", new UnitRealSetter(s.margin.top,"unitreal"));
addarg("dpi",'d',"Change the dpi explicitly (this has no effect on X11 based systems)", new IntSetter(s.dpi,"dpi"));
addarg("page-height", 0, "Page height", new UnitRealSetter(s.size.height,"unitreal"));
addarg("page-width", 0, "Page width", new UnitRealSetter(s.size.width,"unitreal"));
addGlobalLoadArgs(s.load);
extended(true);
qthack(true);
addarg("image-quality", 0, "When jpeg compressing images use this quality", new IntSetter(s.imageQuality,"integer"));
addarg("image-dpi", 0, "When embedding images scale them down to this dpi", new IntSetter(s.imageDPI, "integer"));
addarg("no-pdf-compression", 0 , "Do not use lossless compression on pdf objects", new ConstSetter(s.useCompression,false));
#ifdef Q_OS_UNIX
addarg("use-xserver",0,"Use the X server (some plugins and other stuff might not work without X11)", new ConstSetter(s.useGraphics,true));
#endif
section("Outline Options");
extended(true);
qthack(true);
addarg("outline",0,"Put an outline into the pdf", new ConstSetter(s.outline,true));
addarg("no-outline",0,"Do not put an outline into the pdf", new ConstSetter(s.outline,false));
addarg("outline-depth",0,"Set the depth of the outline", new IntSetter(s.outlineDepth,"level"));
addarg("dump-outline",0,"Dump the outline to a file",new QStrSetter(s.dumpOutline,"file"));
addarg("dump-default-toc-xsl",0,"Dump the default TOC xsl style sheet to stdout", new Caller());
section("Page Options");
mode(page);
addarg("default-header",0,"Add a default header, with the name of the page to the left, and the page number to the right, this is short for: --header-left='[webpage]' --header-right='[page]/[toPage]' --top 2cm --header-line", new Caller());
addarg("viewport-size", 0, "Set viewport size if you have custom scrollbars or css attribute overflow to emulate window size",new QStrSetter(s.viewportSize,""));
addWebArgs(od.web);
extended(true);
qthack(false);
addarg("no-background",0,"Do not print background", new ConstSetter(od.web.background, false));
addarg("background",0,"Do print background", new ConstSetter(od.web.background, true));
extended(true);
qthack(true);
addarg("include-in-outline", 0, "Include the page in the table of contents and outlines", new ConstSetter(od.includeInOutline, true));
addarg("exclude-from-outline", 0, "Do not include the page in the table of contents and outlines", new ConstSetter(od.includeInOutline, false));
addarg("disable-smart-shrinking", 0, "Disable the intelligent shrinking strategy used by WebKit that makes the pixel/dpi ratio none constant",new ConstSetter(od.web.enableIntelligentShrinking, false));
addarg("enable-smart-shrinking", 0, "Enable the intelligent shrinking strategy used by WebKit that makes the pixel/dpi ratio none constant",new ConstSetter(od.web.enableIntelligentShrinking, true));
extended(false);
qthack(true);
addarg("print-media-type",0,"Use print media-type instead of screen", new ConstSetter(od.web.printMediaType,true));
addarg("no-print-media-type",0,"Do not use print media-type instead of screen", new ConstSetter(od.web.printMediaType, false));
extended(true);
qthack(true);
addarg("enable-forms", 0, "Turn HTML form fields into pdf form fields", new ConstSetter(od.produceForms, true));
addarg("disable-forms", 0, "Do not turn HTML form fields into pdf form fields", new ConstSetter(od.produceForms, false));
addarg("disable-internal-links",0,"Do not make local links", new ConstSetter(od.useLocalLinks, false));
addarg("enable-internal-links",0,"Make local links", new ConstSetter(od.useLocalLinks, true));
addarg("disable-external-links",0,"Do not make links to remote web pages", new ConstSetter(od.useExternalLinks, false));
addarg("enable-external-links",0,"Make links to remote web pages", new ConstSetter(od.useExternalLinks, true));
addarg("resolve-relative-links", 0, "Resolve relative external links into absolute links", new ConstSetter(s.resolveRelativeLinks, true));
addarg("keep-relative-links", 0, "Keep relative external links as relative external links", new ConstSetter(s.resolveRelativeLinks, false));
addarg("enable-toc-back-links",0,"Link from section header to toc", new ConstSetter(od.toc.backLinks,true));
addarg("disable-toc-back-links",0,"Do not link from section header to toc", new ConstSetter(od.toc.backLinks,false));
addPageLoadArgs(od.load);
addarg("page-offset",0,"Set the starting page number", new IntSetter(s.pageOffset,"offset",1));
section("Headers And Footer Options");
qthack(true);
extended(true);
addarg("footer-center",0,"Centered footer text", new QStrSetter(od.footer.center,"text"));
addarg("footer-font-name",0,"Set footer font name", new QStrSetter(od.footer.fontName,"name"));;
addarg("footer-font-size",0,"Set footer font size", new IntSetter(od.footer.fontSize,"size"));
addarg("footer-left",0,"Left aligned footer text", new QStrSetter(od.footer.left,"text"));
addarg("footer-line",0,"Display line above the footer", new ConstSetter(od.footer.line,true));
addarg("no-footer-line",0,"Do not display line above the footer", new ConstSetter(od.footer.line,false));
addarg("footer-right",0,"Right aligned footer text", new QStrSetter(od.footer.right,"text"));
addarg("footer-spacing",0,"Spacing between footer and content in mm", new FloatSetter(od.footer.spacing,"real"));
addarg("footer-html",0,"Adds a html footer", new QStrSetter(od.footer.htmlUrl,"url"));
addarg("header-center",0,"Centered header text", new QStrSetter(od.header.center,"text"));
addarg("header-font-name",0,"Set header font name", new QStrSetter(od.header.fontName,"name"));
addarg("header-font-size",0,"Set header font size", new IntSetter(od.header.fontSize,"size"));
addarg("header-left",0,"Left aligned header text", new QStrSetter(od.header.left,"text"));
addarg("header-line",0,"Display line below the header", new ConstSetter(od.header.line,true));
addarg("no-header-line",0,"Do not display line below the header", new ConstSetter(od.header.line,false));
addarg("header-right",0,"Right aligned header text", new QStrSetter(od.header.right,"text"));
addarg("header-spacing",0,"Spacing between header and content in mm", new FloatSetter(od.header.spacing,"real"));
addarg("header-html",0,"Adds a html header", new QStrSetter(od.header.htmlUrl,"url"));
addarg("replace",0, "Replace [name] with value in header and footer (repeatable)", new MapSetter<>(od.replacements, "name", "value"));
section("TOC Options");
mode(toc);
extended(true);
qthack(true);
addarg("xsl-style-sheet",0,"Use the supplied xsl style sheet for printing the table of content", new QStrSetter(od.tocXsl,"file"));
addarg("toc-header-text",0,"The header text of the toc", new QStrSetter(od.toc.captionText, "text"));
addarg("disable-toc-links",0,"Do not link from toc to sections", new ConstSetter(od.toc.forwardLinks, false));
addarg("disable-dotted-lines",0,"Do not use dotted lines in the toc", new ConstSetter(od.toc.useDottedLines,false));
addarg("toc-text-size-shrink",0,"For each level of headings in the toc the font is scaled by this factor", new FloatSetter(od.toc.fontScale, "real"));
addarg("toc-level-indentation",0,"For each level of headings in the toc indent by this length", new QStrSetter(od.toc.indentation, "width"));
}