mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-27 11:52:25 +00:00
lyx2lyx/lyx_2_2.py: rewrite the box reversion routines
- will fix several bugs with nested boxes
This commit is contained in:
parent
848c424588
commit
113c9a2f7f
@ -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):
|
||||||
|
Loading…
Reference in New Issue
Block a user