* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
- * \author Lars Gullik Bjønnes
+ * \author Lars Gullik Bjønnes
*
* Full author contact details are available in file CREDITS.
*/
#include "LaTeX.h"
#include "LaTeXFeatures.h"
#include "LyXAction.h"
-#include "LyXLex.h"
-#include "LyXText.h"
+#include "Lexer.h"
+#include "Text.h"
+#include "LyX.h"
#include "LyXRC.h"
#include "LyXVC.h"
#include "Messages.h"
#include "insets/InsetText.h"
#include "mathed/MathMacroTemplate.h"
-#include "mathed/MathMacroTable.h"
+#include "mathed/MacroTable.h"
#include "mathed/MathSupport.h"
-#include "frontends/Alert.h"
+#include "frontends/alert.h"
#include "graphics/Previews.h"
#include "support/fs_extras.h"
#include "support/lyxlib.h"
#include "support/os.h"
-#include "support/path.h"
+#include "support/Path.h"
#include "support/textutils.h"
#include "support/convert.h"
namespace {
-int const LYX_FORMAT = 264;
+int const LYX_FORMAT = 271;
} // namespace anon
*/
bool file_fully_loaded;
- /// our LyXText that should be wrapped in an InsetText
+ /// our Text that should be wrapped in an InsetText
InsetText inset;
///
}
-LyXText & Buffer::text() const
+Text & Buffer::text() const
{
- return const_cast<LyXText &>(pimpl_->inset.text_);
+ return const_cast<Text &>(pimpl_->inset.text_);
}
-InsetBase & Buffer::inset() const
+Inset & Buffer::inset() const
{
return const_cast<InsetText &>(pimpl_->inset);
}
} // anon
-int Buffer::readHeader(LyXLex & lex)
+int Buffer::readHeader(Lexer & lex)
{
int unknown_tokens = 0;
int line = -1;
// Uwe C. Schroeder
// changed to be public and have one parameter
// Returns false if "\end_document" is not read (Asger)
-bool Buffer::readDocument(LyXLex & lex)
+bool Buffer::readDocument(Lexer & lex)
{
ErrorList & errorList = errorLists_["Parse"];
errorList.clear();
BOOST_ASSERT(paragraphs().empty());
readHeader(lex);
- if (!params().getLyXTextClass().load(filePath())) {
- string theclass = params().getLyXTextClass().name();
+ if (!params().getTextClass().load(filePath())) {
+ string theclass = params().getTextClass().name();
Alert::error(_("Can't load document class"), bformat(
_("Using the default document class, because the "
"class %1$s could not be loaded."), from_utf8(theclass)));
params().textclass = 0;
}
+ if (params().outputChanges) {
+ bool dvipost = LaTeXFeatures::isAvailable("dvipost");
+ bool xcolorsoul = LaTeXFeatures::isAvailable("soul") &&
+ LaTeXFeatures::isAvailable("xcolor");
+
+ if (!dvipost && !xcolorsoul) {
+ Alert::warning(_("Changes not shown in LaTeX output"),
+ _("Changes will not be highlighted in LaTeX output, "
+ "because neither dvipost nor xcolor/soul are installed.\n"
+ "Please install these packages or redefine "
+ "\\lyxadded and \\lyxdeleted in the LaTeX preamble."));
+ } else if (!xcolorsoul) {
+ Alert::warning(_("Changes not shown in LaTeX output"),
+ _("Changes will not be highlighted in LaTeX output "
+ "when using pdflatex, because xcolor and soul are not installed.\n"
+ "Please install both packages or redefine "
+ "\\lyxadded and \\lyxdeleted in the LaTeX preamble."));
+ }
+ }
+
bool const res = text().read(*this, lex, errorList);
for_each(text().paragraphs().begin(),
text().paragraphs().end(),
// needed to insert the selection
void Buffer::insertStringAsLines(ParagraphList & pars,
pit_type & pit, pos_type & pos,
- LyXFont const & fn, docstring const & str, bool autobreakrows)
+ Font const & fn, docstring const & str, bool autobreakrows)
{
- LyXFont font = fn;
+ Font font = fn;
// insert the string, don't insert doublespace
bool space_inserted = true;
// remove dummy empty par
paragraphs().clear();
- LyXLex lex(0, 0);
+ Lexer lex(0, 0);
std::istringstream is(s);
lex.setStream(is);
FileName const name(tempName());
// remove dummy empty par
paragraphs().clear();
- LyXLex lex(0, 0);
+ Lexer lex(0, 0);
lex.setFile(filename);
if (readFile(lex, filename) != success)
return false;
}
-Buffer::ReadStatus Buffer::readFile(LyXLex & lex, FileName const & filename,
+Buffer::ReadStatus Buffer::readFile(Lexer & lex, FileName const & filename,
bool fromstring)
{
BOOST_ASSERT(!filename.empty());
if (!openFileWrite(ofs, fname))
return false;
+ bool failed_export = false;
try {
writeLaTeXSource(ofs, original_path,
runparams, output_preamble, output_body);
}
- catch (iconv_codecvt_facet_exception &) {
- Alert::error(_("Encoding error"),
- _("Some characters of your document are not "
- "representable in the chosen encoding.\n"
- "Changing the document encoding to utf8 could help."));
- return false;
+ catch (iconv_codecvt_facet_exception & e) {
+ lyxerr << "Caught iconv exception: " << e.what() << endl;
+ failed_export = true;
+ }
+ catch (std::exception const & e) {
+ lyxerr << "Caught \"normal\" exception: " << e.what() << endl;
+ failed_export = true;
+ }
+ catch (...) {
+ lyxerr << "Caught some really weird exception..." << endl;
+ LyX::cref().emergencyCleanup();
+ abort();
}
ofs.close();
if (ofs.fail()) {
+ failed_export = true;
lyxerr << "File '" << fname << "' was not closed properly." << endl;
- Alert::error(_("Error closing file"),
- _("The output file could not be closed properly.\n"
- " Probably some characters of your document are not "
- "representable in the chosen encoding.\n"
- "Changing the document encoding to utf8 could help."));
+ }
+
+ if (failed_export) {
+ Alert::error(_("Encoding error"),
+ _("Some characters of your document are probably not "
+ "representable in the chosen encoding.\n"
+ "Changing the document encoding to utf8 could help."));
return false;
}
return true;
} // output_preamble
LYXERR(Debug::INFO) << "preamble finished, now the body." << endl;
- if (!lyxrc.language_auto_begin) {
+ if (!lyxrc.language_auto_begin &&
+ !params().language->babel().empty()) {
// FIXME UNICODE
os << from_utf8(subst(lyxrc.language_command_begin,
"$$lang",
texrow().newline();
}
+ Encoding const & encoding = params().encoding();
+ if (encoding.package() == Encoding::CJK) {
+ // Open a CJK environment, since in contrast to the encodings
+ // handled by inputenc the document encoding is not set in
+ // the preamble if it is handled by CJK.sty.
+ os << "\\begin{CJK}{" << from_ascii(encoding.latexName())
+ << "}{}\n";
+ texrow().newline();
+ }
+
// if we are doing a real file with body, even if this is the
// child of some other buffer, let's cut the link here.
// This happens for example if only a child document is printed.
os << endl;
texrow().newline();
- if (!lyxrc.language_auto_end) {
+ if (encoding.package() == Encoding::CJK) {
+ // Close the open CJK environment.
+ // latexParagraphs will have opened one even if the last text
+ // was not CJK.
+ os << "\\end{CJK}\n";
+ texrow().newline();
+ }
+
+ if (!lyxrc.language_auto_end &&
+ !params().language->babel().empty()) {
os << from_utf8(subst(lyxrc.language_command_end,
"$$lang",
params().language->babel()))
bool Buffer::isLatex() const
{
- return params().getLyXTextClass().outputType() == LATEX;
+ return params().getTextClass().outputType() == LATEX;
}
bool Buffer::isLiterate() const
{
- return params().getLyXTextClass().outputType() == LITERATE;
+ return params().getTextClass().outputType() == LITERATE;
}
bool Buffer::isDocBook() const
{
- return params().getLyXTextClass().outputType() == DOCBOOK;
+ return params().getTextClass().outputType() == DOCBOOK;
}
texrow().reset();
- LyXTextClass const & tclass = params().getLyXTextClass();
+ TextClass const & tclass = params().getTextClass();
string const top_element = tclass.latexname();
if (!only_body) {
<< " file was created by LyX " << lyx_version
<< "\n See http://www.lyx.org/ for more information -->\n";
- params().getLyXTextClass().counters().reset();
+ params().getTextClass().counters().reset();
sgml::openTag(os, top);
os << '\n';
void Buffer::validate(LaTeXFeatures & features) const
{
- LyXTextClass const & tclass = params().getLyXTextClass();
-
- if (features.isAvailable("dvipost") && params().outputChanges)
- features.require("dvipost");
+ TextClass const & tclass = params().getTextClass();
+
+ if (params().outputChanges) {
+ bool dvipost = LaTeXFeatures::isAvailable("dvipost");
+ bool xcolorsoul = LaTeXFeatures::isAvailable("soul") &&
+ LaTeXFeatures::isAvailable("xcolor");
+
+ if (features.runparams().flavor == OutputParams::LATEX) {
+ if (dvipost) {
+ features.require("ct-dvipost");
+ features.require("dvipost");
+ } else if (xcolorsoul) {
+ features.require("ct-xcolor-soul");
+ features.require("soul");
+ features.require("xcolor");
+ } else {
+ features.require("ct-none");
+ }
+ } else if (features.runparams().flavor == OutputParams::PDFLATEX ) {
+ if (xcolorsoul) {
+ features.require("ct-xcolor-soul");
+ features.require("soul");
+ features.require("xcolor");
+ features.require("pdfcolmk"); // improves color handling in PDF output
+ } else {
+ features.require("ct-none");
+ }
+ }
+ }
// AMS Style is at document level
if (params().use_amsmath == BufferParams::package_on
}
for (InsetIterator it = inset_iterator_begin(inset()); it; ++it) {
- if (it->lyxCode() == InsetBase::BIBTEX_CODE) {
+ if (it->lyxCode() == Inset::BIBTEX_CODE) {
InsetBibtex const & inset =
static_cast<InsetBibtex const &>(*it);
inset.fillWithBibKeys(*this, keys);
- } else if (it->lyxCode() == InsetBase::INCLUDE_CODE) {
+ } else if (it->lyxCode() == Inset::INCLUDE_CODE) {
InsetInclude const & inset =
static_cast<InsetInclude const &>(*it);
inset.fillWithBibKeys(*this, keys);
- } else if (it->lyxCode() == InsetBase::BIBITEM_CODE) {
+ } else if (it->lyxCode() == Inset::BIBITEM_CODE) {
InsetBibitem const & inset =
static_cast<InsetBibitem const &>(*it);
// FIXME UNICODE
bibfilesCache_.clear();
for (InsetIterator it = inset_iterator_begin(inset()); it; ++it) {
- if (it->lyxCode() == InsetBase::BIBTEX_CODE) {
+ if (it->lyxCode() == Inset::BIBTEX_CODE) {
InsetBibtex const & inset =
static_cast<InsetBibtex const &>(*it);
vector<FileName> const bibfiles = inset.getFiles(*this);
bibfilesCache_.insert(bibfilesCache_.end(),
bibfiles.begin(),
bibfiles.end());
- } else if (it->lyxCode() == InsetBase::INCLUDE_CODE) {
+ } else if (it->lyxCode() == Inset::INCLUDE_CODE) {
InsetInclude & inset =
static_cast<InsetInclude &>(*it);
inset.updateBibfilesCache(*this);
docstring const Buffer::B_(string const & l10n) const
{
- Language const * lang = pimpl_->params.language;
- if (lang)
- return getMessages(lang->code()).get(l10n);
-
- return _(l10n);
+ return params().B_(l10n);
}
if (!params().parentname.empty()
&& theBufferList().exists(params().parentname)) {
Buffer const * buf = theBufferList().getBuffer(params().parentname);
- if (buf)
+ //We need to check if the parent is us...
+ //FIXME RECURSIVE INCLUDE
+ //This is not sufficient, since recursive includes could be downstream.
+ if (buf && buf != this)
return buf->getMasterBuffer();
}
InsetList::const_iterator end = insets.end();
for ( ; it != end; ++it) {
//lyxerr << "found inset code " << it->inset->lyxCode() << std::endl;
- if (it->inset->lyxCode() == InsetBase::MATHMACRO_CODE) {
+ if (it->inset->lyxCode() == Inset::MATHMACRO_CODE) {
MathMacroTemplate const & mac
= static_cast<MathMacroTemplate const &>(*it->inset);
insertMacro(mac.name(), mac.asMacroData());
void Buffer::changeRefsIfUnique(docstring const & from, docstring const & to,
- InsetBase::Code code)
+ Inset::Code code)
{
//FIXME: This does not work for child documents yet.
- BOOST_ASSERT(code == InsetBase::CITE_CODE || code == InsetBase::REF_CODE);
+ BOOST_ASSERT(code == Inset::CITE_CODE || code == Inset::REF_CODE);
// Check if the label 'from' appears more than once
vector<docstring> labels;
- if (code == InsetBase::CITE_CODE) {
+ if (code == Inset::CITE_CODE) {
vector<pair<string, docstring> > keys;
fillWithBibKeys(keys);
vector<pair<string, docstring> >::const_iterator bit = keys.begin();