# find_token_backwards, is_in_inset, get_value, get_quoted_value, \
# del_token, check_token, get_option_value
-from lyx2lyx_tools import add_to_preamble, put_cmd_in_ert, lyx2latex, \
- length_in_bp
+from lyx2lyx_tools import add_to_preamble, put_cmd_in_ert, get_ert, lyx2latex, \
+ lyx2verbatim, length_in_bp, convert_info_insets
# insert_to_preamble, latex_length, revert_flex_inset, \
# revert_font_attrs, hex2ratio, str2bool
i = find_token(document.header, "\\use_package amsmath", 0)
if i == -1:
document.warning("Malformed LyX document: Can't find \\use_package amsmath.")
- return;
+ return
value = get_value(document.header, "\\use_package amsmath", i).split()[1]
if value != "1":
# nothing to do if package is not auto but on or off
- return;
+ return
j = 0
while True:
j = find_token(document.body, '\\begin_inset Formula', j)
"""
# Do we use theorems-ams-extended-bytype module?
- have_mod = False
- mods = document.get_module_list()
- for mod in mods:
- if mod == "theorems-ams-extended-bytype":
- have_mod = True
- continue
-
- if not have_mod:
+ if not "theorems-ams-extended-bytype" in document.get_module_list():
return
consecutive = False
def revert_ex_itemargs(document):
" Reverts \\item arguments of the example environments (Linguistics module) to TeX-code "
- # Do we use the linguistics module?
- have_mod = False
- mods = document.get_module_list()
- for mod in mods:
- if mod == "linguistics":
- have_mod = True
- continue
-
- if not have_mod:
+ if not "linguistics" in document.get_module_list():
return
i = 0
def revert_forest(document):
" Reverts the forest environment (Linguistics module) to TeX-code "
- # Do we use the linguistics module?
- have_mod = False
- mods = document.get_module_list()
- for mod in mods:
- if mod == "linguistics":
- have_mod = True
- continue
-
- if not have_mod:
+ if not "linguistics" in document.get_module_list():
return
i = 0
add_to_preamble(document, ["\\usepackage{forest}"])
- document.body[i:j + 1] = ["\\begin_inset ERT", "status collapsed", "",
- "\\begin_layout Plain Layout", "", "\\backslash",
- "begin{forest}", "\\end_layout", "", "\\begin_layout Plain Layout",
- content, "\\end_layout", "", "\\begin_layout Plain Layout",
- "\\backslash", "end{forest}", "", "\\end_layout", "", "\\end_inset"]
+ document.body[i:j + 1] = put_cmd_in_ert("\\begin{forest}" + content + "\\end{forest}")
# no need to reset i
def revert_glossgroup(document):
" Reverts the GroupGlossedWords inset (Linguistics module) to TeX-code "
- # Do we use the linguistics module?
- have_mod = False
- mods = document.get_module_list()
- for mod in mods:
- if mod == "linguistics":
- have_mod = True
- continue
-
- if not have_mod:
+ if not "linguistics" in document.get_module_list():
return
i = 0
beginPlain = find_token(document.body, "\\begin_layout Plain Layout", i)
endPlain = find_end_of_layout(document.body, beginPlain)
- content = lyx2latex(document, document.body[beginPlain : endPlain])
+ content = lyx2verbatim(document, document.body[beginPlain : endPlain])
document.body[i:j + 1] = ["{", "", content, "", "}"]
# no need to reset i
def revert_newgloss(document):
" Reverts the new Glosse insets (Linguistics module) to the old format "
- # Do we use the linguistics module?
- have_mod = False
- mods = document.get_module_list()
- for mod in mods:
- if mod == "linguistics":
- have_mod = True
- continue
-
- if not have_mod:
+ if not "linguistics" in document.get_module_list():
return
glosses = ("\\begin_inset Flex Glosse", "\\begin_inset Flex Tri-Glosse")
i += 1
continue
argendPlain = find_end_of_inset(document.body, argbeginPlain)
- argcontent = lyx2latex(document, document.body[argbeginPlain : argendPlain - 2])
+ argcontent = lyx2verbatim(document, document.body[argbeginPlain : argendPlain - 2])
document.body[j:j] = ["", "\\begin_layout Plain Layout","\\backslash", "glt ",
argcontent, "\\end_layout"]
beginPlain = find_token(document.body, "\\begin_layout Plain Layout", i)
endPlain = find_end_of_layout(document.body, beginPlain)
- content = lyx2latex(document, document.body[beginPlain : endPlain])
+ content = lyx2verbatim(document, document.body[beginPlain : endPlain])
document.body[beginPlain + 1:endPlain] = [content]
i = beginPlain + 1
+ # Dissolve ERT insets
+ for glosse in glosses:
+ i = 0
+ while True:
+ i = find_token(document.body, glosse, i)
+ if i == -1:
+ break
+ j = find_end_of_inset(document.body, i)
+ if j == -1:
+ document.warning("Malformed LyX document: Can't find end of Glosse inset")
+ i += 1
+ continue
+ while True:
+ ert = find_token(document.body, "\\begin_inset ERT", i, j)
+ if ert == -1:
+ break
+ ertend = find_end_of_inset(document.body, ert)
+ if ertend == -1:
+ document.warning("Malformed LyX document: Can't find end of ERT inset")
+ ert += 1
+ continue
+ ertcontent = get_ert(document.body, ert, True)
+ document.body[ert : ertend + 1] = [ertcontent]
+ i += 1
+
def convert_newgloss(document):
" Converts Glosse insets (Linguistics module) to the new format "
- # Do we use the linguistics module?
- have_mod = False
- mods = document.get_module_list()
- for mod in mods:
- if mod == "linguistics":
- have_mod = True
- continue
-
- if not have_mod:
+ if not "linguistics" in document.get_module_list():
return
glosses = ("\\begin_inset Flex Glosse", "\\begin_inset Flex Tri-Glosse")
i = find_token(document.header, "\\textclass ", 0)
if i == -1:
document.warning("Malformed LyX document: No \\textclass!!")
- return;
+ return
if document.dir == "":
origin = "stdin"
else:
i = find_token(document.header, "\\origin ", 0)
if i == -1:
document.warning("Malformed LyX document: No \\origin!!")
- return;
+ return
del document.header[i]
h = find_token(document.body, "\\begin_inset Flex Code Chunk", h)
if h != -1:
endh = find_end_of_inset(document.body, h)
- document.body[endh + 1 : endh] = ["\\end_layout"]
document.body[endh : endh + 1] = put_cmd_in_ert("\\end{CodeChunk}")
document.body[h : h + 3] = put_cmd_in_ert("\\begin{CodeChunk}")
document.body[h - 1 : h] = ["\\begin_layout Standard"]
i += 1
-def convert_moderncv(document):
- " Convert the Fax and Mobile inset of moderncv to the new phone inset "
-
- if document.textclass != "moderncv":
- return
- i = 0
- j = 0
- lineArg = 0
- while True:
- # \mobile
- i = find_token(document.body, "\\begin_layout Mobile", i)
- if i == -1:
- return
- j = find_end_of_layout(document.body, i)
- if j == -1:
- document.warning("Malformed LyX document: Can't find end of Mobile layout")
- i += 1
- return
- document.body[i + 1 : i + 1] = ["\\begin_inset Argument 1", "status open", "",
- "\\begin_layout Plain Layout", "mobile", "\\end_layout", "",
- "\\end_inset", ""]
- # \fax
- i = find_token(document.body, "\\begin_layout Fax", i)
- if i == -1:
- return
- j = find_end_of_layout(document.body, i)
- if j == -1:
- document.warning("Malformed LyX document: Can't find end of Fax layout")
- i += 1
- return
- document.body[i + 1 : i + 1] = ["\\begin_inset Argument 1", "status open", "",
- "\\begin_layout Plain Layout", "fax", "\\end_layout", "",
- "\\end_inset", ""]
- # \firstname and \familyname
- i1 = find_token(document.body, "\\begin_layout FirstName", 0)
- if i1 == -1:
- return
- j1 = find_end_of_layout(document.body, i1)
- if j1 == -1:
- document.warning("Malformed LyX document: Can't find end of FirstName layout")
- i1 += 1
- return
- FirstName = document.body[i1 + 1 : i1 + 2]
- i2 = find_token(document.body, "\\begin_layout FamilyName", 0)
- if i2 == -1:
- return
- j2 = find_end_of_layout(document.body, i2)
- if j2 == -1:
- document.warning("Malformed LyX document: Can't find end of FamilyName layout")
- i2 += 1
- return
- FamilyName = document.body[i2 + 1 : i2 + 2]
- if j1 > j2:
- k = j1
- l = i2
- else:
- k = j2
- l = i1
- document.body[k + 1 : k + 1] = ["\\begin_layout Name", "\\begin_inset Argument 1", "status open", "",
- "\\begin_layout Plain Layout", FirstName[0], "\\end_layout", "",
- "\\end_inset", "", FamilyName[0], "\\end_layout", ""]
- #document.body[i2 + 1 : i2 + 1] = ["hellok: ", str(k)]
- del(document.body[l : k])
- i += 1
- i1 += 1
- i2 += 1
+def convert_moderncv_phone(document):
+ " Convert the Fax and Mobile inset of moderncv to the new phone inset "
+
+ if document.textclass != "moderncv":
+ return
+ i = 0
+ j = 0
+ lineArg = 0
+
+ phone_dict = {
+ "Mobile" : "mobile",
+ "Fax" : "fax",
+ }
+
+ rx = re.compile(r'^\\begin_layout (\S+)$')
+ while True:
+ # substitute \fax and \mobile by \phone[fax] and \phone[mobile], respectively
+ i = find_token(document.body, "\\begin_layout", i)
+ if i == -1:
+ return
+
+ m = rx.match(document.body[i])
+ val = ""
+ if m:
+ val = m.group(1)
+ if val not in list(phone_dict.keys()):
+ i += 1
+ continue
+ j = find_end_of_layout(document.body, i)
+ if j == -1:
+ document.warning("Malformed LyX document: Can't find end of Mobile layout")
+ i += 1
+ return
+
+ document.body[i : i + 1] = ["\\begin_layout Phone", "\\begin_inset Argument 1", "status open", "",
+ "\\begin_layout Plain Layout", phone_dict[val], "\\end_layout", "",
+ "\\end_inset", ""]
+
+
+def convert_moderncv_name(document):
+ " Convert the FirstName and LastName layout of moderncv to the general Name layout "
+
+ if document.textclass != "moderncv":
+ return
+
+ fnb = 0 # Begin of FirstName inset
+ fne = 0 # End of FirstName inset
+ lnb = 0 # Begin of LastName (FamilyName) inset
+ lne = 0 # End of LastName (FamilyName) inset
+ nb = 0 # Begin of substituting Name inset
+ ne = 0 # End of substituting Name inset
+ FirstName = [] # FirstName content
+ FamilyName = [] # LastName content
+
+ while True:
+ # locate FirstName
+ fnb = find_token(document.body, "\\begin_layout FirstName", fnb)
+ if fnb != -1:
+ fne = find_end_of_layout(document.body, fnb)
+ if fne == -1:
+ document.warning("Malformed LyX document: Can't find end of FirstName layout")
+ return
+ FirstName = document.body[fnb + 1 : fne]
+ # locate FamilyName
+ lnb = find_token(document.body, "\\begin_layout FamilyName", lnb)
+ if lnb != -1:
+ lne = find_end_of_layout(document.body, lnb)
+ if lne == -1:
+ document.warning("Malformed LyX document: Can't find end of FamilyName layout")
+ return
+ FamilyName = document.body[lnb + 1 : lne]
+ # Determine the region for the substituting Name layout
+ if fnb == -1 and lnb == -1: # Neither FirstName nor FamilyName exists -> Do nothing
+ return
+ elif fnb == -1: # Only FamilyName exists -> New Name insets replaces that
+ nb = lnb
+ ne = lne
+ elif lnb == -1: # Only FirstName exists -> New Name insets replaces that
+ nb = fnb
+ ne = fne
+ elif fne > lne: # FirstName position before FamilyName -> New Name insets spans
+ nb = lnb # from FamilyName begin
+ ne = fne # to FirstName end
+ else: # FirstName position before FamilyName -> New Name insets spans
+ nb = fnb # from FirstName begin
+ ne = lne # to FamilyName end
+
+ # Insert the substituting layout now. If FirstName exists, use an otpional argument.
+ if FirstName == []:
+ document.body[nb : ne + 1] = ["\\begin_layout Name"] + FamilyName + ["\\end_layout", ""]
+ else:
+ document.body[nb : ne + 1] = ["\\begin_layout Name", "\\begin_inset Argument 1", "status open", "",
+ "\\begin_layout Plain Layout"] + FirstName + ["\\end_layout", "",
+ "\\end_inset", ""] + FamilyName + ["\\end_layout", ""]
def revert_achemso(document):
i = find_token(document.header, f + " ", 0)
if i == -1:
document.warning("Malformed LyX document: No " + f + "!")
- j = j + 1
- continue
- value = document.header[i][len(f):].strip()
+ # we can fix that
+ # note that with i = -1, this will insert at the end
+ # of the header
+ value = fontdefaults[j]
+ else:
+ value = document.header[i][len(f):].strip()
if fontquotes[j]:
if use_non_tex_fonts == "true":
document.header[i:i+1] = [f + ' "' + fontdefaults[j] + '" "' + value + '"']
document.header[i:i+1] = [f + ' ' + line[q1+1:q2]]
else:
if use_non_tex_fonts == "true":
- document.header[i:i+1] = [f + ' ' + line.split()[2]]
- else:
document.header[i:i+1] = [f + ' ' + line.split()[1]]
+ else:
+ document.header[i:i+1] = [f + ' ' + line.split()[0]]
j = j + 1
def revert_solution(document):
- " Reverts the solution environmen of the theorem module to TeX code "
+ " Reverts the solution environment of the theorem module to TeX code "
- # Do we use theorems-std module?
+ # Do we use one of the modules that provides Solution?
have_mod = False
mods = document.get_module_list()
for mod in mods:
if mod == "theorems-std" or mod == "theorems-bytype" \
or mod == "theorems-ams" or mod == "theorems-ams-bytype":
have_mod = True
- continue
+ break
if not have_mod:
return
+
consecutive = False
+ is_starred = False
i = 0
while True:
i = find_token(document.body, "\\begin_layout Solution", i)
if i == -1:
return
+
+ is_starred = document.body[i].startswith("\\begin_layout Solution*")
+ if is_starred == True:
+ LaTeXName = "sol*"
+ LyXName = "Solution*"
+ theoremName = "newtheorem*"
+ else:
+ LaTeXName = "sol"
+ LyXName = "Solution"
+ theoremName = "newtheorem"
+
j = find_end_of_layout(document.body, i)
if j == -1:
- document.warning("Malformed LyX document: Can't find end of Solution layout")
+ document.warning("Malformed LyX document: Can't find end of " + LyXName + " layout")
i += 1
continue
+
# if this is not a consecutive env, add start command
begcmd = []
if not consecutive:
- begcmd = put_cmd_in_ert("\\begin{sol}")
+ begcmd = put_cmd_in_ert("\\begin{%s}" % (LaTeXName))
+
# has this a consecutive theorem of same type?
- consecutive = False
- consecutive = document.body[j + 2] == "\\begin_layout Solution"
+ consecutive = document.body[j + 2] == "\\begin_layout " + LyXName
+
# if this is not followed by a consecutive env, add end command
if not consecutive:
- document.body[j : j + 1] = put_cmd_in_ert("\\end{sol}") + ["\\end_layout"]
+ document.body[j : j + 1] = put_cmd_in_ert("\\end{%s}" % (LaTeXName)) + ["\\end_layout"]
+
document.body[i : i + 1] = ["\\begin_layout Standard", ""] + begcmd
+
+ add_to_preamble(document, "\\theoremstyle{definition}")
+ if is_starred or mod == "theorems-bytype" or mod == "theorems-ams-bytype":
+ add_to_preamble(document, "\\%s{%s}{\\protect\\solutionname}" % \
+ (theoremName, LaTeXName))
+ else: # mod == "theorems-std" or mod == "theorems-ams" and not is_starred
+ add_to_preamble(document, "\\%s{%s}[thm]{\\protect\\solutionname}" % \
+ (theoremName, LaTeXName))
+
add_to_preamble(document, "\\providecommand{\solutionname}{Solution}")
- if mod == "theorems-std" or mod == "theorems-ams":
- add_to_preamble(document, "\\theoremstyle{plain}\n" \
- "\\newtheorem{sol}[thm]{\\protect\\solutionname}")
- if mod == "theorems-bytype" or mod == "theorems-ams-bytype":
- add_to_preamble(document, "\\theoremstyle{definition}\n" \
- "\\newtheorem{sol}{\\protect\\solutionname}")
i = j
revert_verbatim(document, True)
+def convert_save_props(document):
+ " Add save_transient_properties parameter. "
+ i = find_token(document.header, '\\begin_header', 0)
+ if i == -1:
+ document.warning("Malformed lyx document: Missing '\\begin_header'.")
+ return
+ document.header.insert(i + 1, '\\save_transient_properties true')
+
+
+def revert_save_props(document):
+ " Remove save_transient_properties parameter. "
+ i = find_token(document.header, "\\save_transient_properties", 0)
+ if i == -1:
+ return
+ del document.header[i]
+
+
+def convert_info_tabular_feature(document):
+ def f(arg):
+ return arg.replace("inset-modify tabular", "tabular-feature")
+ convert_info_insets(document, "shortcut(s)?|icon", f)
+
+
+def revert_info_tabular_feature(document):
+ def f(arg):
+ return arg.replace("tabular-feature", "inset-modify tabular")
+ convert_info_insets(document, "shortcut(s)?|icon", f)
+
+
##
# Conversion hub
#
[496, [convert_nounzip]],
[497, [convert_external_bbox]],
[498, []],
- [499, [convert_moderncv]],
+ [499, [convert_moderncv_phone, convert_moderncv_name]],
[500, []],
[501, [convert_fontsettings]],
[502, []],
- [503, []]
+ [503, []],
+ [504, [convert_save_props]],
+ [505, []],
+ [506, [convert_info_tabular_feature]]
]
revert = [
+ [505, [revert_info_tabular_feature]],
+ [504, []],
+ [503, [revert_save_props]],
[502, [revert_verbatim_star]],
[501, [revert_solution]],
[500, [revert_fontsettings]],