commit d8c913fe59e7a11968da26b9bcc5ad263e5cf78a
Author: Günter Milde <[email protected]>
Date: Tue May 28 10:34:46 2019 +0200
lyx2lyx refactoring
Reduce code duplication in revert_language, no change to output.
---
lib/lyx2lyx/lyx2lyx_tools.py | 149 ++++++++++++++-----------------------
lib/lyx2lyx/test_lyx2lyx_tools.py | 26 ++++++-
2 files changed, 81 insertions(+), 94 deletions(-)
diff --git a/lib/lyx2lyx/lyx2lyx_tools.py b/lib/lyx2lyx/lyx2lyx_tools.py
index 75a5c82..fd64138 100644
--- a/lib/lyx2lyx/lyx2lyx_tools.py
+++ b/lib/lyx2lyx/lyx2lyx_tools.py
@@ -84,13 +84,13 @@ insert_document_option(document, option):
remove_document_option(document, option):
Remove _option_ as a document option.
-revert_language(document, lyxname, babelname, polyglossianame):
+revert_language(document, lyxname, babelname="", polyglossianame=""):
Reverts native language support to ERT
If babelname or polyglossianame is empty, it is assumed
this language package is not supported for the given language.
'''
-import re
+import re, sys
from parser_tools import find_token, find_end_of_inset, get_containing_layout,
get_value, get_bool_value
from unicode_symbols import unicode_reps
@@ -145,24 +145,38 @@ def insert_to_preamble(document, text, index = 0):
# Created from the reversed list to keep the first of alternative definitions.
licr_table = dict((ord(ch), cmd) for cmd, ch in unicode_reps[::-1])
-def put_cmd_in_ert(cmd):
+def put_cmd_in_ert(cmd, is_open=False, as_paragraph=False):
"""
Return ERT inset wrapping `cmd` as a list of strings.
`cmd` can be a string or list of lines. Non-ASCII characters are converted
- to the respective LICR macros if defined in unicodesymbols.
+ to the respective LICR macros if defined in unicodesymbols,
+ `is_open` is a boolean setting the inset status to "open",
+ `as_paragraph` wraps the ERT inset in a Standard paragraph.
"""
- ret = ["\\begin_inset ERT", "status collapsed", "", "\\begin_layout Plain
Layout", ""]
- # It will be faster to work with a single string internally.
+
+ status = {False:"collapsed", True:"open"}
+ ert_inset = ["\\begin_inset ERT", "status %s"%status[is_open], "",
+ "\\begin_layout Plain Layout", "",
+ # content here ([5:5])
+ "\\end_layout", "", "\\end_inset"]
+
+ paragraph = ["\\begin_layout Standard",
+ # content here ([1:1])
+ "", "", "\\end_layout", ""]
+ # ensure cmd is an unicode instance and make it "LyX safe".
if isinstance(cmd, list):
cmd = u"\n".join(cmd)
- else:
- cmd = u"%s" % cmd # ensure it is an unicode instance
+ elif sys.version_info[0] == 2 and isinstance(cmd, str):
+ cmd = cmd.decode('utf8')
cmd = cmd.translate(licr_table)
cmd = cmd.replace("\\", "\n\\backslash\n")
- ret += cmd.splitlines()
- ret += ["\\end_layout", "", "\\end_inset"]
- return ret
+
+ ert_inset[5:5] = cmd.splitlines()
+ if not as_paragraph:
+ return ert_inset
+ paragraph[1:1] = ert_inset
+ return paragraph
def get_ert(lines, i, verbatim = False):
@@ -620,11 +634,10 @@ def is_document_option(document, option):
return True
-
-def revert_language(document, lyxname, babelname, polyglossianame):
+def revert_language(document, lyxname, babelname="", polyglossianame=""):
" Revert native language support "
- # Are we using polyglossia?
+ # Does the document use polyglossia?
use_polyglossia = False
if get_bool_value(document.header, "\\use_non_tex_fonts"):
i = find_token(document.header, "\\language_package")
@@ -652,18 +665,10 @@ def revert_language(document, lyxname, babelname,
polyglossianame):
i = find_token(document.header, "\\language %s" % lyxname, 0)
if i != -1:
document.header[i] = "\\language english"
- j = find_token(document.header, "\\language_package default", 0)
- if j != -1:
- document.header[j] = "\\language_package default"
if with_polyglossia:
add_to_preamble(document,
["\\AtBeginDocument{\setotherlanguage{%s}}" % polyglossianame])
- document.body[2 : 2] = ["\\begin_layout Standard",
- "\\begin_inset ERT", "status open", "",
- "\\begin_layout Plain Layout", "", "",
- "\\backslash",
- "resetdefaultlanguage{%s}" %
polyglossianame,
- "\\end_layout", "", "\\end_inset", "", "",
- "\\end_layout", ""]
+ document.body[2 : 2] =
put_cmd_in_ert("\\resetdefaultlanguage{%s}"%polyglossianame,
+ is_open=True,
as_paragraph=True)
# Now secondary languages
i = 0
@@ -675,87 +680,51 @@ def revert_language(document, lyxname, babelname,
polyglossianame):
secondary = True
endlang = get_containing_layout(document.body, i)[2]
langswitch = find_token(document.body, '\\lang', i + 1, endlang)
- startlayout = "\\begin_layout Standard"
- endlayout = "\\end_layout"
+ as_paragraph = True
if langswitch != -1:
endlang = langswitch
- startlayout = ""
- endlayout = ""
+ as_paragraph = False
if with_polyglossia:
- add_to_preamble(document,
["\\AtBeginDocument{\setotherlanguage{%s}}" % polyglossianame])
- document.body[endlang : endlang] = [startlayout,
- "\\begin_inset ERT", "status open", "",
- "\\begin_layout Plain Layout", "", "",
- "\\backslash",
- "end{%s}" % polyglossianame,
- "\\end_layout", "", "\\end_inset", "",
"",
- endlayout, ""]
+ add_to_preamble(document,
["\\AtBeginDocument{\setotherlanguage{%s}}" % polyglossianame])
+ document.body[endlang:endlang] =
put_cmd_in_ert("\\end{%s}"%polyglossianame,
+ is_open=True,
+
as_paragraph=as_paragraph)
elif with_babel:
- document.body[endlang : endlang] = [startlayout,
- "\\begin_inset ERT", "status open", "",
- "\\begin_layout Plain Layout", "", "",
- "\\backslash",
- "end{otherlanguage}",
- "\\end_layout", "", "\\end_inset", "",
"",
- endlayout, ""]
+ document.body[endlang:endlang] =
put_cmd_in_ert("\\end{otherlanguage}",
+ is_open=True,
+
as_paragraph=as_paragraph)
del document.body[i]
if with_polyglossia:
- document.body[i : i] = ["\\begin_inset ERT", "status open", "",
- "\\begin_layout Plain Layout", "", "",
- "\\backslash",
- "begin{%s}" % polyglossianame,
- "\\end_layout", "", "\\end_inset", "",
"",
- ""]
+ document.body[i:i] =
put_cmd_in_ert("\\begin{%s}"%polyglossianame,
+ is_open=True)
elif with_babel:
- document.body[i : i] = ["\\begin_inset ERT", "status open", "",
- "\\begin_layout Plain Layout", "", "",
- "\\backslash",
- "begin{otherlanguage}{%s}" % babelname,
- "\\end_layout", "", "\\end_inset", "",
"",
- ""]
+ document.body[i:i] =
put_cmd_in_ert("\\begin{otherlanguage}{%s}" % babelname,
+ is_open=True)
elif primary and document.body[i].startswith('\\lang english'):
# Since we switched the main language manually, English parts need
to be marked
endlang = get_containing_layout(document.body, i)[2]
langswitch = find_token(document.body, '\\lang', i + 1, endlang)
- startlayout = "\\begin_layout Standard"
- endlayout = "\\end_layout"
+ as_paragraph = True
if langswitch != -1:
endlang = langswitch
- startlayout = ""
- endlayout = ""
+ as_paragraph = False
if with_polyglossia:
parent = get_containing_layout(document.body, i)
- document.body[endlang : endlang] = [startlayout,
- "\\begin_inset ERT", "status open", "",
- "\\begin_layout Plain Layout", "", "",
- "\\backslash",
- "end{english}",
- "\\end_layout", "", "\\end_inset", "",
"",
- endlayout, ""]
+ document.body[endlang:endlang] =
put_cmd_in_ert("\\end{english}",
+ is_open=True,
+
as_paragraph=as_paragraph)
elif with_babel:
parent = get_containing_layout(document.body, i)
- document.body[endlang : endlang] = [startlayout,
- "\\begin_inset ERT", "status open", "",
- "\\begin_layout Plain Layout", "", "",
- "\\backslash",
- "end{otherlanguage}",
- "\\end_layout", "", "\\end_inset", "",
"",
- endlayout, ""]
+ document.body[endlang:endlang] =
put_cmd_in_ert("\\end{otherlanguage}",
+ is_open=True,
+
as_paragraph=as_paragraph)
del document.body[i]
if with_polyglossia:
- document.body[i : i] = ["\\begin_inset ERT", "status open", "",
- "\\begin_layout Plain Layout", "", "",
- "\\backslash",
- "begin{english}",
- "\\end_layout", "", "\\end_inset", "",
"",
- ""]
+ document.body[i:i] = put_cmd_in_ert("\\begin{english}",
+ is_open=True)
elif with_babel:
- document.body[i : i] = ["\\begin_inset ERT", "status open", "",
- "\\begin_layout Plain Layout", "", "",
- "\\backslash",
- "begin{otherlanguage}{english}",
- "\\end_layout", "", "\\end_inset", "",
"",
- ""]
+ document.body[i:i] =
put_cmd_in_ert("\\begin{otherlanguage}{english}",
+ is_open=True)
else:
i += 1
@@ -765,11 +734,5 @@ def revert_language(document, lyxname, babelname,
polyglossianame):
if secondary and document.body[10] != "selectlanguage{%s}" %
orig_doc_language:
# Since the user options are always placed after the babel options,
# we need to reset the main language
- document.body[2 : 2] = ["\\begin_layout Standard",
- "\\begin_inset ERT", "status open", "",
- "\\begin_layout Plain Layout", "", "",
- "\\backslash",
- "selectlanguage{%s}" % orig_doc_language,
- "\\end_layout", "", "\\end_inset", "", "",
- "\\end_layout", ""]
-
+ document.body[2:2] = put_cmd_in_ert("\\selectlanguage{%s}" %
orig_doc_language,
+ is_open=True,
as_paragraph=True)
diff --git a/lib/lyx2lyx/test_lyx2lyx_tools.py
b/lib/lyx2lyx/test_lyx2lyx_tools.py
index 186c0ba..a2c76fb 100644
--- a/lib/lyx2lyx/test_lyx2lyx_tools.py
+++ b/lib/lyx2lyx/test_lyx2lyx_tools.py
@@ -40,8 +40,32 @@ class TestParserTools(unittest.TestCase):
u'\\end_layout',
u'',
u'\\end_inset']
- self.assertEqual(put_cmd_in_ert(u"\\texttt{Grüße}"), ert)
+ ert_open = ert[:]
+ ert_open[1] = u'status open'
+ ert_paragraph = ["\\begin_layout Standard",
+ u'\\begin_inset ERT',
+ u'status collapsed',
+ u'',
+ u'\\begin_layout Plain Layout',
+ u'',
+ u'',
+ u'\\backslash',
+ u'texttt{Gr',
+ u'\\backslash',
+ u'"{u}',
+ u'\\backslash',
+ u'ss{}e}',
+ u'\\end_layout',
+ u'',
+ u'\\end_inset',
+ u'',
+ u'',
+ u'\\end_layout',
+ u'']
+ self.assertEqual(put_cmd_in_ert("\\texttt{Grüße}"), ert)
self.assertEqual(put_cmd_in_ert([u"\\texttt{Grüße}"]), ert)
+ self.assertEqual(put_cmd_in_ert(u"\\texttt{Grüße}", is_open=True),
ert_open)
+ self.assertEqual(put_cmd_in_ert(u"\\texttt{Grüße}",
as_paragraph=True), ert_paragraph)
def test_latex_length(self):
self.assertEqual(latex_length("-30.5col%"), (True,
"-0.305\\columnwidth"))