source: wkhtmltox/trunk/fuentes/src/shared/textoutputter.cc @ 51

Last change on this file since 51 was 51, checked in by mabarracus, 4 years ago

wip

File size: 3.9 KB
Line 
1// -*- mode: c++; tab-width: 4; indent-tabs-mode: t; eval: (progn (c-set-style "stroustrup") (c-set-offset 'innamespace 0)); -*-
2// vi:set ts=4 sts=4 sw=4 noet :
3//
4// Copyright 2010, 2011 wkhtmltopdf authors
5//
6// This file is part of wkhtmltopdf.
7//
8// wkhtmltopdf is free software: you can redistribute it and/or modify
9// it under the terms of the GNU Lesser General Public License as published by
10// the Free Software Foundation, either version 3 of the License, or
11// (at your option) any later version.
12//
13// wkhtmltopdf is distributed in the hope that it will be useful,
14// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16// GNU General Public License for more details.
17//
18// You should have received a copy of the GNU Lesser General Public License
19// along with wkhtmltopdf.  If not, see <http://www.gnu.org/licenses/>.
20
21#include "outputter.hh"
22#include <qstringlist.h>
23
24#define S(t) (doc?(t).toUtf8().constData():(t).toLocal8Bit().constData())
25
26class TextOutputter: public Outputter {
27public:
28        FILE * fd;
29        static const int lw = 80;
30        int w;
31        bool doc;
32        bool extended;
33        bool first;
34        int order;
35        TextOutputter(FILE * _, bool d, bool e): fd(_), doc(d), extended(e) {}
36
37        void beginSection(const QString & name) {
38                if (doc) {
39                        int x= 80 - name.size() - 4;
40                        if (x < 6) x = 60;
41                        for (int i=0; i < x/2; ++i)
42                                fprintf(fd, "=");
43                        fprintf(fd, "> %s <", S(name) );
44                        for (int i=0; i < (x+1)/2; ++i)
45                                fprintf(fd, "=");
46                        fprintf(fd, "\n");
47                } else
48                        fprintf(fd, "%s:\n", S(name) );
49        }
50
51        void endSection() {
52        }
53
54        void beginParagraph() {
55                first=true;
56                if (doc) {
57                        w=0;
58                } else {
59                        w=2;
60                        fprintf(fd,"  ");
61                }
62        }
63
64        void text(const QString & t) {
65                first=true;
66                QStringList list = t.split(" ");
67                foreach (const QString & s, list) {
68                        if ( w + s.size() + (first?0:1) > lw) {
69                                fprintf(fd, "\n");
70                                if (doc) {
71                                        w=0;
72                                } else {
73                                        w=2;
74                                        fprintf(fd,"  ");
75                                }
76                                first=true;
77                        }
78                        if (first) first=false;
79                        else {
80                                fprintf(fd, " ");
81                                ++w;
82                        }
83                        w += s.size();
84                        fprintf(fd, "%s", S(s));
85                }
86        }
87
88        void sectionLink(const QString & t) {
89                text(t);
90        }
91
92        void bold(const QString & t) {
93                text("*"+t+"*");
94        }
95
96        void italic(const QString & t) {
97                text("_"+t+"_");
98        }
99
100        void link(const QString & t) {
101                text("<"+t+">");
102        }
103
104        void endParagraph() {
105                fprintf(fd,"\n\n");
106        }
107
108        void verbatim(const QString & t) {
109                if (doc)
110                        fprintf(fd,"%s\n", S(t));
111                else {
112                        foreach (const QString & s, t.split("\n"))
113                                fprintf(fd,"  %s\n",S(s));
114                }
115        }
116
117        void beginList(bool ordered) {
118                order=ordered?1:-1;
119        }
120        void endList() {
121                fprintf(fd,"\n");
122        }
123        void listItem(const QString & s) {
124                if (order < 0) fprintf(fd, " * ");
125                else fprintf(fd, "%3d ", order++);
126                fprintf(fd,"%s\n",S(s));
127        }
128
129        void beginSwitch() {}
130
131        void cswitch(const ArgHandler * h) {
132                w=0;
133                if (!doc) {fprintf(fd,"  "); w=2;}
134                if (h->shortSwitch != 0)
135                        fprintf(fd,"-%c, ",h->shortSwitch);
136                else
137                        fprintf(fd,"    ");
138                fprintf(fd,"--%s",S(h->longName));
139                w+=4 + 2 + h->longName.size();
140                if (doc && h->qthack) {
141                        fprintf(fd, " *");
142                        w += 2;
143                }
144
145                foreach (const QString & arg, h->argn) {
146                        fprintf(fd," <%s>",S(arg));
147                        w+=3+arg.size();
148                }
149                while (w < 37) {
150                        fprintf(fd," ");
151                        ++w;
152                }
153                foreach (const QString & s, h->getDesc().split(" ")) {
154                        if (w+1+s.size() > lw) {
155                                printf("\n");
156                                w=0;
157                                while (w < 37) {
158                                        fprintf(fd," ");
159                                        ++w;
160                                }
161                        }
162                        fprintf(fd, " %s", S(s));
163                        w += s.size() + 1;
164                }
165                fprintf(fd,"\n");
166        }
167
168        void endSwitch() {
169                if (doc)
170                        fprintf(fd, "\nItems marked * are only available using patched QT.\n");
171                printf("\n");
172        }
173
174};
175
176/*!
177  Create a raw text outputter, used for outputting --help and readme
178  \param fd A file description to output to
179  \param doc Output in readme format
180  \param extended Output extended options
181*/
182Outputter * Outputter::text(FILE * fd, bool doc, bool extended) {
183        return new TextOutputter(fd, doc, extended);
184}
Note: See TracBrowser for help on using the repository browser.