X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxtextclass.C;h=ffcf4741761976e09c2dbf8b44588daeeaa886f6;hb=6c2e78e12855d8661eb289ded3dc8722748863b8;hp=6d74da3b1671288fa01282d77ecc0ba993df9875;hpb=2b6b957d3ed8931b5ab281befef549a4ef7e0236;p=lyx.git diff --git a/src/lyxtextclass.C b/src/lyxtextclass.C index 6d74da3b16..ffcf474176 100644 --- a/src/lyxtextclass.C +++ b/src/lyxtextclass.C @@ -22,10 +22,14 @@ #include "FloatList.h" #include "support/lstrings.h" +#include "support/lyxlib.h" #include "support/filetools.h" +#include + using lyx::support::LibFileSearch; using lyx::support::MakeDisplayPath; +using lyx::support::QuoteName; using lyx::support::rtrim; using lyx::support::subst; @@ -51,6 +55,37 @@ private: string name_; }; + +int const FORMAT = 2; + + +bool layout2layout(string const & filename, string const & tempfile) +{ + string const script = LibFileSearch("scripts", "layout2layout.py"); + if (script.empty()) { + lyxerr << "Could not find layout conversion " + "script layout2layout.py." << endl; + return false; + } + + std::ostringstream command; + command << "python " << QuoteName(script) + << ' ' << QuoteName(filename) + << ' ' << QuoteName(tempfile); + string const command_str = command.str(); + + lyxerr[Debug::TCLASS] << "Running `" << command_str << '\'' << endl; + + lyx::support::cmd_ret const ret = + lyx::support::RunCommand(command_str); + if (ret.first != 0) { + lyxerr << "Could not run layout conversion " + "script layout2layout.py." << endl; + return false; + } + return true; +} + } // namespace anon @@ -124,12 +159,20 @@ enum TextClassTags { TC_COUNTER, TC_NOFLOAT, TC_TITLELATEXNAME, - TC_TITLELATEXTYPE + TC_TITLELATEXTYPE, + TC_FORMAT }; + // Reads a textclass structure from file. bool LyXTextClass::Read(string const & filename, bool merge) { + if (!lyx::support::IsFileReadable(filename)) { + lyxerr << "Cannot read layout file `" << filename << "'." + << endl; + return true; + } + keyword_item textClassTags[] = { { "charstyle", TC_CHARSTYLE }, { "classoptions", TC_CLASSOPTIONS }, @@ -139,6 +182,7 @@ bool LyXTextClass::Read(string const & filename, bool merge) { "defaultstyle", TC_DEFAULTSTYLE }, { "environment", TC_ENVIRONMENT }, { "float", TC_FLOAT }, + { "format", TC_FORMAT }, { "input", TC_INPUT }, { "leftmargin", TC_LEFTMARGIN }, { "nofloat", TC_NOFLOAT }, @@ -170,10 +214,12 @@ bool LyXTextClass::Read(string const & filename, bool merge) LyXLex lexrc(textClassTags, sizeof(textClassTags) / sizeof(textClassTags[0])); - bool error = false; lexrc.setFile(filename); - if (!lexrc.isOK()) error = true; + bool error = !lexrc.isOK(); + + // Format of files before the 'Format' tag was introduced + int format = 1; // parsing while (lexrc.isOK() && !error) { @@ -194,6 +240,11 @@ bool LyXTextClass::Read(string const & filename, bool merge) switch (static_cast(le)) { + case TC_FORMAT: + if (lexrc.next()) + format = lexrc.getInteger(); + break; + case TC_OUTPUTTYPE: // output type definition readOutputType(lexrc); break; @@ -233,7 +284,8 @@ bool LyXTextClass::Read(string const & filename, bool merge) lay.setName(name); if (le == TC_ENVIRONMENT) lay.is_environment = true; - if (!(error = do_readStyle(lexrc, lay))) + error = do_readStyle(lexrc, lay); + if (!error) layoutlist_.push_back( boost::shared_ptr(new LyXLayout(lay)) ); @@ -373,6 +425,19 @@ bool LyXTextClass::Read(string const & filename, bool merge) } break; } + if (format != FORMAT) + break; + } + + if (format != FORMAT) { + lyxerr[Debug::TCLASS] << "Converting layout file from format " + << format << " to " << FORMAT << endl; + string const tempfile = lyx::support::tempName(); + error = !layout2layout(filename, tempfile); + if (!error) + error = Read(tempfile, merge); + lyx::support::unlink(tempfile); + return error; } if (!merge) { // we are at top level here. @@ -395,16 +460,16 @@ bool LyXTextClass::Read(string const & filename, bool merge) if (min_toclevel_ == LyXLayout::NOT_IN_TOC) min_toclevel_ = toclevel; else - min_toclevel_ = std::min(min_toclevel_, + min_toclevel_ = std::min(min_toclevel_, toclevel); - max_toclevel_ = std::max(max_toclevel_, + max_toclevel_ = std::max(max_toclevel_, toclevel); } } - lyxerr[Debug::TCLASS] + lyxerr[Debug::TCLASS] << "Minimum TocLevel is " << min_toclevel_ << ", maximum is " << max_toclevel_ <