1 /*
2  * Header file for HTMLDOC, a HTML document processing program.
3  *
4  * Copyright 2011-2020 by Michael R Sweet.
5  * Copyright 1997-2010 by Easy Software Products.  All rights reserved.
6  *
7  * This program is free software.  Distribution and use rights are outlined in
8  * the file "COPYING".
9  */
10 
11 /*
12  * Include necessary headers.
13  */
14 
15 #include <stdio.h>
16 #include <stdlib.h>
17 #include <errno.h>
18 
19 #include "html.h"
20 #include "image.h"
21 #include "debug.h"
22 #include "progress.h"
23 
24 #ifdef HAVE_LIBFLTK
25 #  include "gui.h"
26 #endif /* HAVE_LIBFLTK */
27 
28 #ifdef WIN32	    /* Include all 8 million Windows header files... */
29 #  include <windows.h>
30 #endif /* WIN32 */
31 
32 #ifdef __cplusplus
33 extern "C" {
34 #endif /* __cplusplus */
35 
36 
37 /*
38  * Macro to get rid of "unreferenced variable xyz" warnings...
39  */
40 
41 #define REF(x)		(void)x;
42 
43 
44 /*
45  * Output type...
46  */
47 
48 enum
49 {
50   OUTPUT_BOOK,
51   OUTPUT_CONTINUOUS,
52   OUTPUT_WEBPAGES
53 };
54 
55 
56 /*
57  * PDF constants...
58  */
59 
60 enum	/* PDF page mode */
61 {
62   PDF_DOCUMENT,
63   PDF_OUTLINE,
64   PDF_FULLSCREEN
65 };
66 
67 enum	/* PDF page layout */
68 {
69   PDF_SINGLE,
70   PDF_ONE_COLUMN,
71   PDF_TWO_COLUMN_LEFT,
72   PDF_TWO_COLUMN_RIGHT
73 };
74 
75 enum	/* PDF first page */
76 {
77   PDF_PAGE_1,
78   PDF_TOC,
79   PDF_CHAPTER_1
80 };
81 
82 enum	/* PDF transition effect */
83 {
84   PDF_NONE,
85   PDF_BOX_INWARD,
86   PDF_BOX_OUTWARD,
87   PDF_DISSOLVE,
88   PDF_GLITTER_DOWN,
89   PDF_GLITTER_DOWN_RIGHT,
90   PDF_GLITTER_RIGHT,
91   PDF_HORIZONTAL_BLINDS,
92   PDF_HORIZONTAL_SWEEP_INWARD,
93   PDF_HORIZONTAL_SWEEP_OUTWARD,
94   PDF_VERTICAL_BLINDS,
95   PDF_VERTICAL_SWEEP_INWARD,
96   PDF_VERTICAL_SWEEP_OUTWARD,
97   PDF_WIPE_DOWN,
98   PDF_WIPE_LEFT,
99   PDF_WIPE_RIGHT,
100   PDF_WIPE_UP
101 };
102 
103 enum	/* PDF document permissions */
104 {
105   PDF_PERM_PRINT = 4,
106   PDF_PERM_MODIFY = 8,
107   PDF_PERM_COPY = 16,
108   PDF_PERM_ANNOTATE = 32
109 };
110 
111 
112 /*
113  * Globals...
114  */
115 
116 #ifdef _HTMLDOC_CXX_
117 #  define VAR
118 #  define VALUE(x)	=x
119 #  define NULL3		={0,0,0}
120 #else
121 #  define VAR		extern
122 #  define VALUE(x)
123 #  define NULL3
124 #endif /* _HTML_DOC_CXX_ */
125 
126 VAR int		Verbosity	VALUE(0);	/* Verbosity */
127 VAR int		OverflowErrors	VALUE(0);	/* Show errors on overflow */
128 VAR int		StrictHTML	VALUE(0);	/* Do strict HTML checking */
129 VAR int		CGIMode		VALUE(0);	/* Running as CGI? */
130 VAR int		Errors		VALUE(0);	/* Number of errors */
131 VAR int		Compression	VALUE(1);	/* Non-zero means compress PDFs */
132 VAR int		TitlePage	VALUE(1),	/* Need a title page */
133 		TocLevels	VALUE(3),	/* Number of table-of-contents levels */
134 		TocLinks	VALUE(1),	/* Generate links */
135 		TocNumbers	VALUE(0),	/* Generate heading numbers */
136 		TocDocCount	VALUE(0);	/* Number of chapters */
137 VAR int		OutputType	VALUE(OUTPUT_BOOK);
138 						/* Output a "book", etc. */
139 VAR char	OutputPath[1024] VALUE("");	/* Output directory/name */
140 VAR int		OutputFiles	VALUE(0),	/* Generate multiple files? */
141 		OutputColor	VALUE(1);	/* Output color images */
142 VAR int		OutputJPEG	VALUE(0);	/* JPEG compress images? */
143 VAR int		PDFVersion	VALUE(13);	/* Version of PDF to support */
144 VAR int		PDFPageMode	VALUE(PDF_OUTLINE),
145 						/* PageMode attribute */
146 		PDFPageLayout	VALUE(PDF_SINGLE),
147 						/* PageLayout attribute */
148 		PDFFirstPage	VALUE(PDF_CHAPTER_1),
149 						/* First page */
150 		PDFEffect	VALUE(PDF_NONE);/* Page transition effect */
151 VAR double	PDFEffectDuration VALUE(1.0),	/* Page effect duration */
152 		PDFPageDuration	VALUE(10.0);	/* Page duration */
153 VAR int		Encryption	VALUE(0),	/* Encrypt the PDF file? */
154 		Permissions	VALUE(-4);	/* File permissions? */
155 VAR char	OwnerPassword[33] VALUE(""),	/* Owner password */
156 		UserPassword[33] VALUE("");	/* User password */
157 VAR int		EmbedFonts	VALUE(1);	/* Embed fonts? */
158 VAR int		PSLevel		VALUE(2),	/* Language level (0 for PDF) */
159 		PSCommands	VALUE(0),	/* Output PostScript commands? */
160 		XRXComments	VALUE(0);	/* Output Xerox comments? */
161 VAR int		PageWidth	VALUE(595),	/* Page width in points */
162 		PageLength	VALUE(792),	/* Page length in points */
163 		PageLeft	VALUE(72),	/* Left margin */
164 		PageRight	VALUE(36),	/* Right margin */
165 		PageTop		VALUE(36),	/* Top margin */
166 		PageBottom	VALUE(36),	/* Bottom margin */
167 		PagePrintWidth,			/* Printable width */
168 		PagePrintLength,		/* Printable length */
169 		PageDuplex	VALUE(0),	/* Adjust margins/pages for duplexing? */
170 		Landscape	VALUE(0),	/* Landscape orientation? */
171 		NumberUp	VALUE(1);	/* Number-up pages */
172 
173 VAR typeface_t	HeadFootType	VALUE(TYPE_HELVETICA);
174 						/* Typeface for header & footer */
175 VAR style_t	HeadFootStyle	VALUE(STYLE_NORMAL);
176 						/* Type style */
177 VAR double	HeadFootSize	VALUE(11.0f);	/* Size of header & footer */
178 
179 VAR char	*Header[3]	NULL3,		/* Header for regular pages */
180 		*Header1[3]	NULL3,		/* Header for first pages */
181 		*TocHeader[3]	NULL3,		/* Header for TOC pages */
182 		*Footer[3]	NULL3,		/* Regular page footer */
183 		*TocFooter[3]	NULL3,		/* Footer for TOC pages */
184 		TocTitle[1024]	VALUE("Table of Contents");
185 						/* TOC title string */
186 
187 VAR char	TitleImage[1024] VALUE(""),	/* Title page image */
188 		Letterhead[1024] VALUE(""),	/* Letterhead image */
189 		LogoImage[1024]	VALUE(""),	/* Logo image */
190 		BodyColor[255]	VALUE(""),	/* Body color */
191 		BodyImage[1024]	VALUE(""),	/* Body image */
192 		LinkColor[255]	VALUE("");	/* Link color */
193 
194 VAR char	HFImage[MAX_HF_IMAGES][1024]	/* Header/footer images */
195 #  ifdef _HTMLDOC_CXX_
196 = { "" }
197 #  endif /* _HTMLDOC_CXX_ */
198 ;
199 
200 VAR int		LinkStyle	VALUE(1);	/* 1 = underline, 0 = plain */
201 VAR int		Links		VALUE(1);	/* 1 = generate links, 0 = no links */
202 VAR char	Path[2048]	VALUE(""),	/* Search path */
203 		Proxy[1024]	VALUE("");	/* Proxy URL */
204 
205 VAR const char	*PDFModes[3]			/* Mode strings */
206 #  ifdef _HTMLDOC_CXX_
207 = { "document", "outline", "fullscreen" }
208 #  endif /* _HTMLDOC_CXX_ */
209 ;
210 VAR const char	*PDFLayouts[4]			/* Layout strings */
211 #  ifdef _HTMLDOC_CXX_
212 = { "single", "one", "twoleft", "tworight" }
213 #  endif /* _HTMLDOC_CXX_ */
214 ;
215 VAR const char	*PDFPages[3]			/* First page strings */
216 #  ifdef _HTMLDOC_CXX_
217 = { "p1", "toc", "c1" }
218 #  endif /* _HTMLDOC_CXX_ */
219 ;
220 VAR const char	*PDFEffects[17]			/* Effect strings */
221 #  ifdef _HTMLDOC_CXX_
222 = { "none", "bi", "bo", "d", "gd", "gdr", "gr", "hb", "hsi", "hso",
223     "vb", "vsi", "vso", "wd", "wl", "wr", "wu" }
224 #  endif /* _HTMLDOC_CXX_ */
225 ;
226 
227 #ifdef HAVE_LIBFLTK
228 VAR GUI		*BookGUI	VALUE(NULL);	/* GUI for book files */
229 #  ifdef WIN32					/* Editor for HTML files */
230 VAR char	HTMLEditor[1024] VALUE("notepad.exe \"%s\"");
231 #  elif defined(__APPLE__)
232 VAR char	HTMLEditor[1024] VALUE("bbedit %s");
233 #  elif defined(__linux)
234 VAR char	HTMLEditor[1024] VALUE("gedit %s");
235 #  else
236 VAR char	HTMLEditor[1024] VALUE("nedit %s");
237 #  endif /* WIN32 */
238 VAR int		Tooltips	VALUE(0);	/* Show tooltips? */
239 #endif /* HAVE_LIBFLTK */
240 
241 
242 /*
243  * Prototypes...
244  */
245 
246 extern int	pspdf_export(tree_t *document, tree_t *toc);
247 
248 extern int	epub_export(tree_t *document, tree_t *toc);
249 
250 extern int	html_export(tree_t *document, tree_t *toc);
251 
252 extern int	htmlsep_export(tree_t *document, tree_t *toc);
253 
254 extern tree_t	*toc_build(tree_t *tree);
255 
256 extern void	get_color(const uchar *c, float *rgb, int defblack = 1);
257 extern const char *get_fmt(char **formats);
258 extern void	get_format(const char *fmt, char **formats);
259 extern int	get_measurement(const char *s, float mul = 1.0f);
260 extern void	set_page_size(const char *size);
261 
262 extern void	prefs_load(void);
263 extern void	prefs_save(void);
264 extern void	prefs_set_paths(void);
265 
266 extern char	*format_number(int n, char f);
267 
268 #ifdef __cplusplus
269 }
270 #endif /* __cplusplus */
271