namespace {
+static unsigned int const LYXRC_FILEFORMAT = 1;
+
// when adding something to this array keep it sorted!
LexerKeyword lyxrcTags[] = {
{ "\\accept_compound", LyXRC::RC_ACCEPT_COMPOUND },
{ "\\example_path", LyXRC::RC_EXAMPLEPATH },
{ "\\export_overwrite", LyXRC::RC_EXPORT_OVERWRITE },
{ "\\font_encoding", LyXRC::RC_FONT_ENCODING },
- { "\\format", LyXRC::RC_FORMAT },
+ { "\\format", LyXRC::RC_FILEFORMAT },
{ "\\forward_search_dvi", LyXRC::RC_FORWARD_SEARCH_DVI },
{ "\\forward_search_pdf", LyXRC::RC_FORWARD_SEARCH_PDF },
{ "\\fullscreen_limit", LyXRC::RC_FULL_SCREEN_LIMIT },
{ "\\language_command_begin", LyXRC::RC_LANGUAGE_COMMAND_BEGIN },
{ "\\language_command_end", LyXRC::RC_LANGUAGE_COMMAND_END },
{ "\\language_command_local", LyXRC::RC_LANGUAGE_COMMAND_LOCAL },
+ { "\\language_custom_package", LyXRC::RC_LANGUAGE_CUSTOM_PACKAGE },
{ "\\language_global_options", LyXRC::RC_LANGUAGE_GLOBAL_OPTIONS },
- { "\\language_package", LyXRC::RC_LANGUAGE_PACKAGE },
- { "\\language_use_babel", LyXRC::RC_LANGUAGE_USE_BABEL },
+ { "\\language_package_selection", LyXRC::RC_LANGUAGE_PACKAGE_SELECTION },
{ "\\load_session", LyXRC::RC_LOADSESSION },
{ "\\mac_dontswap_ctrl_meta", LyXRC::RC_MAC_DONTSWAP_CTRL_META },
{ "\\mac_like_word_movement", LyXRC::RC_MAC_LIKE_WORD_MOVEMENT },
{ "\\open_buffers_in_tabs", LyXRC::RC_OPEN_BUFFERS_IN_TABS },
{ "\\paragraph_markers", LyXRC::RC_PARAGRAPH_MARKERS },
{ "\\path_prefix", LyXRC::RC_PATH_PREFIX },
- { "\\personal_dictionary", LyXRC::RC_PERS_DICT },
{ "\\plaintext_linelen", LyXRC::RC_PLAINTEXT_LINELEN },
- { "\\plaintext_roff_command", LyXRC::RC_PLAINTEXT_ROFF_COMMAND },
{ "\\preview", LyXRC::RC_PREVIEW },
{ "\\preview_hashed_labels", LyXRC::RC_PREVIEW_HASHED_LABELS },
{ "\\preview_scale_factor", LyXRC::RC_PREVIEW_SCALE_FACTOR },
{ "\\single_close_tab_button", LyXRC::RC_SINGLE_CLOSE_TAB_BUTTON },
{ "\\single_instance", LyXRC::RC_SINGLE_INSTANCE },
{ "\\sort_layouts", LyXRC::RC_SORT_LAYOUTS },
- { "\\spell_command", LyXRC::RC_SPELL_COMMAND },
{ "\\spellcheck_continuously", LyXRC::RC_SPELLCHECK_CONTINUOUSLY },
{ "\\spellcheck_notes", LyXRC::RC_SPELLCHECK_NOTES },
{ "\\spellchecker", LyXRC::RC_SPELLCHECKER },
{ "\\tex_expects_windows_paths", LyXRC::RC_TEX_EXPECTS_WINDOWS_PATHS },
{ "\\thesaurusdir_path", LyXRC::RC_THESAURUSDIRPATH },
{ "\\ui_file", LyXRC::RC_UIFILE },
- { "\\use_alt_language", LyXRC::RC_USE_ALT_LANG },
{ "\\use_converter_cache", LyXRC::RC_USE_CONVERTER_CACHE },
- { "\\use_escape_chars", LyXRC::RC_USE_ESC_CHARS },
- { "\\use_input_encoding", LyXRC::RC_USE_INP_ENC },
{ "\\use_lastfilepos", LyXRC::RC_USELASTFILEPOS },
- { "\\use_personal_dictionary", LyXRC::RC_USE_PERS_DICT },
{ "\\use_pixmap_cache", LyXRC::RC_USE_PIXMAP_CACHE },
// compatibility with versions older than 1.4.0 only
- { "\\use_pspell", LyXRC::RC_USE_SPELL_LIB },
{ "\\use_system_colors", LyXRC::RC_USE_SYSTEM_COLORS },
- // compatibility with versions older than 1.4.0 only
- { "\\use_tempdir", LyXRC::RC_USETEMPDIR },
{ "\\use_tooltip", LyXRC::RC_USE_TOOLTIP },
{ "\\user_email", LyXRC::RC_USER_EMAIL },
{ "\\user_name", LyXRC::RC_USER_NAME },
// compatibility with versions older than 1.4.0 only
{ "\\viewer", LyXRC::RC_VIEWER},
{ "\\viewer_alternatives", LyXRC::RC_VIEWER_ALTERNATIVES },
- { "\\visual_cursor" ,LyXRC::RC_VISUAL_CURSOR}
+ { "\\visual_cursor", LyXRC::RC_VISUAL_CURSOR },
+ { "format", LyXRC::RC_LYXRCFORMAT }
};
const int lyxrcCount = sizeof(lyxrcTags) / sizeof(lyxrcTags[0]);
language_auto_begin = true;
language_auto_end = true;
language_global_options = true;
- language_use_babel = true;
- language_package = "\\usepackage{babel}";
+ language_package_selection = LP_AUTO;
+ language_custom_package = "\\usepackage{babel}";
language_command_begin = "\\selectlanguage{$$lang}";
language_command_local = "\\foreignlanguage{$$lang}{";
sort_layouts = false;
} // namespace anon
-int LyXRC::read(FileName const & filename)
+bool LyXRC::read(FileName const & filename, bool check_format)
{
Lexer lexrc(lyxrcTags);
- if (lyxerr.debugging(Debug::PARSER))
- lexrc.printTable(lyxerr);
-
lexrc.setFile(filename);
- if (!lexrc.isOK())
- return -2;
-
LYXERR(Debug::LYXRC, "Reading '" << filename << "'...");
-
- return read(lexrc);
+ ReturnValues retval = read(lexrc, check_format);
+ if (!check_format || retval != FormatMismatch)
+ return retval == ReadOK;
+
+ LYXERR(Debug::FILES, "Converting LyXRC file to " << LYXRC_FILEFORMAT);
+ FileName const tempfile = FileName::tempName("convert_lyxrc");
+ bool const success = prefs2prefs(filename, tempfile, false);
+ if (!success) {
+ LYXERR0 ("Unable to convert " << filename.absFileName() <<
+ " to format " << LYXRC_FILEFORMAT);
+ return false;
+ }
+ Lexer lexrc2(lyxrcTags);
+ lexrc2.setFile(tempfile);
+ LYXERR(Debug::LYXRC, "Reading '" << tempfile << "'...");
+ retval = read(lexrc2, check_format);
+ tempfile.removeFile();
+ return retval == ReadOK;
}
-int LyXRC::read(istream & is)
+// don't need to worry about conversion, because this is always
+// from an internal source
+bool LyXRC::read(istream & is)
{
Lexer lexrc(lyxrcTags);
- if (lyxerr.debugging(Debug::PARSER))
- lexrc.printTable(lyxerr);
-
lexrc.setStream(is);
- if (!lexrc.isOK())
- return -2;
-
LYXERR(Debug::LYXRC, "Reading istream...");
-
- return read(lexrc);
+ return read(lexrc, false) == ReadOK;
}
-int LyXRC::read(Lexer & lexrc)
+LyXRC::ReturnValues LyXRC::read(Lexer & lexrc, bool check_format)
{
+ if (lyxerr.debugging(Debug::PARSER))
+ lexrc.printTable(lyxerr);
+
if (!lexrc.isOK())
- return -2;
+ return ReadError;
+
+ // format prior to 2.0 and introduction of format tag
+ unsigned int format = 0;
while (lexrc.isOK()) {
// By using two switches we take advantage of the compiler
break;
}
switch (static_cast<LyXRCTags>(le)) {
+ case RC_LYXRCFORMAT:
+ if (lexrc.next())
+ format = lexrc.getInteger();
+ break;
case RC_INPUT: // Include file
if (lexrc.next()) {
FileName const tmp =
libFileSearch(string(),
lexrc.getString());
- if (read(tmp)) {
- lexrc.printError("Error reading "
- "included file: " + tmp.absFileName());
+ if (read(tmp, check_format)) {
+ lexrc.printError(
+ "Error reading included file: " + tmp.absFileName());
}
}
break;
case RC_DATE_INSERT_FORMAT:
lexrc >> date_insert_format;
break;
- case RC_LANGUAGE_PACKAGE:
- lexrc >> language_package;
+ case RC_LANGUAGE_CUSTOM_PACKAGE:
+ lexrc >> language_custom_package;
break;
case RC_LANGUAGE_AUTO_BEGIN:
lexrc >> language_auto_begin;
case RC_LANGUAGE_GLOBAL_OPTIONS:
lexrc >> language_global_options;
break;
- case RC_LANGUAGE_USE_BABEL:
- lexrc >> language_use_babel;
+ case RC_LANGUAGE_PACKAGE_SELECTION:
+ if (lexrc.next()) {
+ switch (lexrc.getInteger()) {
+ case 0:
+ language_package_selection = LP_AUTO;
+ break;
+ case 1:
+ language_package_selection = LP_BABEL;
+ break;
+ case 2:
+ language_package_selection = LP_CUSTOM;
+ break;
+ case 3:
+ language_package_selection = LP_NONE;
+ break;
+ }
+ }
break;
case RC_LANGUAGE_COMMAND_BEGIN:
lexrc >> language_command_begin;
formats.setViewer(format, command);
break;
}
- case RC_FORMAT: {
+ case RC_FILEFORMAT: {
string format, extension, prettyname, shortcut;
lexrc >> format >> extension >> prettyname >> shortcut;
string viewer, editor;
}
break;
- // Obsoteted in 1.4.0
- case RC_USETEMPDIR:
- // Obsoleted in 2.0
- case RC_SPELL_COMMAND:
- case RC_PERS_DICT:
- case RC_PLAINTEXT_ROFF_COMMAND:
- case RC_USE_ALT_LANG:
- case RC_USE_ESC_CHARS:
- case RC_USE_INP_ENC:
- case RC_USE_PERS_DICT:
- case RC_USE_SPELL_LIB:
- LYXERR(Debug::LYXRC, "Skipping obsolete tag `"
- << lexrc.getString() << "'.");
- lexrc.next(true);
- break;
-
case RC_LAST:
break; // this is just a dummy
}
+
+ // This is triggered the first time through the loop unless
+ // we hit a format tag.
+ if (check_format && format != LYXRC_FILEFORMAT)
+ return FormatMismatch;
}
/// Update converters data-structures
theConverters().update(formats);
theConverters().buildGraph();
- return 0;
+ return ReadOK;
}
if (tag == RC_LAST)
os << "# LyX " << lyx_version
<< " generated this file. If you want to make your own\n"
- << "# modifications you should do them from inside LyX and save.\n"
- << "\n";
+ << "# modifications you should do them from inside LyX and save.\n\n"
+ << "Format " << LYXRC_FILEFORMAT << "\n\n";
// Why the switch you might ask. It is a trick to ensure that all
// the elements in the LyXRCTags enum are handled. As you can see
case RC_LAST:
case RC_INPUT:
// input/include files are not done here
+ case RC_LYXRCFORMAT:
case RC_BINDFILE:
if (ignore_system_lyxrc ||
bind_file != system_lyxrc.bind_file) {
}
if (tag != RC_LAST)
break;
- case RC_USETEMPDIR:
- if (tag != RC_LAST)
- break;
- // Ignore it
- case RC_PLAINTEXT_ROFF_COMMAND: // Obsoleted in 2.0
- if (tag != RC_LAST)
- break;
case RC_PLAINTEXT_LINELEN:
if (ignore_system_lyxrc ||
plaintext_linelen != system_lyxrc.plaintext_linelen) {
<< "# SPELLCHECKER SECTION ##############################\n"
<< "#\n\n";
- case RC_SPELL_COMMAND:
- case RC_USE_SPELL_LIB:
- // Obsoleted in 2.0
- if (tag != RC_LAST)
- break;
case RC_ACCEPT_COMPOUND:
if (ignore_system_lyxrc ||
spellchecker_accept_compound != system_lyxrc.spellchecker_accept_compound) {
}
if (tag != RC_LAST)
break;
- case RC_USE_ALT_LANG:
- // Obsoleted in 2.0
- if (tag != RC_LAST)
- break;
case RC_ALT_LANG:
if (ignore_system_lyxrc ||
spellchecker_alt_lang != system_lyxrc.spellchecker_alt_lang) {
}
if (tag != RC_LAST)
break;
- case RC_USE_ESC_CHARS:
- if (tag != RC_LAST)
- break;
case RC_ESC_CHARS:
if (ignore_system_lyxrc ||
spellchecker_esc_chars != system_lyxrc.spellchecker_esc_chars) {
}
if (tag != RC_LAST)
break;
- case RC_USE_PERS_DICT:
- // obsoleted in 2.0
- if (tag != RC_LAST)
- break;
case RC_USE_SYSTEM_COLORS:
if (ignore_system_lyxrc ||
use_system_colors != system_lyxrc.use_system_colors) {
}
if (tag != RC_LAST)
break;
- case RC_PERS_DICT:
- // obsoleted in 2.0
- if (tag != RC_LAST)
- break;
- case RC_USE_INP_ENC:
- // obsoleted in 2.0
- if (tag != RC_LAST)
- break;
os << "\n#\n"
<< "# LANGUAGE SUPPORT SECTION ##########################\n"
}
if (tag != RC_LAST)
break;
- case RC_LANGUAGE_PACKAGE:
+ case RC_LANGUAGE_CUSTOM_PACKAGE:
if (ignore_system_lyxrc ||
- language_package != system_lyxrc.language_package) {
- os << "\\language_package \"" << language_package
+ language_custom_package != system_lyxrc.language_custom_package) {
+ os << "\\language_custom_package \"" << language_custom_package
<< "\"\n";
}
if (tag != RC_LAST)
}
if (tag != RC_LAST)
break;
- case RC_LANGUAGE_USE_BABEL:
+ case RC_LANGUAGE_PACKAGE_SELECTION:
if (ignore_system_lyxrc ||
- language_use_babel != system_lyxrc.language_use_babel) {
- os << "\\language_use_babel \""
- << convert<string>(language_use_babel)
- << "\"\n";
+ language_package_selection != system_lyxrc.language_package_selection) {
+ os << "\\language_package_selection ";
+ switch (language_package_selection) {
+ case LP_AUTO:
+ os << "0\n";
+ break;
+ case LP_BABEL:
+ os << "1\n";
+ break;
+ case LP_CUSTOM:
+ os << "2\n";
+ break;
+ case LP_NONE:
+ os << "3\n";
+ break;
+ }
}
if (tag != RC_LAST)
break;
<< "# FORMATS SECTION ##########################\n"
<< "#\n\n";
- case RC_FORMAT:
+ case RC_FILEFORMAT:
// New/modified formats
for (Formats::const_iterator cit = formats.begin();
cit != formats.end(); ++cit) {
case LyXRC::RC_ACCEPT_COMPOUND:
case LyXRC::RC_ALT_LANG:
case LyXRC::RC_PLAINTEXT_LINELEN:
- case LyXRC::RC_PLAINTEXT_ROFF_COMMAND:
case LyXRC::RC_AUTOCORRECTION_MATH:
case LyXRC::RC_AUTOREGIONDELETE:
case LyXRC::RC_AUTORESET_OPTIONS:
case LyXRC::RC_ESC_CHARS:
case LyXRC::RC_EXAMPLEPATH:
case LyXRC::RC_FONT_ENCODING:
- case LyXRC::RC_FORMAT:
+ case LyXRC::RC_FILEFORMAT:
case LyXRC::RC_GROUP_LAYOUTS:
case LyXRC::RC_HUNSPELLDIR_PATH:
case LyXRC::RC_INDEX_ALTERNATIVES:
case LyXRC::RC_LANGUAGE_COMMAND_END:
case LyXRC::RC_LANGUAGE_COMMAND_LOCAL:
case LyXRC::RC_LANGUAGE_GLOBAL_OPTIONS:
- case LyXRC::RC_LANGUAGE_PACKAGE:
- case LyXRC::RC_LANGUAGE_USE_BABEL:
+ case LyXRC::RC_LANGUAGE_CUSTOM_PACKAGE:
+ case LyXRC::RC_LANGUAGE_PACKAGE_SELECTION:
+ case LyXRC::RC_LYXRCFORMAT:
case LyXRC::RC_MAC_DONTSWAP_CTRL_META:
case LyXRC::RC_MAC_LIKE_WORD_MOVEMENT:
case LyXRC::RC_MACRO_EDIT_STYLE:
if (lyxrc_orig.path_prefix != lyxrc_new.path_prefix) {
prependEnvPath("PATH", lyxrc.path_prefix);
}
- case LyXRC::RC_PERS_DICT:
case LyXRC::RC_PREVIEW:
case LyXRC::RC_PREVIEW_HASHED_LABELS:
case LyXRC::RC_PREVIEW_SCALE_FACTOR:
case LyXRC::RC_SET_COLOR:
case LyXRC::RC_SHOW_BANNER:
case LyXRC::RC_OPEN_BUFFERS_IN_TABS:
- case LyXRC::RC_SPELL_COMMAND:
case LyXRC::RC_SPELLCHECKER:
case LyXRC::RC_SPELLCHECK_CONTINUOUSLY:
case LyXRC::RC_SPELLCHECK_NOTES:
case LyXRC::RC_UIFILE:
case LyXRC::RC_USER_EMAIL:
case LyXRC::RC_USER_NAME:
- case LyXRC::RC_USETEMPDIR:
- case LyXRC::RC_USE_ALT_LANG:
case LyXRC::RC_USE_CONVERTER_CACHE:
- case LyXRC::RC_USE_ESC_CHARS:
- case LyXRC::RC_USE_INP_ENC:
- case LyXRC::RC_USE_PERS_DICT:
case LyXRC::RC_USE_SYSTEM_COLORS:
case LyXRC::RC_USE_TOOLTIP:
case LyXRC::RC_USE_PIXMAP_CACHE:
- case LyXRC::RC_USE_SPELL_LIB:
case LyXRC::RC_VIEWDVI_PAPEROPTION:
case LyXRC::RC_SINGLE_CLOSE_TAB_BUTTON:
case LyXRC::RC_SINGLE_INSTANCE:
break;
case RC_ALT_LANG:
- case RC_USE_ALT_LANG:
str = _("Specify an alternate language. The default is to use the language of the document.");
break;
- case RC_PLAINTEXT_ROFF_COMMAND:
- str = _("Use to define an external program to render tables in plain text output. E.g. \"groff -t -Tlatin1 $$FName\" where $$FName is the input file. If \"\" is specified, an internal routine is used.");
- break;
-
case RC_PLAINTEXT_LINELEN:
str = _("The maximum line length of exported plain text/LaTeX/SGML files. If set to 0, paragraphs are output in a single line; if the line length is > 0, paragraphs are separated by a blank line.");
break;
break;
case RC_ESC_CHARS:
- case RC_USE_ESC_CHARS:
str = _("Specify additional chars that can be part of a word.");
break;
str = _("The font encoding used for the LaTeX2e fontenc package. T1 is highly recommended for non-English languages.");
break;
- case RC_FORMAT:
+ case RC_FILEFORMAT:
break;
case RC_INDEX_COMMAND:
str = _("De-select if you don't want the language(s) used as an argument to \\documentclass.");
break;
- case RC_LANGUAGE_PACKAGE:
+ case RC_LANGUAGE_CUSTOM_PACKAGE:
str = _("The LaTeX command for loading the language package. E.g. \"\\usepackage{babel}\", \"\\usepackage{omega}\".");
break;
- case RC_LANGUAGE_USE_BABEL:
+ case RC_LANGUAGE_PACKAGE_SELECTION:
str = _("De-select if you don't want babel to be used when the language of the document is the default language.");
break;
case RC_USER_NAME:
break;
- case RC_USETEMPDIR:
- break;
-
case RC_USE_USE_SYSTEM_COLORS:
str = _("Enable use the system colors for some things like main window background and selection.");
break;
str = _("Enable the pixmap cache that might improve performance on Mac and Windows.");
break;
- case RC_USE_SPELL_LIB:
- break;
-
case RC_VIEWDVI_PAPEROPTION:
_("Specify the paper command to DVI viewer (leave empty or use \"-paper\")");
break;