mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-26 03:11:59 +00:00
Encodings: Split off the functions that need Buffer
This is needed to be able to use Encodings in tex2lyx without the need to compile Buffer as well, or to use a TEX2LYX define.
This commit is contained in:
parent
01e94f5e03
commit
2e23774c6c
109
src/BufferEncodings.cpp
Normal file
109
src/BufferEncodings.cpp
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
/**
|
||||||
|
* \file BufferEncodings.cpp
|
||||||
|
* This file is part of LyX, the document processor.
|
||||||
|
* Licence details can be found in the file COPYING.
|
||||||
|
*
|
||||||
|
* \author Lars Gullik Bjønnes
|
||||||
|
* \author Jean-Marc Lasgouttes
|
||||||
|
* \author Dekel Tsur
|
||||||
|
* \author Stephan Witt
|
||||||
|
*
|
||||||
|
* Full author contact details are available in file CREDITS.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "BufferEncodings.h"
|
||||||
|
|
||||||
|
#include "Buffer.h"
|
||||||
|
#include "InsetIterator.h"
|
||||||
|
#include "LaTeXFeatures.h"
|
||||||
|
|
||||||
|
#include "support/lstrings.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace lyx::support;
|
||||||
|
|
||||||
|
namespace lyx {
|
||||||
|
|
||||||
|
void BufferEncodings::initUnicodeMath(Buffer const & buffer, bool for_master)
|
||||||
|
{
|
||||||
|
if (for_master) {
|
||||||
|
mathcmd.clear();
|
||||||
|
textcmd.clear();
|
||||||
|
mathsym.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check this buffer
|
||||||
|
Inset & inset = buffer.inset();
|
||||||
|
InsetIterator it = inset_iterator_begin(inset);
|
||||||
|
InsetIterator const end = inset_iterator_end(inset);
|
||||||
|
for (; it != end; ++it)
|
||||||
|
it->initUnicodeMath();
|
||||||
|
|
||||||
|
if (!for_master)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Check children
|
||||||
|
ListOfBuffers blist = buffer.getDescendents();
|
||||||
|
ListOfBuffers::const_iterator bit = blist.begin();
|
||||||
|
ListOfBuffers::const_iterator const bend = blist.end();
|
||||||
|
for (; bit != bend; ++bit)
|
||||||
|
initUnicodeMath(**bit, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BufferEncodings::validate(char_type c, LaTeXFeatures & features, bool for_mathed)
|
||||||
|
{
|
||||||
|
CharInfo const & ci = Encodings::unicodeCharInfo(c);
|
||||||
|
if (ci.isUnicodeSymbol()) {
|
||||||
|
// In mathed, c could be used both in textmode and mathmode
|
||||||
|
docstring const textcommand = ci.textcommand;
|
||||||
|
bool const math_mode = for_mathed && isMathCmd(c);
|
||||||
|
bool const use_math = math_mode ||
|
||||||
|
(!for_mathed && textcommand.empty());
|
||||||
|
bool const use_text = (for_mathed && isTextCmd(c)) ||
|
||||||
|
(!for_mathed && !textcommand.empty());
|
||||||
|
bool const plain_utf8 = (features.runparams().encoding->name() == "utf8-plain");
|
||||||
|
bool const unicode_math = (features.isRequired("unicode-math")
|
||||||
|
&& features.isAvailable("unicode-math"));
|
||||||
|
// with utf8-plain, we only load packages when in mathed (see #7766)
|
||||||
|
// and if we do not use unicode-math
|
||||||
|
if ((math_mode && !unicode_math)
|
||||||
|
|| (use_math && !plain_utf8)) {
|
||||||
|
string const mathpreamble = ci.mathpreamble;
|
||||||
|
if (!mathpreamble.empty()) {
|
||||||
|
if (ci.mathfeature()) {
|
||||||
|
string feats = mathpreamble;
|
||||||
|
while (!feats.empty()) {
|
||||||
|
string feat;
|
||||||
|
feats = split(feats, feat, ',');
|
||||||
|
features.require(feat);
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
features.addPreambleSnippet(mathpreamble);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// with utf8-plain, we do not load packages (see #7766)
|
||||||
|
if (use_text && !plain_utf8) {
|
||||||
|
string const textpreamble = ci.textpreamble;
|
||||||
|
if (!textpreamble.empty()) {
|
||||||
|
if (ci.textfeature()) {
|
||||||
|
string feats = textpreamble;
|
||||||
|
while (!feats.empty()) {
|
||||||
|
string feat;
|
||||||
|
feats = split(feats, feat, ',');
|
||||||
|
features.require(feat);
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
features.addPreambleSnippet(textpreamble);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (for_mathed && isMathSym(c)) {
|
||||||
|
features.require("amstext");
|
||||||
|
features.require("lyxmathsym");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace lyx
|
44
src/BufferEncodings.h
Normal file
44
src/BufferEncodings.h
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
/**
|
||||||
|
* \file BufferEncodings.h
|
||||||
|
* This file is part of LyX, the document processor.
|
||||||
|
* Licence details can be found in the file COPYING.
|
||||||
|
*
|
||||||
|
* \author Lars Gullik Bjønnes
|
||||||
|
* \author Jean-Marc Lasgouttes
|
||||||
|
* \author Stephan Witt
|
||||||
|
*
|
||||||
|
* Full author contact details are available in file CREDITS.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BUFFER_ENCODINGS_H
|
||||||
|
#define BUFFER_ENCODINGS_H
|
||||||
|
|
||||||
|
#include "Encoding.h"
|
||||||
|
#include "support/docstring.h"
|
||||||
|
#include "support/types.h"
|
||||||
|
|
||||||
|
namespace lyx {
|
||||||
|
|
||||||
|
class Buffer;
|
||||||
|
class LaTeXFeatures;
|
||||||
|
|
||||||
|
class BufferEncodings : public Encodings {
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Initialize mathcmd, textcmd, and mathsym sets.
|
||||||
|
*/
|
||||||
|
static void initUnicodeMath(Buffer const & buffer, bool for_master = true);
|
||||||
|
/**
|
||||||
|
* If \p c cannot be encoded in the given \p encoding, convert
|
||||||
|
* it to something that LaTeX can understand in mathmode.
|
||||||
|
* \p needsTermination indicates whether the command needs to be
|
||||||
|
* terminated by {} or a space.
|
||||||
|
* \return whether \p command is a mathmode command
|
||||||
|
*/
|
||||||
|
static void validate(char_type c, LaTeXFeatures & features, bool for_mathed = false);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace lyx
|
||||||
|
|
||||||
|
#endif // BUFFER_ENCODINGS_H
|
105
src/Encoding.cpp
105
src/Encoding.cpp
@ -14,16 +14,10 @@
|
|||||||
|
|
||||||
#include "Encoding.h"
|
#include "Encoding.h"
|
||||||
|
|
||||||
#include "Buffer.h"
|
|
||||||
#include "BufferList.h"
|
|
||||||
#include "InsetIterator.h"
|
|
||||||
#include "LaTeXFeatures.h"
|
|
||||||
#include "Lexer.h"
|
#include "Lexer.h"
|
||||||
#include "LyXRC.h"
|
|
||||||
|
|
||||||
#include "support/debug.h"
|
#include "support/debug.h"
|
||||||
#include "support/gettext.h"
|
#include "support/gettext.h"
|
||||||
#include "support/FileName.h"
|
|
||||||
#include "support/lstrings.h"
|
#include "support/lstrings.h"
|
||||||
#include "support/textutils.h"
|
#include "support/textutils.h"
|
||||||
#include "support/unicode.h"
|
#include "support/unicode.h"
|
||||||
@ -700,97 +694,6 @@ docstring Encodings::fromLaTeXCommand(docstring const & cmd, int cmdtype,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Encodings::initUnicodeMath(Buffer const & buffer, bool for_master)
|
|
||||||
{
|
|
||||||
#ifdef TEX2LYX
|
|
||||||
// The code below is not needed in tex2lyx and requires additional stuff
|
|
||||||
(void)buffer;
|
|
||||||
(void)for_master;
|
|
||||||
#else
|
|
||||||
if (for_master) {
|
|
||||||
mathcmd.clear();
|
|
||||||
textcmd.clear();
|
|
||||||
mathsym.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check this buffer
|
|
||||||
Inset & inset = buffer.inset();
|
|
||||||
InsetIterator it = inset_iterator_begin(inset);
|
|
||||||
InsetIterator const end = inset_iterator_end(inset);
|
|
||||||
for (; it != end; ++it)
|
|
||||||
it->initUnicodeMath();
|
|
||||||
|
|
||||||
if (!for_master)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Check children
|
|
||||||
ListOfBuffers blist = buffer.getDescendents();
|
|
||||||
ListOfBuffers::const_iterator bit = blist.begin();
|
|
||||||
ListOfBuffers::const_iterator const bend = blist.end();
|
|
||||||
for (; bit != bend; ++bit)
|
|
||||||
initUnicodeMath(**bit, false);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Encodings::validate(char_type c, LaTeXFeatures & features, bool for_mathed)
|
|
||||||
{
|
|
||||||
#ifdef TEX2LYX
|
|
||||||
// The code below is not needed in tex2lyx and requires additional stuff
|
|
||||||
(void)c;
|
|
||||||
(void)features;
|
|
||||||
(void)for_mathed;
|
|
||||||
#else
|
|
||||||
CharInfoMap::const_iterator const it = unicodesymbols.find(c);
|
|
||||||
if (it != unicodesymbols.end()) {
|
|
||||||
// In mathed, c could be used both in textmode and mathmode
|
|
||||||
bool const math_mode = for_mathed && isMathCmd(c);
|
|
||||||
bool const use_math = math_mode ||
|
|
||||||
(!for_mathed && it->second.textcommand.empty());
|
|
||||||
bool const use_text = (for_mathed && isTextCmd(c)) ||
|
|
||||||
(!for_mathed && !it->second.textcommand.empty());
|
|
||||||
bool const plain_utf8 = (features.runparams().encoding->name() == "utf8-plain");
|
|
||||||
bool const unicode_math = (features.isRequired("unicode-math")
|
|
||||||
&& features.isAvailable("unicode-math"));
|
|
||||||
// with utf8-plain, we only load packages when in mathed (see #7766)
|
|
||||||
// and if we do not use unicode-math
|
|
||||||
if ((math_mode && !unicode_math)
|
|
||||||
|| (use_math && !plain_utf8)) {
|
|
||||||
if (!it->second.mathpreamble.empty()) {
|
|
||||||
if (it->second.mathfeature()) {
|
|
||||||
string feats = it->second.mathpreamble;
|
|
||||||
while (!feats.empty()) {
|
|
||||||
string feat;
|
|
||||||
feats = split(feats, feat, ',');
|
|
||||||
features.require(feat);
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
features.addPreambleSnippet(it->second.mathpreamble);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// with utf8-plain, we do not load packages (see #7766)
|
|
||||||
if (use_text && !plain_utf8) {
|
|
||||||
if (!it->second.textpreamble.empty()) {
|
|
||||||
if (it->second.textfeature()) {
|
|
||||||
string feats = it->second.textpreamble;
|
|
||||||
while (!feats.empty()) {
|
|
||||||
string feat;
|
|
||||||
feats = split(feats, feat, ',');
|
|
||||||
features.require(feat);
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
features.addPreambleSnippet(it->second.textpreamble);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (for_mathed && isMathSym(c)) {
|
|
||||||
features.require("amstext");
|
|
||||||
features.require("lyxmathsym");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Encodings::isHebrewComposeChar(char_type c)
|
bool Encodings::isHebrewComposeChar(char_type c)
|
||||||
{
|
{
|
||||||
return c <= 0x05c2 && c >= 0x05b0 && c != 0x05be && c != 0x05c0;
|
return c <= 0x05c2 && c >= 0x05b0 && c != 0x05be && c != 0x05c0;
|
||||||
@ -822,6 +725,14 @@ bool Encodings::isArabicChar(char_type c)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CharInfo const & Encodings::unicodeCharInfo(char_type c)
|
||||||
|
{
|
||||||
|
static CharInfo empty;
|
||||||
|
CharInfoMap::const_iterator const it = unicodesymbols.find(c);
|
||||||
|
return it != unicodesymbols.end() ? it->second : empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
char_type Encodings::transformChar(char_type c, Encodings::LetterForm form)
|
char_type Encodings::transformChar(char_type c, Encodings::LetterForm form)
|
||||||
{
|
{
|
||||||
return isArabicChar(c) ? arabic_table[c-arabic_start][form] : c;
|
return isArabicChar(c) ? arabic_table[c-arabic_start][form] : c;
|
||||||
|
@ -24,9 +24,6 @@ namespace lyx {
|
|||||||
|
|
||||||
namespace support { class FileName; }
|
namespace support { class FileName; }
|
||||||
|
|
||||||
class Buffer;
|
|
||||||
class LaTeXFeatures;
|
|
||||||
|
|
||||||
class EncodingException : public std::exception {
|
class EncodingException : public std::exception {
|
||||||
public:
|
public:
|
||||||
EncodingException(char_type c);
|
EncodingException(char_type c);
|
||||||
@ -60,6 +57,8 @@ enum CharInfoFlags {
|
|||||||
/// Information about a single UCS4 character
|
/// Information about a single UCS4 character
|
||||||
class CharInfo {
|
class CharInfo {
|
||||||
public:
|
public:
|
||||||
|
// we assume that at least one command is nonempty when using unicodesymbols
|
||||||
|
bool isUnicodeSymbol() const { return !textcommand.empty() || !mathcommand.empty(); }
|
||||||
/// LaTeX command (text mode) for this character
|
/// LaTeX command (text mode) for this character
|
||||||
docstring textcommand;
|
docstring textcommand;
|
||||||
/// LaTeX command (math mode) for this character
|
/// LaTeX command (math mode) for this character
|
||||||
@ -258,6 +257,8 @@ public:
|
|||||||
static bool isArabicSpecialChar(char_type c);
|
static bool isArabicSpecialChar(char_type c);
|
||||||
///
|
///
|
||||||
static bool isArabicChar(char_type c);
|
static bool isArabicChar(char_type c);
|
||||||
|
/// Accessor for the unicode information table.
|
||||||
|
static CharInfo const & unicodeCharInfo(char_type c);
|
||||||
///
|
///
|
||||||
static char_type transformChar(char_type c, LetterForm form);
|
static char_type transformChar(char_type c, LetterForm form);
|
||||||
/// Is this a combining char?
|
/// Is this a combining char?
|
||||||
@ -303,10 +304,6 @@ public:
|
|||||||
* Tell whether \p c is registered as a mathmode symbol.
|
* Tell whether \p c is registered as a mathmode symbol.
|
||||||
*/
|
*/
|
||||||
static bool isMathSym(char_type c) { return mathsym.count(c); }
|
static bool isMathSym(char_type c) { return mathsym.count(c); }
|
||||||
/**
|
|
||||||
* Initialize mathcmd, textcmd, and mathsym sets.
|
|
||||||
*/
|
|
||||||
static void initUnicodeMath(Buffer const & buffer, bool for_master = true);
|
|
||||||
/**
|
/**
|
||||||
* If \p c cannot be encoded in the given \p encoding, convert
|
* If \p c cannot be encoded in the given \p encoding, convert
|
||||||
* it to something that LaTeX can understand in mathmode.
|
* it to something that LaTeX can understand in mathmode.
|
||||||
@ -346,16 +343,8 @@ public:
|
|||||||
static docstring fromLaTeXCommand(docstring const & cmd, int cmdtype,
|
static docstring fromLaTeXCommand(docstring const & cmd, int cmdtype,
|
||||||
bool & needsTermination, docstring & rem,
|
bool & needsTermination, docstring & rem,
|
||||||
std::set<std::string> * req = 0);
|
std::set<std::string> * req = 0);
|
||||||
/**
|
|
||||||
* Add the preamble snippet needed for the output of \p c to
|
|
||||||
* \p features.
|
|
||||||
* This does not depend on the used encoding, since the inputenc
|
|
||||||
* package only maps the code point \p c to a command, it does not
|
|
||||||
* make this command available.
|
|
||||||
*/
|
|
||||||
static void validate(char_type c, LaTeXFeatures & features, bool for_mathed = false);
|
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
///
|
///
|
||||||
EncodingList encodinglist;
|
EncodingList encodinglist;
|
||||||
///
|
///
|
||||||
|
@ -119,6 +119,7 @@ SOURCEFILESCORE = \
|
|||||||
DepTable.cpp \
|
DepTable.cpp \
|
||||||
DocIterator.cpp \
|
DocIterator.cpp \
|
||||||
Encoding.cpp \
|
Encoding.cpp \
|
||||||
|
BufferEncodings.cpp \
|
||||||
ErrorList.cpp \
|
ErrorList.cpp \
|
||||||
Exporter.cpp \
|
Exporter.cpp \
|
||||||
factory.cpp \
|
factory.cpp \
|
||||||
@ -194,6 +195,7 @@ HEADERFILESCORE = \
|
|||||||
BranchList.h \
|
BranchList.h \
|
||||||
buffer_funcs.h \
|
buffer_funcs.h \
|
||||||
Buffer.h \
|
Buffer.h \
|
||||||
|
BufferEncodings.h \
|
||||||
BufferList.h \
|
BufferList.h \
|
||||||
BufferParams.h \
|
BufferParams.h \
|
||||||
BufferView.h \
|
BufferView.h \
|
||||||
|
Loading…
Reference in New Issue
Block a user