rewrite revert_jss reversion routine

Fixes: #11448
This commit is contained in:
Juergen Spitzmueller 2019-01-04 16:34:33 +01:00
parent a69e01d0b4
commit 348b3e5e49

View File

@ -1360,215 +1360,127 @@ def revert_jss(document):
if document.textclass != "jss":
return
h = 0
m = 0
j = 0
k = 0
n = 0
# at first revert the inset layouts because
# they can be part of the In_Preamble layouts
il_dict = {
"Pkg" : "pkg",
"Proglang" : "proglang",
"Code" : "code",
"E-mail" : "email",
"URL" : "url",
}
for iltype in il_dict.keys():
i = 0
while True:
# at first revert the inset layouts because they can be part of the In_Preamble layouts
while m != -1 or j != -1 or h != -1 or k != -1 or n != -1:
# \pkg
if h != -1:
h = find_token(document.body, "\\begin_inset Flex Pkg", h)
if h != -1:
endh = find_end_of_inset(document.body, h)
document.body[endh - 2 : endh + 1] = put_cmd_in_ert("}")
document.body[h : h + 4] = put_cmd_in_ert("\\pkg{")
h = h + 5
# \proglang
if m != -1:
m = find_token(document.body, "\\begin_inset Flex Proglang", m)
if m != -1:
endm = find_end_of_inset(document.body, m)
document.body[endm - 2 : endm + 1] = put_cmd_in_ert("}")
document.body[m : m + 4] = put_cmd_in_ert("\\proglang{")
m = m + 5
# \code
if j != -1:
j = find_token(document.body, "\\begin_inset Flex Code", j)
if j != -1:
# assure that we are not in a Code Chunk inset
if document.body[j][-1] == "e":
endj = find_end_of_inset(document.body, j)
document.body[endj - 2 : endj + 1] = put_cmd_in_ert("}")
document.body[j : j + 4] = put_cmd_in_ert("\\code{")
j = j + 5
else:
j = j + 1
# \email
if k != -1:
k = find_token(document.body, "\\begin_inset Flex E-mail", k)
if k != -1:
endk = find_end_of_inset(document.body, k)
document.body[endk - 2 : endk + 1] = put_cmd_in_ert("}")
document.body[k : k + 4] = put_cmd_in_ert("\\email{")
k = k + 5
# \url
if n != -1:
n = find_token(document.body, "\\begin_inset Flex URL", n)
if n != -1:
endn = find_end_of_inset(document.body, n)
document.body[endn - 2 : endn + 1] = put_cmd_in_ert("}")
document.body[n : n + 4] = put_cmd_in_ert("\\url{")
n = n + 5
i = find_token(document.body, "\\begin_inset Flex " + iltype, i)
if i != -1:
break
if iltype == "Code" and document.body[i][-1] != "e":
# Code Chunk inset. Continue
i += 1
continue
end = find_end_of_inset(document.body, i)
if end == -1:
document.warning("Malformed LyX document: No end of Flex " + iltype + " found!")
i += 1
continue
document.body[end - 2 : end + 1] = put_cmd_in_ert("}")
document.body[i : i + 4] = put_cmd_in_ert("\\%s{" % il_dict[iltype])
i += 1
# now revert the In_Preamble layouts
# \title
i = find_token(document.body, "\\begin_layout Title", 0)
ipl_dict = {
"Title" : "title",
"Author" : "author",
"Plain Author" : "Plainauthor",
"Plain Title" : "Plaintitle",
"Short Title" : "Shorttitle",
"Abstract" : "Abstract",
"Keywords" : "Keywords",
"Plain Keywords" : "Plainkeywords",
"Address" : "Address",
}
for ipltype in ipl_dict.keys():
i = 0
while True:
i = find_token(document.body, "\\begin_layout " + ipltype, 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 Title layout")
break
end = find_end_of_layout(document.body, i)
if end == -1:
document.warning("Malformed LyX document: Can't find end of " + ipltype + " layout")
i += 1
continue
content = lyx2latex(document, document.body[i:j + 1])
add_to_preamble(document, ["\\title{" + content + "}"])
del document.body[i:j + 1]
# \author
i = find_token(document.body, "\\begin_layout Author", 0)
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 Author layout")
content = lyx2latex(document, document.body[i:end + 1])
add_to_preamble(document, ["\\" + ipl_dict[ipltype] + "{" + content + "}"])
del document.body[i:end + 1]
i += 1
continue
content = lyx2latex(document, document.body[i:j + 1])
add_to_preamble(document, ["\\author{" + content + "}"])
del document.body[i:j + 1]
# \Plainauthor
i = find_token(document.body, "\\begin_layout Plain Author", 0)
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 Plain Author layout")
i += 1
continue
content = lyx2latex(document, document.body[i:j + 1])
add_to_preamble(document, ["\\Plainauthor{" + content + "}"])
del document.body[i:j + 1]
# \Plaintitle
i = find_token(document.body, "\\begin_layout Plain Title", 0)
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 Plain Title layout")
i += 1
continue
content = lyx2latex(document, document.body[i:j + 1])
add_to_preamble(document, ["\\Plaintitle{" + content + "}"])
del document.body[i:j + 1]
# \Shorttitle
i = find_token(document.body, "\\begin_layout Short Title", 0)
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 Short Title layout")
i += 1
continue
content = lyx2latex(document, document.body[i:j + 1])
add_to_preamble(document, ["\\Shorttitle{" + content + "}"])
del document.body[i:j + 1]
# \Abstract
i = find_token(document.body, "\\begin_layout Abstract", 0)
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 Abstract layout")
i += 1
continue
content = lyx2latex(document, document.body[i:j + 1])
add_to_preamble(document, ["\\Abstract{" + content + "}"])
del document.body[i:j + 1]
# \Keywords
i = find_token(document.body, "\\begin_layout Keywords", 0)
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 Keywords layout")
i += 1
continue
content = lyx2latex(document, document.body[i:j + 1])
add_to_preamble(document, ["\\Keywords{" + content + "}"])
del document.body[i:j + 1]
# \Plainkeywords
i = find_token(document.body, "\\begin_layout Plain Keywords", 0)
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 Plain Keywords layout")
i += 1
continue
content = lyx2latex(document, document.body[i:j + 1])
add_to_preamble(document, ["\\Plainkeywords{" + content + "}"])
del document.body[i:j + 1]
# \Address
i = find_token(document.body, "\\begin_layout Address", 0)
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 Address layout")
i += 1
continue
content = lyx2latex(document, document.body[i:j + 1])
add_to_preamble(document, ["\\Address{" + content + "}"])
del document.body[i:j + 1]
# finally handle the code layouts
h = 0
m = 0
j = 0
k = 0
while m != -1 or j != -1 or h != -1 or k != -1:
# Now code chunks
i = 0
while True:
# \CodeChunk
if h != -1:
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 : 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"]
h = h + 1
# \CodeInput
if j != -1:
j = find_token(document.body, "\\begin_layout Code Input", j)
if j != -1:
endj = find_end_of_layout(document.body, j)
document.body[endj : endj + 1] = ["\\end_layout", "", "\\begin_layout Standard"]
document.body[endj + 3 : endj + 4] = put_cmd_in_ert("\\end{CodeInput}")
document.body[endj + 13 : endj + 13] = ["\\end_layout", "", "\\begin_layout Standard"]
document.body[j + 1 : j] = ["\\end_layout", "", "\\begin_layout Standard"]
document.body[j : j + 1] = put_cmd_in_ert("\\begin{CodeInput}")
j = j + 1
# \CodeOutput
if k != -1:
k = find_token(document.body, "\\begin_layout Code Output", k)
if k != -1:
endk = find_end_of_layout(document.body, k)
document.body[endk : endk + 1] = ["\\end_layout", "", "\\begin_layout Standard"]
document.body[endk + 3 : endk + 4] = put_cmd_in_ert("\\end{CodeOutput}")
document.body[endk + 13 : endk + 13] = ["\\end_layout", "", "\\begin_layout Standard"]
document.body[k + 1 : k] = ["\\end_layout", "", "\\begin_layout Standard"]
document.body[k : k + 1] = put_cmd_in_ert("\\begin{CodeOutput}")
k = k + 1
# \Code
if m != -1:
m = find_token(document.body, "\\begin_layout Code", m)
if m != -1:
endm = find_end_of_layout(document.body, m)
document.body[endm : endm + 1] = ["\\end_layout", "", "\\begin_layout Standard"]
document.body[endm + 3 : endm + 4] = put_cmd_in_ert("\\end{Code}")
document.body[endm + 13 : endm + 13] = ["\\end_layout", "", "\\begin_layout Standard"]
document.body[m + 1 : m] = ["\\end_layout", "", "\\begin_layout Standard"]
document.body[m : m + 1] = put_cmd_in_ert("\\begin{Code}")
m = m + 1
i = find_token(document.body, "\\begin_inset Flex Code Chunk", i)
if i == -1:
break
end = find_end_of_inset(document.body, i)
if end == -1:
document.warning("Malformed LyX document: No end of Flex Code Chunk found!")
i += 1
continue
document.body[end : end + 1] = ["\\end_layout", "", "\\begin_layout Standard"] + put_cmd_in_ert("\\end{CodeChunk}")
document.body[i : i + 2] = put_cmd_in_ert("\\begin{CodeChunk}")
i += 1
# finally handle the code layouts
codes_dict = {
"Code Input" : "CodeInput",
"Code Output" : "CodeOutput",
"Code" : "Code",
}
for ctype in codes_dict.keys():
i = 0
while True:
i = find_token(document.body, "\\begin_layout " + ctype, i)
if i == -1:
break
if document.body[i] != "\\begin_layout " + ctype:
# Not an exact match!
i += 1
continue
end = find_end_of_layout(document.body, i)
if end == -1:
document.warning("Malformed LyX document: No end of " + ctype + " layout found!")
i += 1
continue
seq_end = end
# Handle subsequent layouts
while True:
j = find_token(document.body, "\\begin_layout ", seq_end)
if j == -1 or document.body[j] != "\\begin_layout " + ctype:
break
this_end = find_end_of_layout(document.body, j)
if this_end == -1:
document.warning("Malformed LyX document: No end of " + ctype + " layout found!")
j += 1
continue
seq_end = this_end
document.body[seq_end + 1 : seq_end + 1] = ["\\end_inset", "\\end_layout", "", "\\begin_layout Standard"] + put_cmd_in_ert("\\end{%s}" % codes_dict[ctype])
if seq_end != end:
k = i + 1
while k < seq_end:
document.body[k] = document.body[k].replace("\\begin_layout " + ctype, "\\begin_layout Plain Layout")
k += 1
document.body[i : i + 1] = ["\\end_layout", "", "\\begin_layout Standard"] \
+ put_cmd_in_ert("\\begin{%s}" % codes_dict[ctype]) \
+ ["\\end_layout", "", "\\begin_layout Standard", "", "\\begin_inset ERT", "status open", "", "\\begin_layout Plain Layout"]
i += 1
def convert_subref(document):