2013-05-13 19:53:28 +00:00
|
|
|
#include <config.h>
|
|
|
|
|
|
|
|
#include "../support/FileName.h"
|
|
|
|
#include "../support/filetools.h"
|
|
|
|
#include "../Format.h"
|
|
|
|
#include "../LayoutFile.h"
|
|
|
|
#include "../LaTeXFeatures.h"
|
|
|
|
#include "../Lexer.h"
|
|
|
|
#include "../support/Messages.h"
|
|
|
|
#include "../support/os.h"
|
|
|
|
#include "../support/Package.h"
|
|
|
|
|
|
|
|
#include <cstdlib>
|
2016-07-04 21:10:30 +00:00
|
|
|
#include <fstream>
|
2013-05-13 19:53:28 +00:00
|
|
|
#include <iostream>
|
2016-07-04 21:10:30 +00:00
|
|
|
#include <sstream>
|
|
|
|
using namespace std;
|
2013-05-13 19:53:28 +00:00
|
|
|
|
|
|
|
|
|
|
|
namespace lyx {
|
|
|
|
namespace frontend {
|
|
|
|
namespace Alert {
|
|
|
|
void warning(docstring const & title, docstring const & message, bool const &)
|
|
|
|
{
|
|
|
|
LYXERR0(title);
|
|
|
|
LYXERR0(message);
|
|
|
|
}
|
2017-07-23 11:11:54 +00:00
|
|
|
} // namespace Alert
|
|
|
|
} // namespace frontend
|
2013-05-13 19:53:28 +00:00
|
|
|
|
|
|
|
bool LaTeXFeatures::isAvailable(std::string const &)
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
Formats formats;
|
|
|
|
bool Formats::isZippedFile(support::FileName const &) const
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
2017-07-23 11:11:54 +00:00
|
|
|
} // namespace lyx
|
2013-05-13 19:53:28 +00:00
|
|
|
|
|
|
|
|
|
|
|
using namespace lyx::support;
|
|
|
|
using namespace lyx;
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
|
|
|
|
bool test_Layout(string const & input, string const & output)
|
|
|
|
{
|
|
|
|
FileName const ifn(makeAbsPath(input));
|
2015-05-17 15:27:12 +00:00
|
|
|
LayoutFileList & l = LayoutFileList::get();
|
2015-05-14 23:19:50 +00:00
|
|
|
LayoutFileIndex i = onlyFileName(l.addLocalLayout(ifn.onlyFileName(), ifn.onlyPath().absFileName()));
|
2013-05-13 19:53:28 +00:00
|
|
|
if (i.empty()) {
|
|
|
|
cerr << "Could not read layout file " << input << ".layout.\n";
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
LayoutFile const & f = l[i];
|
|
|
|
ostream * os = NULL;
|
|
|
|
if (output == "-")
|
|
|
|
os = &cout;
|
|
|
|
else if (!output.empty())
|
|
|
|
os = new ofstream(output.c_str());
|
|
|
|
bool success = true;
|
|
|
|
for (TextClass::const_iterator it = f.begin(); it != f.end(); ++it) {
|
|
|
|
if (os)
|
|
|
|
it->write(*os);
|
|
|
|
ostringstream oss;
|
|
|
|
it->write(oss);
|
|
|
|
istringstream iss(oss.str());
|
|
|
|
// swallow "Style Standard" line
|
|
|
|
string line;
|
|
|
|
if (getline(iss, line)) {
|
|
|
|
Lexer lex;
|
|
|
|
lex.setStream(iss);
|
|
|
|
Layout test;
|
|
|
|
test.setName(it->name());
|
|
|
|
if (test.read(lex, f)) {
|
|
|
|
// Caution: operator==() is incomplete!
|
|
|
|
// Testing test == *it does not make much sense
|
|
|
|
// therefore.
|
|
|
|
// It does not work either for styles with
|
|
|
|
// non-empty obsoletedby if the obsoletedby
|
|
|
|
// style was modified after the obsolete style
|
|
|
|
// was defined: Layout::write() writes only the
|
|
|
|
// final version, but the obsolete style was
|
|
|
|
// set to the version at the time it was
|
|
|
|
// defined, and therefore they differ. See e.g.
|
|
|
|
// the obsolete style AMS which is replaced by
|
|
|
|
// Subjectclass in amsdefs.inc, and
|
|
|
|
// Subjectclass is modified later in siamltex.layout.
|
|
|
|
ostringstream osstest;
|
|
|
|
test.write(osstest);
|
|
|
|
if (osstest.str() != oss.str()) {
|
|
|
|
cerr << "Round trip for style "
|
|
|
|
<< to_utf8(it->name())
|
|
|
|
<< " failed:\n"
|
|
|
|
<< osstest.str() << oss.str();
|
|
|
|
success = false;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
cerr << "Could not read style "
|
|
|
|
<< to_utf8(it->name()) << ".\n";
|
|
|
|
success = false;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
cerr << "Could not read first line for style "
|
|
|
|
<< to_utf8(it->name()) << ".\n";
|
|
|
|
success = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (output != "-")
|
|
|
|
delete os;
|
|
|
|
return success;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int main(int argc, char * argv[])
|
|
|
|
{
|
2017-04-13 07:38:46 +00:00
|
|
|
os::init(argc, &argv);
|
2013-05-13 19:53:28 +00:00
|
|
|
lyxerr.setStream(cerr);
|
|
|
|
if (argc < 2 || argc > 3) {
|
|
|
|
cerr << "Usage: " << argv[0] << " <input layout file> [<output layout file>]\n";
|
|
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
|
|
|
FileName const exe(makeAbsPath(os::internal_path(os::utf8_argv(0))));
|
|
|
|
string const lyxexe = addName(exe.onlyPath().absFileName(), "lyx");
|
|
|
|
init_package(lyxexe, string(), string());
|
|
|
|
if (test_Layout(argv[1], argc > 2 ? argv[2] : ""))
|
|
|
|
return EXIT_SUCCESS;
|
|
|
|
return EXIT_FAILURE;
|
|
|
|
}
|