#include "InsetERT.h"
-#include "Buffer.h"
-#include "BufferParams.h"
-#include "BufferView.h"
#include "Cursor.h"
-#include "DispatchResult.h"
#include "FuncRequest.h"
#include "FuncStatus.h"
+#include "InsetLayout.h"
#include "Language.h"
-#include "Layout.h"
#include "Lexer.h"
-#include "LyXAction.h"
-#include "OutputParams.h"
+#include "xml.h"
#include "ParagraphParameters.h"
#include "Paragraph.h"
-#include "TextClass.h"
+#include "output_docbook.h"
-#include "frontends/alert.h"
-#include "frontends/Application.h"
-
-#include "support/debug.h"
+#include "support/docstream.h"
#include "support/gettext.h"
#include "support/lstrings.h"
+#include "support/TempFile.h"
#include <sstream>
+#include <iostream>
+
using namespace std;
using namespace lyx::support;
namespace lyx {
InsetERT::InsetERT(Buffer * buf, CollapseStatus status)
- : InsetCollapsable(buf)
+ : InsetCollapsible(buf)
{
status_ = status;
}
+InsetERT::InsetERT(InsetERT const & old)
+ : InsetCollapsible(old)
+{}
+
+
void InsetERT::write(ostream & os) const
{
os << "ERT" << "\n";
- InsetCollapsable::write(os);
+ InsetCollapsible::write(os);
}
-int InsetERT::plaintext(odocstream & os, OutputParams const & rp) const
+int InsetERT::plaintext(odocstringstream & os,
+ OutputParams const & rp, size_t max_length) const
{
if (!rp.inIndexEntry)
// do not output TeX code
ParagraphList::const_iterator par = paragraphs().begin();
ParagraphList::const_iterator end = paragraphs().end();
- while (par != end) {
+ while (par != end && os.str().size() <= max_length) {
pos_type siz = par->size();
for (pos_type i = 0; i < siz; ++i) {
char_type const c = par->getChar(i);
}
-int InsetERT::docbook(odocstream & os, OutputParams const &) const
+void InsetERT::docbook(XMLStream & xs, OutputParams const & runparams) const
{
- // FIXME can we do the same thing here as for LaTeX?
- ParagraphList::const_iterator par = paragraphs().begin();
- ParagraphList::const_iterator end = paragraphs().end();
+ auto const begin = paragraphs().begin();
+ auto par = begin;
+ auto const end = paragraphs().end();
+
+ odocstringstream os; // No need for XML handling here.
+
+ // Recreate the logic of makeParagraph in output_docbook.cpp, but much simplified: never open <para>
+ // in an ERT, use simple line breaks.
+ // New line after each paragraph of the ERT, save the last one.
+ while (true) { // For each paragraph in the ERT...
+ std::vector<docstring> pars_prepend;
+ std::vector<docstring> pars;
+ std::vector<docstring> pars_append;
+ tie(pars_prepend, pars, pars_append) = par->simpleDocBookOnePar(buffer(), runparams, text().outerFont(distance(begin, par)), 0, false, true);
+
+ for (docstring const & parXML : pars_prepend)
+ xs << XMLStream::ESCAPE_NONE << parXML;
+ auto p = pars.begin();
+ while (true) { // For each line of this ERT paragraph...
+ os << *p;
+ ++p;
+ if (p != pars.end())
+ os << "\n";
+ else
+ break;
+ }
+ for (docstring const & parXML : pars_append)
+ xs << XMLStream::ESCAPE_NONE << parXML;
- int lines = 0;
- while (par != end) {
- pos_type siz = par->size();
- for (pos_type i = 0; i < siz; ++i)
- os.put(par->getChar(i));
++par;
- if (par != end) {
+ if (par != end)
os << "\n";
- ++lines;
- }
+ else
+ break;
}
- return lines;
+// // Implement the special case of \and: split the current item.
+// if (os.str() == "\\and" || os.str() == "\\and ") {
+// auto lay = getLayout();
+// }
+
+ // Output the ERT as a comment with the appropriate escaping if the command is not recognised.
+ if (trim(os.str()) == from_ascii("\\textquotesingle")) {
+ xs << "'";
+ } else {
+ xs << XMLStream::ESCAPE_NONE << "<!-- ";
+ xs << XMLStream::ESCAPE_COMMENTS << os.str();
+ xs << XMLStream::ESCAPE_NONE << " -->";
+ }
}
void InsetERT::doDispatch(Cursor & cur, FuncRequest & cmd)
{
switch (cmd.action()) {
- case LFUN_INSET_MODIFY: {
- setStatus(cur, string2params(to_utf8(cmd.argument())));
- break;
- }
+ case LFUN_INSET_MODIFY:
+ if (cmd.getArg(0) == "ert") {
+ cur.recordUndoInset(this);
+ setStatus(cur, string2params(to_utf8(cmd.argument())));
+ break;
+ }
+ //fall-through
default:
- InsetCollapsable::doDispatch(cur, cmd);
+ InsetCollapsible::doDispatch(cur, cmd);
break;
}
+
}
FuncStatus & status) const
{
switch (cmd.action()) {
+ case LFUN_INSET_INSERT:
+ status.setEnabled(false);
+ return true;
case LFUN_INSET_MODIFY:
if (cmd.getArg(0) == "ert") {
status.setEnabled(true);
//fall through
default:
- return InsetCollapsable::getStatus(cur, cmd, status);
+ return InsetCollapsible::getStatus(cur, cmd, status);
}
}
+
docstring const InsetERT::buttonLabel(BufferView const & bv) const
{
- if (decoration() == InsetLayout::CLASSIC)
- return isOpen(bv) ? _("ERT") : getNewLabel(_("ERT"));
- else
- return getNewLabel(_("ERT"));
+ // U+1F512 LOCK
+ docstring const locked = tempfile_ ? docstring(1, 0x1F512) : docstring();
+ if (decoration() == InsetDecoration::CLASSIC)
+ return locked + (isOpen(bv) ? _("ERT") : getNewLabel(_("ERT")));
+ return locked + getNewLabel(_("ERT"));
}
-InsetCollapsable::CollapseStatus InsetERT::string2params(string const & in)
+InsetCollapsible::CollapseStatus InsetERT::string2params(string const & in)
{
if (in.empty())
return Collapsed;
}
-docstring InsetERT::xhtml(XHTMLStream &, OutputParams const &) const
+docstring InsetERT::xhtml(XMLStream &, OutputParams const &) const
{
return docstring();
}