2 * \file ExternalTemplate.C
3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
6 * \author Asger Alstrup Nielsen
8 * Full author contact details are available in file CREDITS.
13 #include "ExternalTemplate.h"
17 #include "support/path.h"
18 #include "support/LAssert.h"
19 #include "support/filetools.h"
20 #include "support/lstrings.h"
21 #include "support/path_defines.h"
25 namespace support = lyx::support;
31 // We have to have dummy default commands for security reasons!
33 ExternalTemplate::ExternalTemplate()
38 ExternalTemplate::FormatTemplate::FormatTemplate()
42 ExternalTemplateManager::ExternalTemplateManager()
44 // gimp gnuchess gnuplot ical netscape tetris xpaint
45 readTemplates(support::user_lyxdir());
46 if (lyxerr.debugging(Debug::EXTERNAL)) {
47 dumpPreambleDefs(lyxerr);
49 dumpTemplates(lyxerr);
54 class dumpPreambleDef {
56 typedef ExternalTemplateManager::PreambleDefs::value_type value_type;
58 dumpPreambleDef(ostream & o) : ost(o) {}
60 void operator()(value_type const & vt) {
61 ost << "PreambleDef " << vt.first << '\n'
63 << "PreambleDefEnd" << endl;
73 typedef ExternalTemplateManager::Templates::value_type value_type;
75 dumpTemplate(ostream & o) : ost(o) {}
77 void operator()(value_type const & vt) {
78 ExternalTemplate const & et = vt.second;
80 ost << "Template " << et.lyxName << '\n'
81 << "\tGuiName " << et.guiName << '\n'
85 << "\tInputFormat " << et.inputFormat << '\n'
86 << "\tFileFilter " << et.fileRegExp << '\n'
87 << "\tEditCommand " << et.editCommand << '\n'
88 << "\tAutomaticProduction " << et.automaticProduction << '\n';
90 ost << "TemplateEnd" << endl;
100 typedef ExternalTemplate::Formats::value_type value_type;
102 dumpFormat(ostream & o) : ost(o) {}
104 void operator()(value_type const & vt) const{
105 ExternalTemplate::FormatTemplate const & ft = vt.second;
106 ost << "\tFormat " << vt.first << '\n'
107 << "\t\tProduct " << ft.product << '\n'
108 << "\t\tUpdateFormat " << ft.updateFormat << '\n'
109 << "\t\tUpdateResult " << ft.updateResult << '\n'
110 << "\t\tRequirement " << ft.requirement << '\n'
111 << "\t\tPreamble " << ft.preambleName << '\n'
119 void ExternalTemplate::dumpFormats(ostream & os) const
121 for_each(formats.begin(), formats.end(), dumpFormat(os));
125 void ExternalTemplateManager::dumpPreambleDefs(ostream & os) const
127 for_each(preambledefs.begin(), preambledefs.end(), dumpPreambleDef(os));
131 void ExternalTemplateManager::dumpTemplates(ostream & os) const
133 for_each(templates.begin(), templates.end(), dumpTemplate(os));
137 ExternalTemplateManager & ExternalTemplateManager::get()
139 static ExternalTemplateManager externalTemplateManager;
140 return externalTemplateManager;
144 ExternalTemplateManager::Templates &
145 ExternalTemplateManager::getTemplates()
151 ExternalTemplateManager::Templates const &
152 ExternalTemplateManager::getTemplates() const
158 ExternalTemplate const & ExternalTemplateManager::getTemplateByName(string const & name)
160 return templates[name];
165 ExternalTemplateManager::getPreambleDefByName(string const & name) const
167 string const trimmed_name = support::trim(name);
168 if (trimmed_name.empty())
171 PreambleDefs::const_iterator it = preambledefs.find(trimmed_name);
172 if (it == preambledefs.end())
179 void ExternalTemplateManager::readTemplates(string const & path)
181 support::Path p(path);
190 keyword_item templatetags[] = {
191 { "preambledef", TM_PREAMBLEDEF },
192 { "preambledefend", TM_PREAMBLEDEF_END },
193 { "template", TM_TEMPLATE },
194 { "templateend", TM_TEMPLATE_END }
197 LyXLex lex(templatetags, TM_TEMPLATE_END);
199 string filename = support::LibFileSearch("", "external_templates");
200 if (filename.empty() || !lex.setFile(filename)) {
201 lex.printError("ExternalTemplateManager::readTemplates: "
206 char const * const preamble_end_tag =
207 templatetags[TM_PREAMBLEDEF_END-1].tag;
211 case TM_PREAMBLEDEF: {
213 string const name = lex.getString();
214 preambledefs[name] = lex.getLongString(preamble_end_tag);
220 string const name = lex.getString();
221 ExternalTemplate & tmp = templates[name];
223 tmp.readTemplate(lex);
227 case TM_TEMPLATE_END:
228 lex.printError("Warning: End outside Template.");
231 case TM_PREAMBLEDEF_END:
232 lex.printError("Warning: End outside PreambleDef.");
239 void ExternalTemplate::readTemplate(LyXLex & lex)
241 enum TemplateOptionTags {
252 keyword_item templateoptiontags[] = {
253 { "automaticproduction", TO_AUTOMATIC },
254 { "editcommand", TO_EDITCMD },
255 { "filefilter", TO_FILTER },
256 { "format", TO_FORMAT },
257 { "guiname", TO_GUINAME },
258 { "helptext", TO_HELPTEXT },
259 { "inputformat", TO_INPUTFORMAT },
260 { "templateend", TO_END }
263 pushpophelper pph(lex, templateoptiontags, TO_END);
269 guiName = lex.getString();
273 helpText = lex.getLongString("HelpTextEnd");
278 inputFormat = lex.getString();
283 fileRegExp = lex.getString();
288 editCommand = lex.getString();
293 automaticProduction = lex.getBool();
298 formats[lex.getString()].readFormat(lex);
305 lex.printError("ExternalTemplate::readTemplate: "
306 "Wrong tag: $$Token");
307 support::Assert(false);
314 void ExternalTemplate::FormatTemplate::readFormat(LyXLex & lex)
325 keyword_item formattags[] = {
326 { "formatend", FO_END },
327 { "preamble", FO_PREAMBLE },
328 { "product", FO_PRODUCT },
329 { "requirement", FO_REQUIREMENT },
330 { "updateformat", FO_UPDATEFORMAT },
331 { "updateresult", FO_UPDATERESULT }
334 pushpophelper pph(lex, formattags, FO_END);
340 product = lex.getString();
343 case FO_UPDATEFORMAT:
345 updateFormat = lex.getString();
348 case FO_UPDATERESULT:
350 updateResult = lex.getString();
355 requirement = lex.getString();
360 preambleName = lex.getString();