lyx2lyx/lyx_2_2.py: rewrite the box reversion routines

- will fix several bugs with nested boxes
This commit is contained in:
Uwe Stöhr 2017-04-17 21:06:47 +02:00
parent 848c424588
commit 113c9a2f7f

View File

@ -1089,43 +1089,57 @@ def revert_BoxFeatures(document):
defaultThick = "0.4pt" defaultThick = "0.4pt"
defaultShadow = "4pt" defaultShadow = "4pt"
while True: while True:
i = find_token(document.body, "height_special", i) i = find_token(document.body, "thickness", i)
if i == -1: if i == -1:
return return
binset = find_token(document.body, "\\begin_inset Box", i - 11)
if binset == -1:
return # then "thickness" is is just a word in the text
einset = find_end_of_inset(document.body, binset)
if einset == -1:
document.warning("Malformed LyX document: Can't find end of box inset!")
continue
# read out the values # read out the values
beg = document.body[i].find('"');
end = document.body[i].rfind('"');
thickness = document.body[i][beg+1:end];
beg = document.body[i+1].find('"'); beg = document.body[i+1].find('"');
end = document.body[i+1].rfind('"'); end = document.body[i+1].rfind('"');
thickness = document.body[i+1][beg+1:end]; separation = document.body[i+1][beg+1:end];
beg = document.body[i+2].find('"'); beg = document.body[i+2].find('"');
end = document.body[i+2].rfind('"'); end = document.body[i+2].rfind('"');
separation = document.body[i+2][beg+1:end]; shadowsize = document.body[i+2][beg+1:end];
beg = document.body[i+3].find('"');
end = document.body[i+3].rfind('"');
shadowsize = document.body[i+3][beg+1:end];
# delete the specification # delete the specification
del document.body[i+1:i+4] del document.body[i:i+3]
# output ERT # output ERT
# first output the closing brace # first output the closing brace
if shadowsize != defaultShadow or separation != defaultSep or thickness != defaultThick: if shadowsize != defaultShadow or separation != defaultSep or thickness != defaultThick:
document.body[i + 10 : i + 10] = put_cmd_in_ert("}") document.body[einset -1 : einset - 1] = put_cmd_in_ert("}")
# we have now the problem that if there is already \(f)colorbox in ERT around the inset
# the ERT from this routine must be around it
regexp = re.compile(r'^.*colorbox{.*$')
pos = find_re(document.body, regexp, binset - 4)
if pos != -1 and pos == binset - 4:
pos = i - 11 - 10
else:
pos = i - 11
# now output the lengths # now output the lengths
if shadowsize != defaultShadow or separation != defaultSep or thickness != defaultThick: if shadowsize != defaultShadow or separation != defaultSep or thickness != defaultThick:
document.body[i - 10 : i - 10] = put_cmd_in_ert("{") document.body[pos : pos] = put_cmd_in_ert("{")
if thickness != defaultThick: if thickness != defaultThick:
document.body[i - 5 : i - 4] = ["{\\backslash fboxrule " + thickness] document.body[pos + 5 : pos +6] = ["{\\backslash fboxrule " + thickness]
if separation != defaultSep and thickness == defaultThick: if separation != defaultSep and thickness == defaultThick:
document.body[i - 5 : i - 4] = ["{\\backslash fboxsep " + separation] document.body[pos + 5 : pos +6] = ["{\\backslash fboxsep " + separation]
if separation != defaultSep and thickness != defaultThick: if separation != defaultSep and thickness != defaultThick:
document.body[i - 5 : i - 4] = ["{\\backslash fboxrule " + thickness + "\\backslash fboxsep " + separation] document.body[pos + 5 : pos +6] = ["{\\backslash fboxrule " + thickness + "\\backslash fboxsep " + separation]
if shadowsize != defaultShadow and separation == defaultSep and thickness == defaultThick: if shadowsize != defaultShadow and separation == defaultSep and thickness == defaultThick:
document.body[i - 5 : i - 4] = ["{\\backslash shadowsize " + shadowsize] document.body[pos + 5 : pos +6] = ["{\\backslash shadowsize " + shadowsize]
if shadowsize != defaultShadow and separation != defaultSep and thickness == defaultThick: if shadowsize != defaultShadow and separation != defaultSep and thickness == defaultThick:
document.body[i - 5 : i - 4] = ["{\\backslash fboxsep " + separation + "\\backslash shadowsize " + shadowsize] document.body[pos + 5 : pos +6] = ["{\\backslash fboxsep " + separation + "\\backslash shadowsize " + shadowsize]
if shadowsize != defaultShadow and separation == defaultSep and thickness != defaultThick: if shadowsize != defaultShadow and separation == defaultSep and thickness != defaultThick:
document.body[i - 5 : i - 4] = ["{\\backslash fboxrule " + thickness + "\\backslash shadowsize " + shadowsize] document.body[pos + 5 : pos +6] = ["{\\backslash fboxrule " + thickness + "\\backslash shadowsize " + shadowsize]
if shadowsize != defaultShadow and separation != defaultSep and thickness != defaultThick: if shadowsize != defaultShadow and separation != defaultSep and thickness != defaultThick:
document.body[i - 5 : i - 4] = ["{\\backslash fboxrule " + thickness + "\\backslash fboxsep " + separation + "\\backslash shadowsize " + shadowsize] document.body[pos + 5 : pos +6] = ["{\\backslash fboxrule " + thickness + "\\backslash fboxsep " + separation + "\\backslash shadowsize " + shadowsize]
i = i + 11
def convert_origin(document): def convert_origin(document):
@ -1224,66 +1238,53 @@ def convert_colorbox(document):
def revert_colorbox(document): def revert_colorbox(document):
" outputs color settings for boxes as TeX code " " outputs color settings for boxes as TeX code "
binset = 0 i = 0
defaultframecolor = "black" defaultframecolor = "black"
defaultbackcolor = "none" defaultbackcolor = "none"
while True: while True:
binset = find_token(document.body, "\\begin_inset Box", binset) i = find_token(document.body, "framecolor", i)
if i == -1:
return
binset = find_token(document.body, "\\begin_inset Box", i - 14)
if binset == -1: if binset == -1:
return return
einset = find_end_of_inset(document.body, binset) einset = find_end_of_inset(document.body, binset)
if einset == -1: if einset == -1:
document.warning("Malformed LyX document: Can't find end of box inset!") document.warning("Malformed LyX document: Can't find end of box inset!")
binset += 1
continue continue
# read out the values
blay = find_token(document.body, "\\begin_layout", binset, einset) beg = document.body[i].find('"');
if blay == -1: end = document.body[i].rfind('"');
document.warning("Malformed LyX document: Can't find start of layout!") framecolor = document.body[i][beg+1:end];
binset = einset beg = document.body[i + 1].find('"');
continue end = document.body[i + 1].rfind('"');
backcolor = document.body[i+1][beg+1:end];
# doing it this way, we make sure only to find a framecolor option # delete the specification
frame = find_token(document.body, "framecolor", binset, blay) del document.body[i:i + 2]
if frame == -1: # output ERT
binset = einset
continue
beg = document.body[frame].find('"')
end = document.body[frame].rfind('"')
framecolor = document.body[frame][beg + 1 : end]
# this should be on the next line
bgcolor = frame + 1
beg = document.body[bgcolor].find('"')
end = document.body[bgcolor].rfind('"')
backcolor = document.body[bgcolor][beg + 1 : end]
# delete those bits
del document.body[frame : frame + 2]
# adjust end of inset
einset -= 2
if document.body[binset] == "\\begin_inset Box Boxed" and \
framecolor != defaultframecolor:
document.body[binset] = "\\begin_inset Box Frameless"
# output TeX code
# first output the closing brace # first output the closing brace
if framecolor == defaultframecolor and backcolor == defaultbackcolor: if framecolor != defaultframecolor or backcolor != defaultbackcolor:
# nothing needed
pass
else:
# we also neeed to load xcolor in the preamble but only once
add_to_preamble(document, ["\\@ifundefined{rangeHsb}{\\usepackage{xcolor}}{}"]) add_to_preamble(document, ["\\@ifundefined{rangeHsb}{\\usepackage{xcolor}}{}"])
document.body[einset + 2 : einset + 2] = put_cmd_in_ert("}") document.body[einset : einset] = put_cmd_in_ert("}")
if framecolor != defaultframecolor: # determine the box type
document.body[binset:binset] = put_cmd_in_ert("\\fcolorbox{" + framecolor + "}{" + backcolor + "}{") isBox = find_token(document.body, "\\begin_inset Box Boxed", binset)
else: # now output the box commands
document.body[binset:binset] = put_cmd_in_ert("\\colorbox{" + backcolor + "}{") if (framecolor != defaultframecolor and isBox == binset) or (backcolor != defaultbackcolor and isBox == binset):
document.body[i - 14 : i - 14] = put_cmd_in_ert("\\fcolorbox{" + framecolor + "}{" + backcolor + "}{")
binset = einset # in the case we must also change the box type because the ERT code adds a frame
document.body[i - 4] = "\\begin_inset Box Frameless"
# if has_inner_box 0 we must set it and use_makebox to 1
ibox = find_token(document.body, "has_inner_box", i - 4)
if ibox == -1 or ibox != i - 1:
document.warning("Malformed LyX document: Can't find has_inner_box statement!")
continue
# read out the value
innerbox = document.body[ibox][-1:];
if innerbox == "0":
document.body[ibox] = "has_inner_box 1"
document.body[ibox + 3] = "use_makebox 1"
if backcolor != defaultbackcolor and isBox != binset:
document.body[i - 14 : i - 14] = put_cmd_in_ert("\\colorbox{" + backcolor + "}{")
def revert_mathmulticol(document): def revert_mathmulticol(document):