X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxtextclass.C;h=cdda271a71d942a40660e246fcc891867197cc9d;hb=ce7c45bb437c44dae15f96148cb9b793ab0b895c;hp=bc522c40ed5f82f4d9c23b4c0956649c128aca34;hpb=1f5c5a06ee85402345a2dfc62c2ba010137d9e27;p=lyx.git diff --git a/src/lyxtextclass.C b/src/lyxtextclass.C index bc522c40ed..cdda271a71 100644 --- a/src/lyxtextclass.C +++ b/src/lyxtextclass.C @@ -24,14 +24,23 @@ #include "support/lstrings.h" #include "support/lyxlib.h" #include "support/filetools.h" +#include "support/os.h" + +#include +namespace fs = boost::filesystem; #include -using lyx::support::LibFileSearch; -using lyx::support::MakeDisplayPath; -using lyx::support::QuoteName; -using lyx::support::rtrim; -using lyx::support::subst; + +namespace lyx { + +using support::FileName; +using support::libFileSearch; +using support::makeDisplayPath; +using support::quoteName; +using support::rtrim; +using support::subst; +using support::addName; using std::endl; using std::find_if; @@ -56,12 +65,12 @@ private: }; -int const FORMAT = 2; +int const FORMAT = 3; -bool layout2layout(string const & filename, string const & tempfile) +bool layout2layout(FileName const & filename, FileName const & tempfile) { - string const script = LibFileSearch("scripts", "layout2layout.py"); + FileName const script = libFileSearch("scripts", "layout2layout.py"); if (script.empty()) { lyxerr << "Could not find layout conversion " "script layout2layout.py." << endl; @@ -69,15 +78,15 @@ bool layout2layout(string const & filename, string const & tempfile) } std::ostringstream command; - command << "python " << QuoteName(script) - << ' ' << QuoteName(filename) - << ' ' << QuoteName(tempfile); + command << support::os::python() << ' ' << quoteName(script.toFilesystemEncoding()) + << ' ' << quoteName(filename.toFilesystemEncoding()) + << ' ' << quoteName(tempfile.toFilesystemEncoding()); string const command_str = command.str(); lyxerr[Debug::TCLASS] << "Running `" << command_str << '\'' << endl; - lyx::support::cmd_ret const ret = - lyx::support::RunCommand(command_str); + support::cmd_ret const ret = + support::runCommand(command_str); if (ret.first != 0) { lyxerr << "Could not run layout conversion " "script layout2layout.py." << endl; @@ -120,7 +129,7 @@ bool LyXTextClass::isTeXClassAvailable() const bool LyXTextClass::do_readStyle(LyXLex & lexrc, LyXLayout & lay) { lyxerr[Debug::TCLASS] << "Reading style " << lay.name() << endl; - if (!lay.Read(lexrc, *this)) { + if (!lay.read(lexrc, *this)) { // Resolve fonts lay.resfont = lay.font; lay.resfont.realize(defaultfont()); @@ -165,9 +174,9 @@ enum TextClassTags { // Reads a textclass structure from file. -bool LyXTextClass::Read(string const & filename, bool merge) +bool LyXTextClass::read(FileName const & filename, bool merge) { - if (!lyx::support::isFileReadable(filename)) { + if (!support::isFileReadable(filename)) { lyxerr << "Cannot read layout file `" << filename << "'." << endl; return true; @@ -205,11 +214,11 @@ bool LyXTextClass::Read(string const & filename, bool merge) if (!merge) lyxerr[Debug::TCLASS] << "Reading textclass " - << MakeDisplayPath(filename) - << endl; + << to_utf8(makeDisplayPath(filename.absFilename())) + << endl; else lyxerr[Debug::TCLASS] << "Reading input file " - << MakeDisplayPath(filename) + << to_utf8(makeDisplayPath(filename.absFilename())) << endl; LyXLex lexrc(textClassTags, @@ -251,13 +260,17 @@ bool LyXTextClass::Read(string const & filename, bool merge) case TC_INPUT: // Include file if (lexrc.next()) { - string tmp = LibFileSearch("layouts", - lexrc.getString(), + string const inc = lexrc.getString(); + FileName tmp = libFileSearch("layouts", inc, "layout"); - if (Read(tmp, true)) { + if (tmp.empty()) { + lexrc.printError("Could not find input" + "file: " + inc); + error = true; + } else if (read(tmp, true)) { lexrc.printError("Error reading input" - "file: "+tmp); + "file: " + tmp.absFilename()); error = true; } } @@ -367,7 +380,7 @@ bool LyXTextClass::Read(string const & filename, bool merge) break; case TC_PREAMBLE: - preamble_ = lexrc.getLongString("EndPreamble"); + preamble_ = from_utf8(lexrc.getLongString("EndPreamble")); break; case TC_PROVIDESAMSMATH: @@ -432,17 +445,17 @@ bool LyXTextClass::Read(string const & filename, bool merge) if (format != FORMAT) { lyxerr[Debug::TCLASS] << "Converting layout file from format " << format << " to " << FORMAT << endl; - string const tempfile = lyx::support::tempName(); + FileName const tempfile(support::tempName()); error = !layout2layout(filename, tempfile); if (!error) - error = Read(tempfile, merge); - lyx::support::unlink(tempfile); + error = read(tempfile, merge); + support::unlink(tempfile); return error; } if (!merge) { // we are at top level here. lyxerr[Debug::TCLASS] << "Finished reading textclass " - << MakeDisplayPath(filename) + << to_utf8(makeDisplayPath(filename.absFilename())) << endl; if (defaultlayout_.empty()) { lyxerr << "Error: Textclass '" << name_ @@ -472,7 +485,7 @@ bool LyXTextClass::Read(string const & filename, bool merge) } else lyxerr[Debug::TCLASS] << "Finished reading input file " - << MakeDisplayPath(filename) + << to_utf8(makeDisplayPath(filename.absFilename())) << endl; return error; @@ -511,7 +524,6 @@ void LyXTextClass::readOutputType(LyXLex & lexrc) keyword_item outputTypeTags[] = { { "docbook", DOCBOOK }, { "latex", LATEX }, - { "linuxdoc", LINUXDOC }, { "literate", LITERATE } }; @@ -523,7 +535,6 @@ void LyXTextClass::readOutputType(LyXLex & lexrc) lexrc.printError("Unknown output type `$$Token'"); return; case LATEX: - case LINUXDOC: case DOCBOOK: case LITERATE: outputType_ = static_cast(le); @@ -671,7 +682,7 @@ void LyXTextClass::readCharStyle(LyXLex & lexrc, string const & name) cs.latexparam = latexparam; cs.font = font; cs.labelfont = labelfont; - cs.preamble = preamble; + cs.preamble = from_utf8(preamble); charstyles().push_back(cs); } @@ -796,8 +807,8 @@ void LyXTextClass::readCounter(LyXLex & lexrc) lexrc.pushTable(counterTags, CT_END); - string name; - string within; + docstring name; + docstring within; bool getout = false; while (!getout && lexrc.isOK()) { @@ -811,11 +822,11 @@ void LyXTextClass::readCounter(LyXLex & lexrc) switch (static_cast(le)) { case CT_NAME: lexrc.next(); - name = lexrc.getString(); + name = from_ascii(lexrc.getString()); break; case CT_WITHIN: lexrc.next(); - within = lexrc.getString(); + within = from_ascii(lexrc.getString()); if (within == "none") within.erase(); break; @@ -827,11 +838,10 @@ void LyXTextClass::readCounter(LyXLex & lexrc) // Here if have a full counter if getout == true if (getout) { - if (within.empty()) { + if (within.empty()) ctrs_->newCounter(name); - } else { + else ctrs_->newCounter(name, within); - } } lexrc.popTable(); @@ -910,18 +920,22 @@ bool LyXTextClass::delete_layout(string const & name) // Load textclass info if not loaded yet -bool LyXTextClass::load() const +bool LyXTextClass::load(string const & path) const { if (loaded_) return true; - // Read style-file - string const real_file = LibFileSearch("layouts", name_, "layout"); - loaded_ = const_cast(this)->Read(real_file) == 0; + // Read style-file, provided path is searched before the system ones + FileName layout_file; + if (!path.empty()) + layout_file = FileName(addName(path, name_ + ".layout")); + if (layout_file.empty() || !fs::exists(layout_file.toFilesystemEncoding())) + layout_file = libFileSearch("layouts", name_, "layout"); + loaded_ = const_cast(this)->read(layout_file) == 0; if (!loaded_) { lyxerr << "Error reading `" - << MakeDisplayPath(real_file) + << to_utf8(makeDisplayPath(layout_file.absFilename())) << "'\n(Check `" << name_ << "')\nCheck your installation and " "try Options/Reconfigure..." << endl; @@ -1023,7 +1037,7 @@ string const & LyXTextClass::pagestyle() const } -string const & LyXTextClass::preamble() const +docstring const & LyXTextClass::preamble() const { return preamble_; } @@ -1113,3 +1127,6 @@ ostream & operator<<(ostream & os, LyXTextClass::PageSides p) } return os; } + + +} // namespace lyx