Rewrite and split the moderncv conversion routine.

This fixes several conversion problems, amongst others the redundant
\end_layout reported by Kornel.
This commit is contained in:
Juergen Spitzmueller 2015-12-27 12:48:11 +01:00
parent 5b2fb80491
commit a80da13cc1

View File

@ -1910,72 +1910,100 @@ def revert_moderncv_2(document):
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):
@ -2180,7 +2208,7 @@ convert = [
[496, [convert_nounzip]],
[497, [convert_external_bbox]],
[498, []],
[499, [convert_moderncv]],
[499, [convert_moderncv_phone, convert_moderncv_name]],
[500, []],
[501, [convert_fontsettings]],
[502, []],