When pasting as LaTeX, honor textclass and modules

There are several small parts that are needed here:

* Implement LayoutModuleList::asString() that returns a comma-separated
  list of modules.

* in Converter::convert(), handle the new tokens $$c for the current
  textclass and $$m for the list of modules.

* in Buffer::importFile(), pass the current buffer as parameter instead
  of nullptr.

* in pasteClipboardText(), copy the parameters of the current buffer to
  the internal one used for importation, so that the textclass and
  modules information is available to convert().

* finally, modify configure.py to pass "-c $$c -m $$m" to tex2lyx for
  the latexclipoard->lyx converter.

Fixes bug #11312.
This commit is contained in:
Jean-Marc Lasgouttes 2022-07-18 00:50:33 +02:00
parent f771f77c67
commit 96e7fcd4e0
6 changed files with 30 additions and 4 deletions

View File

@ -901,7 +901,7 @@ def checkConverterEntries():
path, t2l = checkProg('a LaTeX/Noweb -> LyX converter', [quoteIfSpace(in_binary_subdir), quoteIfSpace(in_binary_subdir + version_suffix), quoteIfSpace(in_binary_dir), quoteIfSpace(in_binary_dir + version_suffix), 'tex2lyx' + version_suffix, 'tex2lyx'],
rc_entry = [r'''\converter latex lyx "%% -f $$i $$o" ""
\converter latexclipboard lyx "%% -fixedenc utf8 -f $$i $$o" ""
\converter latexclipboard lyx "%% -fixedenc utf8 -c $$c -m $$m -f $$i $$o" ""
\converter literate lyx "%% -n -m noweb -f $$i $$o" ""
\converter sweave lyx "%% -n -m sweave -f $$i $$o" ""
\converter knitr lyx "%% -n -m knitr -f $$i $$o" ""'''], not_found = 'tex2lyx')

View File

@ -1145,7 +1145,7 @@ bool Buffer::importFile(string const & format, FileName const & name, ErrorList
FileName const lyx = tempFileName("Buffer_importFileXXXXXX.lyx");
Converters::RetVal const retval =
theConverters().convert(nullptr, name, lyx, name, format, "lyx", errorList);
theConverters().convert(this, name, lyx, name, format, "lyx", errorList);
if (retval == Converters::SUCCESS) {
bool const success = readFile(lyx) == ReadSuccess;
removeTempFile(lyx);

View File

@ -15,6 +15,7 @@
#include "Buffer.h"
#include "BufferParams.h"
#include "ConverterCache.h"
#include "TextClass.h"
#include "Encoding.h"
#include "ErrorList.h"
#include "Format.h"
@ -58,6 +59,8 @@ string const token_to("$$o");
string const token_path("$$p");
string const token_orig_path("$$r");
string const token_orig_from("$$f");
string const token_textclass("$$c");
string const token_modules("$$m");
string const token_encoding("$$e");
string const token_latex_encoding("$$E");
string const token_python("$${python}");
@ -472,7 +475,7 @@ Converters::RetVal Converters::convert(Buffer const * buffer,
return FAILURE;
}
// buffer is only invalid for importing, and then runparams is not
// buffer can only be null for importing, and then runparams is not
// used anyway.
OutputParams runparams(buffer ? &buffer->params().encoding() : nullptr);
runparams.flavor = getFlavor(edgepath, buffer);
@ -649,7 +652,15 @@ Converters::RetVal Converters::convert(Buffer const * buffer,
command = subst(command, token_path, quoteName(onlyPath(infile.absFileName())));
command = subst(command, token_orig_path, quoteName(onlyPath(orig_from.absFileName())));
command = subst(command, token_orig_from, quoteName(onlyFileName(orig_from.absFileName())));
command = subst(command, token_encoding, buffer ? buffer->params().encoding().iconvName() : string());
command = subst(command, token_textclass,
buffer ? quoteName(buffer->params().documentClass().name())
: string());
command = subst(command, token_modules,
buffer ? quoteName(buffer->params().getModules().asString())
: string());
command = subst(command, token_encoding,
buffer ? quoteName(buffer->params().encoding().iconvName())
: string());
command = subst(command, token_python, os::python());
if (!conv.parselog().empty())

View File

@ -1299,6 +1299,7 @@ bool pasteClipboardText(Cursor & cur, ErrorList & errorList, bool asParagraphs,
Buffer buffer(string(), false);
buffer.setInternal(true);
buffer.setUnnamed(true);
buffer.params() = cur.buffer()->params();
available = buffer.importString(names[i], text, errorList);
if (available)
available = !buffer.paragraphs().empty();

View File

@ -53,6 +53,18 @@ bool LayoutModuleList::adaptToBaseClass(LayoutFile const * const lay,
}
string LayoutModuleList::asString() const
{
string mods;
for (auto const & mod : lml_)
mods += mod + ',';
// remove trailing comma
if (!mods.empty())
mods.pop_back();
return mods;
}
bool LayoutModuleList::moduleCanBeAdded(string const & modName,
LayoutFile const * const lay) const
{

View File

@ -55,6 +55,8 @@ public:
/// This is needed in GuiDocument. It seems better than an
/// implicit conversion.
std::list<std::string> const & list() const { return lml_; }
/// List of modules as a comma-separated string
std::string asString() const;
/// Checks to make sure module's requriements are satisfied, that it does
/// not conflict with already-present modules, isn't already loaded, etc.
bool moduleCanBeAdded(std::string const & modName,