1 /******************************************************************************
2  *
3  *  diafiltmgr.cpp -	DiathekeFilterMgr
4  *
5  * $Id: diafiltmgr.cpp 3113 2014-03-12 12:42:07Z chrislit $
6  *
7  * Copyright 2001-2013 CrossWire Bible Society (http://www.crosswire.org)
8  *	CrossWire Bible Society
9  *	P. O. Box 2528
10  *	Tempe, AZ  85280-2528
11  *
12  * This program is free software; you can redistribute it and/or modify it
13  * under the terms of the GNU General Public License as published by the
14  * Free Software Foundation version 2.
15  *
16  * This program is distributed in the hope that it will be useful, but
17  * WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * General Public License for more details.
20  *
21  */
22 
23 #include <swmgr.h>
24 #include <swmodule.h>
25 
26 #include <thmlplain.h>
27 #include <thmlgbf.h>
28 #include <thmlosis.h>
29 #include <thmlhtml.h>
30 #include <thmlhtmlhref.h>
31 #include <thmlxhtml.h>
32 #include <thmllatex.h>
33 #include <thmlrtf.h>
34 #include <thmlwebif.h>
35 
36 #include <gbfplain.h>
37 #include <gbfthml.h>
38 #include <gbfosis.h>
39 #include <gbfhtml.h>
40 #include <gbfhtmlhref.h>
41 #include <gbfxhtml.h>
42 #include <gbflatex.h>
43 #include <gbfrtf.h>
44 #include <gbfwebif.h>
45 
46 #include <osisplain.h>
47 #include <osisosis.h>
48 #include <osisrtf.h>
49 #include <osishtmlhref.h>
50 #include <osisxhtml.h>
51 #include <osislatex.h>
52 #include <osiswebif.h>
53 
54 #include <teiplain.h>
55 #include <teirtf.h>
56 #include <teihtmlhref.h>
57 #include <teixhtml.h>
58 #include <teilatex.h>
59 
60 #include "diafiltmgr.h"
61 #include "thmlcgi.h"
62 #include "gbfcgi.h"
63 #include "osiscgi.h"
64 
DiathekeFilterMgr(char mark,char enc)65 DiathekeFilterMgr::DiathekeFilterMgr (char mark, char enc)
66 		   : EncodingFilterMgr(enc) {
67 
68         markup = mark;
69 
70         CreateFilters(markup);
71 }
72 
~DiathekeFilterMgr()73 DiathekeFilterMgr::~DiathekeFilterMgr() {
74         if (fromthml)
75                 delete (fromthml);
76         if (fromgbf)
77                 delete (fromgbf);
78         if (fromplain)
79                 delete (fromplain);
80         if (fromosis)
81                 delete (fromosis);
82         if (fromtei)
83                 delete (fromtei);
84 }
85 
AddRenderFilters(SWModule * module,ConfigEntMap & section)86 void DiathekeFilterMgr::AddRenderFilters(SWModule *module, ConfigEntMap &section) {
87         switch (module->getMarkup()) {
88         case FMT_THML:
89                 if (fromthml)
90                         module->addRenderFilter(fromthml);
91                 break;
92         case FMT_GBF:
93                 if (fromgbf)
94                         module->addRenderFilter(fromgbf);
95                 break;
96         case FMT_PLAIN:
97                 if (fromplain)
98                         module->addRenderFilter(fromplain);
99                 break;
100         case FMT_OSIS:
101                 if (fromosis)
102                         module->addRenderFilter(fromosis);
103                 break;
104         case FMT_TEI:
105                 if (fromtei)
106                         module->addRenderFilter(fromtei);
107                 break;
108         }
109 	EncodingFilterMgr::AddRenderFilters(module, section);
110 }
111 
112 
Markup(char mark)113 char DiathekeFilterMgr::Markup(char mark) {
114         if (mark && mark != markup) {
115                 markup = mark;
116                 ModMap::const_iterator module;
117 
118                 SWFilter * oldplain = fromplain;
119                 SWFilter * oldthml = fromthml;
120                 SWFilter * oldgbf = fromgbf;
121                 SWFilter * oldosis = fromosis;
122                 SWFilter * oldtei = fromtei;
123 
124                 CreateFilters(markup);
125 
126                 for (module = getParentMgr()->Modules.begin(); module != getParentMgr()->Modules.end(); module++)
127                         switch (module->second->getMarkup()) {
128                         case FMT_THML:
129                                 if (oldthml != fromthml) {
130                                         if (oldthml) {
131                                                 if (!fromthml) {
132                                                         module->second->removeRenderFilter(oldthml);
133                                                 }
134                                                 else {
135                                                         module->second->replaceRenderFilter(oldthml, fromthml);
136                                                 }
137                                         }
138                                         else if (fromthml) {
139                                                 module->second->addRenderFilter(fromthml);
140                                         }
141                                 }
142                                 break;
143                         case FMT_GBF:
144                                 if (oldgbf != fromgbf) {
145                                         if (oldgbf) {
146                                                 if (!fromgbf) {
147                                                         module->second->removeRenderFilter(oldgbf);
148                                                 }
149                                                 else {
150                                                         module->second->replaceRenderFilter(oldgbf, fromgbf);
151                                                 }
152                                         }
153                                         else if (fromgbf) {
154                                                 module->second->addRenderFilter(fromgbf);
155                                         }
156                                         break;
157                                 }
158                         case FMT_PLAIN:
159                                 if (oldplain != fromplain) {
160                                         if (oldplain) {
161                                                 if (!fromplain) {
162                                                         module->second->removeRenderFilter(oldplain);
163                                                 }
164                                                 else {
165                                                         module->second->replaceRenderFilter(oldplain, fromplain);
166                                                 }
167                                         }
168                                         else if (fromplain) {
169                                                 module->second->addRenderFilter(fromplain);
170                                         }
171                                         break;
172                                 }
173                         case FMT_OSIS:
174                                 if (oldosis != fromosis) {
175                                         if (oldosis) {
176                                                 if (!fromosis) {
177                                                         module->second->removeRenderFilter(oldosis);
178                                                 }
179                                                 else {
180                                                         module->second->replaceRenderFilter(oldosis, fromosis);
181                                                 }
182                                         }
183                                         else if (fromosis) {
184                                                 module->second->addRenderFilter(fromosis);
185                                         }
186                                         break;
187                                 }
188                         case FMT_TEI:
189                                 if (oldtei != fromtei) {
190                                         if (oldtei) {
191                                                 if (!fromtei) {
192                                                         module->second->removeRenderFilter(oldtei);
193                                                 }
194                                                 else {
195                                                         module->second->replaceRenderFilter(oldtei, fromtei);
196                                                 }
197                                         }
198                                         else if (fromtei) {
199                                                 module->second->addRenderFilter(fromtei);
200                                         }
201                                         break;
202                                 }
203                         }
204 
205                 if (oldthml)
206                         delete oldthml;
207                 if (oldgbf)
208                         delete oldgbf;
209                 if (oldplain)
210                         delete oldplain;
211                 if (oldosis)
212                         delete oldosis;
213                 if (oldtei)
214                         delete oldtei;
215         }
216         return markup;
217 }
218 
CreateFilters(char markup)219 void DiathekeFilterMgr::CreateFilters(char markup) {
220 
221                 switch (markup) {
222 		case FMT_INTERNAL:
223 			fromplain = NULL;
224 			fromthml = NULL;
225 			fromgbf = NULL;
226 			fromosis = NULL;
227 			fromtei = NULL;
228 			break;
229 
230 		case FMT_CGI:
231 			fromplain = NULL;
232 			fromthml = new ThMLCGI();
233 			fromgbf = new GBFCGI();
234 			fromosis = new OSISCGI();
235 			fromtei = NULL; // TODO: write TEICGI()
236 			break;
237 
238 		case FMT_PLAIN:
239 			fromplain = NULL;
240 			fromthml  = new ThMLPlain();
241 			fromgbf   = new GBFPlain();
242 			fromosis  = new OSISPlain();
243 			fromtei   = new TEIPlain();
244 			break;
245 
246 		case FMT_THML:
247 			fromplain = NULL;
248 			fromthml  = NULL;
249 			fromgbf   = new GBFThML();
250 			fromosis  = NULL;
251 			fromtei   = NULL;
252 			break;
253 
254 		case FMT_GBF:
255 			fromplain = NULL;
256 			fromthml  = new ThMLGBF();
257 			fromgbf   = NULL;
258 			fromosis  = NULL;
259 			fromtei   = NULL;
260 			break;
261 
262 		case FMT_HTML:
263 			fromplain = NULL;
264 			fromthml  = new ThMLHTML();
265 			fromgbf   = new GBFHTML();
266 			fromosis  = NULL;
267 			fromtei   = NULL;
268 			break;
269 
270 		case FMT_HTMLHREF:
271 			fromplain = NULL;
272 			fromthml  = new ThMLHTMLHREF();
273 			fromgbf   = new GBFHTMLHREF();
274 			fromosis  = new OSISHTMLHREF();
275 			fromtei   = new TEIHTMLHREF();
276 			break;
277 
278 		case FMT_RTF:
279 			fromplain = NULL;
280 			fromthml  = new ThMLRTF();
281 			fromgbf   = new GBFRTF();
282 			fromosis  = new OSISRTF();
283 			fromtei   = new TEIRTF();
284 			break;
285 
286 		case FMT_LATEX:
287 			fromplain = NULL;
288 			fromthml  = new ThMLLaTeX();
289 			fromgbf   = new GBFLaTeX();
290 			fromosis  = new OSISLaTeX();
291 			fromtei   = new TEILaTeX();
292 			break;
293 
294 		case FMT_OSIS:
295 			fromplain = NULL;
296 			fromthml  = new ThMLOSIS();
297 			fromgbf   = new GBFOSIS();
298 			fromosis  = new OSISOSIS();
299 			fromtei   = NULL;
300 			break;
301 
302 		case FMT_WEBIF:
303 			fromplain = NULL;
304 			fromthml  = new ThMLWEBIF();
305 			fromgbf   = new GBFWEBIF();
306 			fromosis  = new OSISWEBIF();
307 			fromtei   = NULL;
308 			break;
309 
310 		case FMT_TEI:
311 			fromplain = NULL;
312 			fromthml  = NULL;
313 			fromgbf   = NULL;
314 			fromosis  = NULL;
315 			fromtei   = NULL;
316 			break;
317 
318 		case FMT_XHTML:
319 			fromplain = NULL;
320 			fromthml  = new ThMLXHTML();
321 			fromgbf   = new GBFXHTML();
322 			fromosis  = new OSISXHTML();
323 			fromtei   = new TEIXHTML();
324 			break;
325                 }
326 
327 }
328