#include <config.h>
#include "Layout.h"
+#include "Encoding.h"
#include "FontInfo.h"
#include "Language.h"
#include "Lexer.h"
LT_COPYSTYLE,
LT_DEPENDSON,
LT_OBSOLETEDBY,
- //LT_EMPTY,
LT_END,
- //LT_ENVIRONMENT_DEFAULT,
- //LT_FANCYHDR,
- //LT_FIRST_COUNTER,
LT_FONT,
LT_FREE_SPACING,
LT_PASS_THRU,
LT_PARBREAK_IS_NEWLINE,
- //LT_HEADINGS,
LT_ITEMSEP,
LT_KEEPEMPTY,
LT_LABEL_BOTTOMSEP,
LT_PARINDENT,
LT_PARSEP,
LT_PARSKIP,
- //LT_PLAIN,
LT_PREAMBLE,
LT_LANGPREAMBLE,
LT_BABELPREAMBLE,
bool error = false;
bool finished = false;
lex.pushTable(layoutTags);
+
// parse style section
while (!finished && lex.isOK() && !error) {
int le = lex.lex();
case Lexer::LEX_FEOF:
continue;
- case Lexer::LEX_UNDEF: // parse error
+ case Lexer::LEX_UNDEF:
+ // parse error
lex.printError("Unknown layout tag `$$Token'");
error = true;
continue;
break;
}
switch (static_cast<LayoutTags>(le)) {
- case LT_END: // end of structure
+ case LT_END:
finished = true;
break;
lex >> category_;
break;
- case LT_COPYSTYLE: { // initialize with a known style
+ case LT_COPYSTYLE: {
docstring style;
lex >> style;
style = subst(style, '_', ' ');
break;
}
- case LT_OBSOLETEDBY: { // replace with a known style
+ case LT_OBSOLETEDBY: {
docstring style;
lex >> style;
style = subst(style, '_', ' ');
depends_on_ = subst(depends_on_, '_', ' ');
break;
- case LT_MARGIN: // margin style definition.
+ case LT_MARGIN:
readMargin(lex);
break;
- case LT_LATEXTYPE: // LaTeX style definition.
+ case LT_LATEXTYPE:
readLatexType(lex);
break;
labelfont = lyxRead(lex, labelfont);
break;
- case LT_NEXTNOINDENT: // Indent next paragraph?
+ case LT_NEXTNOINDENT:
lex >> nextnoindent;
break;
readEndLabelType(lex);
break;
- case LT_LEFTMARGIN: // left margin type
+ case LT_LEFTMARGIN:
lex >> leftmargin;
break;
- case LT_RIGHTMARGIN: // right margin type
+ case LT_RIGHTMARGIN:
lex >> rightmargin;
break;
- case LT_LABELINDENT: // label indenting flag
+ case LT_LABELINDENT:
lex >> labelindent;
break;
- case LT_PARINDENT: // paragraph indent. flag
+ case LT_PARINDENT:
lex >> parindent;
break;
- case LT_PARSKIP: // paragraph skip size
+ case LT_PARSKIP:
lex >> parskip;
break;
- case LT_ITEMSEP: // item separation size
+ case LT_ITEMSEP:
lex >> itemsep;
break;
- case LT_TOPSEP: // top separation size
+ case LT_TOPSEP:
lex >> topsep;
break;
- case LT_BOTTOMSEP: // bottom separation size
+ case LT_BOTTOMSEP:
lex >> bottomsep;
break;
- case LT_LABEL_BOTTOMSEP: // label bottom separation size
+ case LT_LABEL_BOTTOMSEP:
lex >> labelbottomsep;
break;
- case LT_LABELSEP: // label separator
+ case LT_LABELSEP:
lex >> labelsep;
labelsep = subst(labelsep, 'x', ' ');
break;
- case LT_PARSEP: // par. separation size
+ case LT_PARSEP:
lex >> parsep;
break;
- case LT_NEWLINE: // newlines allowed?
+ case LT_NEWLINE:
lex >> newline_allowed;
break;
- case LT_ALIGN: // paragraph align
+ case LT_ALIGN:
readAlign(lex);
break;
- case LT_ALIGNPOSSIBLE: // paragraph allowed align
+
+ case LT_ALIGNPOSSIBLE:
readAlignPossible(lex);
break;
- case LT_LABELSTRING: // label string definition
+ case LT_LABELSTRING:
// FIXME: this means LT_ENDLABELSTRING may only
// occur after LT_LABELSTRING
lex >> labelstring_;
labelstring_appendix_ = labelstring_;
break;
- case LT_ENDLABELSTRING: // endlabel string definition
+ case LT_ENDLABELSTRING:
lex >> endlabelstring_;
endlabelstring_ = trim(endlabelstring_);
break;
- case LT_LABELSTRING_APPENDIX: // label string appendix definition
+ case LT_LABELSTRING_APPENDIX:
lex >> labelstring_appendix_;
labelstring_appendix_ = trim(labelstring_appendix_);
break;
- case LT_LABELCOUNTER: // name of counter to use
+ case LT_LABELCOUNTER:
lex >> counter;
counter = trim(counter);
break;
- case LT_FREE_SPACING: // Allow for free spacing.
+ case LT_FREE_SPACING:
lex >> free_spacing;
break;
- case LT_PASS_THRU: // Allow for pass thru.
+ case LT_PASS_THRU:
lex >> pass_thru;
break;
lex >> parbreak_is_newline;
break;
- case LT_SPACING: // setspace.sty
+ case LT_SPACING:
readSpacing(lex);
break;
namespace {
-docstring const i18npreamble(Language const * lang, docstring const & templ, bool const polyglossia)
+docstring const i18npreamble(Language const * lang, Encoding const & enc,
+ docstring const & templ, bool const polyglossia)
{
if (templ.empty())
return templ;
#ifdef TEX2LYX
// tex2lyx does not have getMessages()
LASSERT(false, /**/);
+ (void)enc;
#else
+ string const langenc = lang->encoding()->iconvName();
+ string const texenc = lang->encoding()->latexName();
+ string const bufenc = enc.iconvName();
+ // First and second character of plane 15 (Private Use Area)
+ string const s1 = "\xf3\xb0\x80\x80"; // U+F0000
+ string const s2 = "\xf3\xb0\x80\x81"; // U+F0001
// FIXME UNICODE
// lyx::regex is not unicode-safe.
// Should use QRegExp or (boost::u32regex, but that requires ICU)
smatch sub;
while (regex_search(preamble, sub, reg)) {
string const key = sub.str(1);
- string translated = to_utf8(lang->translateLayout(key));
+ docstring const name = lang->translateLayout(key);
+ // Check whether name can be encoded in the buffer encoding
+ bool encodable = true;
+ for (size_t i = 0; i < name.size(); ++i) {
+ if (enc.latexChar(name[i], true)[0] != name[i]) {
+ encodable = false;
+ break;
+ }
+ }
+ string const translated = encodable ? to_utf8(name)
+ : "\\inputencoding{" + texenc + "}"
+ + s1 + langenc + s2 + to_utf8(name)
+ + s1 + bufenc + s2;
preamble = subst(preamble, sub.str(), translated);
}
#endif
}
-docstring const Layout::langpreamble(Language const * lang, bool const polyglossia) const
+docstring const Layout::langpreamble(Language const * lang,
+ Encoding const & enc, bool const polyglossia) const
{
- return i18npreamble(lang, langpreamble_, polyglossia);
+ return i18npreamble(lang, enc, langpreamble_, polyglossia);
}
-docstring const Layout::babelpreamble(Language const * lang, bool const polyglossia) const
+docstring const Layout::babelpreamble(Language const * lang,
+ Encoding const & enc, bool const polyglossia) const
{
- return i18npreamble(lang, babelpreamble_, polyglossia);
+ return i18npreamble(lang, enc, babelpreamble_, polyglossia);
}