X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FTextClass.cpp;h=0ab0c5ce88c1ce31b5ef6a5e0f86606ddfcd9bc8;hb=08f21701cf486a1bbf69e828317b639824604b39;hp=3e74b801dbc2ccd5d912e26bd549dc08b17082c2;hpb=d4634167cc2fa047c5f88d78e46b63459cdd0c85;p=lyx.git
diff --git a/src/TextClass.cpp b/src/TextClass.cpp
index 3e74b801db..0ab0c5ce88 100644
--- a/src/TextClass.cpp
+++ b/src/TextClass.cpp
@@ -60,7 +60,7 @@ namespace lyx {
// development/updatelayouts.sh script, to update the format of
// all of our layout files.
//
-int const LAYOUT_FORMAT = 29;
+int const LAYOUT_FORMAT = 35;
namespace {
@@ -196,6 +196,7 @@ enum TextClassTags {
TC_RIGHTMARGIN,
TC_FLOAT,
TC_COUNTER,
+ TC_NOCOUNTER,
TC_IFCOUNTER,
TC_NOFLOAT,
TC_TITLELATEXNAME,
@@ -233,6 +234,7 @@ namespace {
{ "input", TC_INPUT },
{ "insetlayout", TC_INSETLAYOUT },
{ "leftmargin", TC_LEFTMARGIN },
+ { "nocounter", TC_NOCOUNTER },
{ "nofloat", TC_NOFLOAT },
{ "nostyle", TC_NOSTYLE },
{ "outputformat", TC_OUTPUTFORMAT },
@@ -266,6 +268,29 @@ bool TextClass::convertLayoutFormat(support::FileName const & filename, ReadType
}
+std::string TextClass::convert(std::string const & str)
+{
+ FileName const fn = FileName::tempName("locallayout");
+ ofstream os(fn.toFilesystemEncoding().c_str());
+ os << str;
+ os.close();
+ FileName const tempfile = FileName::tempName("convert_locallayout");
+ bool success = layout2layout(fn, tempfile);
+ if (!success)
+ return "";
+ ifstream is(tempfile.toFilesystemEncoding().c_str());
+ string ret;
+ string tmp;
+ while (!is.eof()) {
+ getline(is, tmp);
+ ret += tmp + '\n';
+ }
+ is.close();
+ tempfile.removeFile();
+ return ret;
+}
+
+
TextClass::ReturnValues TextClass::readWithoutConv(FileName const & filename, ReadType rt)
{
if (!filename.isReadableFile()) {
@@ -301,23 +326,21 @@ bool TextClass::read(FileName const & filename, ReadType rt)
return retval == OK;
bool const worx = convertLayoutFormat(filename, rt);
- if (!worx) {
+ if (!worx)
LYXERR0 ("Unable to convert " << filename <<
" to format " << LAYOUT_FORMAT);
- return false;
- }
- return true;
+ return worx;
}
-bool TextClass::validate(std::string const & str)
+TextClass::ReturnValues TextClass::validate(std::string const & str)
{
TextClass tc;
return tc.read(str, VALIDATION);
}
-bool TextClass::read(std::string const & str, ReadType rt)
+TextClass::ReturnValues TextClass::read(std::string const & str, ReadType rt)
{
Lexer lexrc(textClassTags);
istringstream is(str);
@@ -325,14 +348,14 @@ bool TextClass::read(std::string const & str, ReadType rt)
ReturnValues retval = read(lexrc, rt);
if (retval != FORMAT_MISMATCH)
- return retval == OK;
+ return retval;
// write the layout string to a temporary file
FileName const tempfile = FileName::tempName("TextClass_read");
ofstream os(tempfile.toFilesystemEncoding().c_str());
if (!os) {
LYXERR0("Unable to create temporary file");
- return false;
+ return ERROR;
}
os << str;
os.close();
@@ -342,9 +365,10 @@ bool TextClass::read(std::string const & str, ReadType rt)
if (!worx) {
LYXERR0("Unable to convert internal layout information to format "
<< LAYOUT_FORMAT);
+ return ERROR;
}
tempfile.removeFile();
- return worx;
+ return OK_OLDFORMAT;
}
@@ -652,6 +676,14 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
readCiteFormat(lexrc);
break;
+ case TC_NOCOUNTER:
+ if (lexrc.next()) {
+ docstring const cnt = lexrc.getDocString();
+ if (!counters_.remove(cnt))
+ LYXERR0("Unable to remove counter: " + to_utf8(cnt));
+ }
+ break;
+
case TC_IFCOUNTER:
ifcounter = true;
case TC_COUNTER:
@@ -901,7 +933,8 @@ bool TextClass::readFloat(Lexer & lexrc)
FT_WITHIN,
FT_STYLE,
FT_LISTNAME,
- FT_NEEDSFLOAT,
+ FT_USESFLOAT,
+ FT_PREDEFINED,
FT_HTMLSTYLE,
FT_HTMLATTR,
FT_HTMLTAG,
@@ -917,14 +950,15 @@ bool TextClass::readFloat(Lexer & lexrc)
{ "htmlattr", FT_HTMLATTR },
{ "htmlstyle", FT_HTMLSTYLE },
{ "htmltag", FT_HTMLTAG },
+ { "ispredefined", FT_PREDEFINED },
{ "listcommand", FT_LISTCOMMAND },
{ "listname", FT_LISTNAME },
- { "needsfloatpkg", FT_NEEDSFLOAT },
{ "numberwithin", FT_WITHIN },
{ "placement", FT_PLACEMENT },
{ "refprefix", FT_REFPREFIX },
{ "style", FT_STYLE },
- { "type", FT_TYPE }
+ { "type", FT_TYPE },
+ { "usesfloatpkg", FT_USESFLOAT }
};
lexrc.pushTable(floatTags);
@@ -941,7 +975,8 @@ bool TextClass::readFloat(Lexer & lexrc)
string style;
string type;
string within;
- bool needsfloat = true;
+ bool usesfloat = true;
+ bool ispredefined = false;
bool getout = false;
while (!getout && lexrc.isOK()) {
@@ -965,7 +1000,8 @@ bool TextClass::readFloat(Lexer & lexrc)
style = fl.style();
name = fl.name();
listname = fl.listName();
- needsfloat = fl.needsFloatPkg();
+ usesfloat = fl.usesFloatPkg();
+ ispredefined = fl.isPredefined();
listcommand = fl.listCommand();
refprefix = fl.refPrefix();
}
@@ -1004,9 +1040,13 @@ bool TextClass::readFloat(Lexer & lexrc)
lexrc.next();
listname = lexrc.getString();
break;
- case FT_NEEDSFLOAT:
+ case FT_USESFLOAT:
+ lexrc.next();
+ usesfloat = lexrc.getBool();
+ break;
+ case FT_PREDEFINED:
lexrc.next();
- needsfloat = lexrc.getBool();
+ ispredefined = lexrc.getBool();
break;
case FT_HTMLATTR:
lexrc.next();
@@ -1030,13 +1070,26 @@ bool TextClass::readFloat(Lexer & lexrc)
// Here we have a full float if getout == true
if (getout) {
- if (!needsfloat && listcommand.empty())
- LYXERR0("The layout does not provide a list command " <<
- "for the builtin float `" << type << "'. LyX will " <<
- "not be able to produce a float list.");
+ if (!usesfloat && listcommand.empty()) {
+ // if this float uses the same auxfile as an existing one,
+ // there is no need for it to provide a list command.
+ FloatList::const_iterator it = floatlist_.begin();
+ FloatList::const_iterator en = floatlist_.end();
+ bool found_ext = false;
+ for (; it != en; ++it) {
+ if (it->second.ext() == ext) {
+ found_ext = true;
+ break;
+ }
+ }
+ if (!found_ext)
+ LYXERR0("The layout does not provide a list command " <<
+ "for the float `" << type << "'. LyX will " <<
+ "not be able to produce a float list.");
+ }
Floating fl(type, placement, ext, within, style, name,
listname, listcommand, refprefix,
- htmltag, htmlattr, htmlstyle, needsfloat);
+ htmltag, htmlattr, htmlstyle, usesfloat, ispredefined);
floatlist_.newFloat(fl);
// each float has its own counter
counters_.newCounter(from_ascii(type), from_ascii(within),
@@ -1168,10 +1221,13 @@ bool TextClass::load(string const & path) const
}
-void DocumentClass::addLayoutIfNeeded(docstring const & n) const
+bool DocumentClass::addLayoutIfNeeded(docstring const & n) const
{
- if (!hasLayout(n))
- layoutlist_.push_back(createBasicLayout(n, true));
+ if (hasLayout(n))
+ return false;
+
+ layoutlist_.push_back(createBasicLayout(n, true));
+ return true;
}
@@ -1196,7 +1252,6 @@ InsetLayout const & DocumentClass::insetLayout(docstring const & name) const
docstring const & TextClass::defaultLayoutName() const
{
- // This really should come from the actual layout... (Lgb)
return defaultlayout_;
}
@@ -1298,11 +1353,16 @@ DocumentClass & DocumentClassBundle::makeDocumentClass(
continue;
}
if (!lm->isAvailable()) {
+ docstring const prereqs = from_utf8(getStringFromVector(lm->prerequisites(), "\n\t"));
docstring const msg =
- bformat(_("The module %1$s requires a package that is\n"
- "not available in your LaTeX installation. LaTeX output\n"
- "may not be possible.\n"), from_utf8(modName));
- frontend::Alert::warning(_("Package not available"), msg);
+ bformat(_("The module %1$s requires a package that is not\n"
+ "available in your LaTeX installation, or a converter that\n"
+ "you have not installed. LaTeX output may not be possible.\n"
+ "Missing prerequisites:\n"
+ "\t%2$s\n"
+ "See section 3.1.2.3 (Modules) of the User's Guide for more information."),
+ from_utf8(modName), prereqs);
+ frontend::Alert::warning(_("Package not available"), msg, true);
}
FileName layout_file = libFileSearch("layouts", lm->getFilename());
if (!doc_class.read(layout_file, TextClass::MODULE)) {
@@ -1377,7 +1437,7 @@ Layout const & DocumentClass::htmlTOCLayout() const
string const & DocumentClass::getCiteFormat(string const & entry_type) const
{
- static string default_format = N_("{%author%[[%author%, ]][[{%editor%[[%editor%, ed., ]]}]]}\"%title%\"{%journal%[[, {!!}%journal%{!!}]][[{%publisher%[[, %publisher%]][[{%institution%[[, %institution%]]}]]}]]}{%year%[[ (%year%)]]}{%pages%[[, %pages%]]}.");
+ static string default_format = "{%author%[[%author%, ]][[{%editor%[[%editor%, ed., ]]}]]}\"%title%\"{%journal%[[, {!!}%journal%{!!}]][[{%publisher%[[, %publisher%]][[{%institution%[[, %institution%]]}]]}]]}{%year%[[ (%year%)]]}{%pages%[[, %pages%]]}.";
map::const_iterator it = cite_formats_.find(entry_type);
if (it != cite_formats_.end())