# -*- coding: utf-8 -*-
# This file is part of lyx2lyx
-# -*- coding: utf-8 -*-
# Copyright (C) 2015 The LyX team
#
# This program is free software; you can redistribute it and/or
find_end_of_inset, find_end_of_layout, find_nonempty_line, \
get_containing_layout, get_value, check_token
-# Provide support for both python 2 and 3
-PY2 = sys.version_info[0] == 2
-# End of code to support for both python 2 and 3
-
####################################################################
# Private helper functions
if nolastopt == False:
document.body[endInset - 2 : endInset + 1] = put_cmd_in_ert("}{")
else:
- document.body[endInset - 2 : endInset + 1] = put_cmd_in_ert("}")
+ document.body[endInset - 2 : endInset + 1] = put_cmd_in_ert("}")
del(document.body[lineArg : beginPlain + 1])
wasOpt = False
else:
}
i = 0
- while 1:
+ while True:
i = find_token(document.body, "\\begin_deeper", i)
if i == -1:
break
i = i + 1
i = 0
- while 1:
+ while True:
i = find_token(document.body, "\\align", i)
if i == -1:
break
regexp = re.compile(r'^\\begin_layout (?:(-*)|(\s*))(Separator|EndOfSlide)(?:(-*)|(\s*))$', re.IGNORECASE)
i = 0
- while 1:
+ while True:
i = find_re(document.body, regexp, i)
if i == -1:
return
"", "\\end_inset", ""]
i = 0
- while 1:
+ while True:
i = find_token(document.body, "\\begin_inset Separator", i)
if i == -1:
return
"""
parbreakinset = "\\begin_inset Separator parbreak"
i = 0
- while 1:
+ while True:
i = find_token(document.body, parbreakinset, i)
if i == -1:
return
Revert latexpar separators to parbreak separators.
"""
i = 0
- while 1:
+ while True:
i = find_token(document.body, "\\begin_inset Separator latexpar", i)
if i == -1:
return
while i < len(document.body):
words = document.body[i].split()
if len(words) > 1 and words[0] == "\\begin_inset" and \
- words[1] in ["CommandInset", "ERT", "External", "Formula", "Graphics", "IPA", "listings"]:
+ words[1] in ["CommandInset", "ERT", "External", "Formula", "FormulaMacro", "Graphics", "IPA", "listings"]:
# must not replace anything in insets that store LaTeX contents in .lyx files
# (math and command insets withut overridden read() and write() methods
# filtering out IPA makes Text::readParToken() more simple
else:
i = j
continue
+ if len(words) > 0 and words[0] in ["\\leftindent", "\\paragraph_spacing", "\\align", "\\labelwidthstring"]:
+ # skip paragraph parameters (bug 10243)
+ i += 1
+ continue
while True:
j = document.body[i].find("--")
if j == -1:
def revert_dashes(document):
"convert \\twohyphens and \\threehyphens to -- and ---"
+ # eventually remove preamble code from 2.3->2.2 conversion:
+ for i, line in enumerate(document.preamble):
+ if i > 1 and line == r'\renewcommand{\textemdash}{---}':
+ if (document.preamble[i-1] == r'\renewcommand{\textendash}{--}'
+ and document.preamble[i-2] == '% Added by lyx2lyx'):
+ del document.preamble[i-2:i+1]
i = 0
while i < len(document.body):
words = document.body[i].split()
defaultThick = "0.4pt"
defaultShadow = "4pt"
while True:
- i = find_token(document.body, "height_special", i)
+ i = find_token(document.body, "thickness", i)
if i == -1:
return
+ binset = find_token(document.body, "\\begin_inset Box", i - 11)
+ if binset == -1 or binset != i - 11:
+ i = i + 1
+ continue # 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!")
+ i = i + 1
+ continue
# 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('"');
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('"');
end = document.body[i+2].rfind('"');
- separation = 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];
+ shadowsize = document.body[i+2][beg+1:end];
# delete the specification
- del document.body[i+1:i+4]
+ del document.body[i:i+3]
# output ERT
# first output the closing brace
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
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:
- document.body[i - 5 : i - 4] = ["{\\backslash fboxrule " + thickness]
+ document.body[pos + 5 : pos +6] = ["{\\backslash fboxrule " + thickness]
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:
- 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:
- 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:
- 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:
- 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:
- document.body[i - 5 : i - 4] = ["{\\backslash fboxrule " + thickness + "\\backslash fboxsep " + separation + "\\backslash shadowsize " + shadowsize]
- i = i + 11
+ document.body[pos + 5 : pos +6] = ["{\\backslash fboxrule " + thickness + "\\backslash fboxsep " + separation + "\\backslash shadowsize " + shadowsize]
def convert_origin(document):
if i == -1:
document.warning("Malformed LyX document: No \\textclass!!")
return
- if document.dir == "":
- origin = "stdin"
+ if document.dir == u'':
+ origin = u'stdin'
else:
- relpath = ''
- if document.systemlyxdir and document.systemlyxdir != '':
+ relpath = u''
+ if document.systemlyxdir and document.systemlyxdir != u'':
try:
if os.path.isabs(document.dir):
absdir = os.path.normpath(document.dir)
else:
abssys = os.path.normpath(os.path.abspath(document.systemlyxdir))
relpath = os.path.relpath(absdir, abssys)
- if relpath.find('..') == 0:
- relpath = ''
+ if relpath.find(u'..') == 0:
+ relpath = u''
except:
- relpath = ''
- if relpath == '':
- origin = document.dir.replace('\\', '/') + '/'
+ relpath = u''
+ if relpath == u'':
+ origin = document.dir.replace(u'\\', u'/') + u'/'
else:
- origin = os.path.join("/systemlyxdir", relpath).replace('\\', '/') + '/'
- if os.name != 'nt' and PY2:
- origin = unicode(origin, sys.getfilesystemencoding())
+ origin = os.path.join(u"/systemlyxdir", relpath).replace(u'\\', u'/') + u'/'
document.header[i:i] = ["\\origin " + origin]
j = find_token(document.body, "\\color", i + 1)
k = find_token(document.body, "\\end_layout", i + 1)
if j == -1 and k != -1:
- j = k +1
+ j = k +1
# output TeX code
# first output the closing brace
if k < j:
def revert_colorbox(document):
" outputs color settings for boxes as TeX code "
-
- binset = 0
+
+ i = 0
defaultframecolor = "black"
defaultbackcolor = "none"
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:
return
-
einset = find_end_of_inset(document.body, binset)
if einset == -1:
document.warning("Malformed LyX document: Can't find end of box inset!")
- binset += 1
- continue
-
- blay = find_token(document.body, "\\begin_layout", binset, einset)
- if blay == -1:
- document.warning("Malformed LyX document: Can't find start of layout!")
- binset = einset
- continue
-
- # doing it this way, we make sure only to find a framecolor option
- frame = find_token(document.body, "framecolor", binset, blay)
- if frame == -1:
- 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
+ # read out the values
+ beg = document.body[i].find('"');
+ end = document.body[i].rfind('"');
+ framecolor = document.body[i][beg+1:end];
+ beg = document.body[i + 1].find('"');
+ end = document.body[i + 1].rfind('"');
+ backcolor = document.body[i+1][beg+1:end];
+ # delete the specification
+ del document.body[i:i + 2]
+ # output ERT
# first output the closing brace
- if framecolor == defaultframecolor and backcolor == defaultbackcolor:
- # nothing needed
- pass
- else:
- # we also neeed to load xcolor in the preamble but only once
+ if framecolor != defaultframecolor or backcolor != defaultbackcolor:
add_to_preamble(document, ["\\@ifundefined{rangeHsb}{\\usepackage{xcolor}}{}"])
- document.body[einset + 1 : einset + 1] = put_cmd_in_ert("}")
- if framecolor != defaultframecolor:
- document.body[binset:binset] = put_cmd_in_ert("\\fcolorbox{" + framecolor + "}{" + backcolor + "}{")
- else:
- document.body[binset:binset] = put_cmd_in_ert("\\colorbox{" + backcolor + "}{")
-
- binset = einset
+ document.body[einset : einset] = put_cmd_in_ert("}")
+ # determine the box type
+ isBox = find_token(document.body, "\\begin_inset Box Boxed", binset)
+ # now output the box commands
+ 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 + "}{")
+ # 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):
i = find_token(document.header, "tcolorbox", i)
if i == -1:
break
- else:
+ else:
flex = 0
flexEnd = -1
flex = find_token(document.body, "\\begin_inset Flex Subtitle", flex)
i = find_token(document.header, "tcolorbox", i)
if i == -1:
break
- else:
+ else:
flex = 0
flexEnd = -1
flex = find_token(document.body, "\\begin_inset Flex Raster Color Box", flex)
i = find_token(document.header, "tcolorbox", i)
if i == -1:
break
- else:
+ else:
flex = 0
flexEnd = -1
flex = find_token(document.body, "\\begin_inset Flex Custom Color Box 1", flex)
i = find_token(document.header, "tcolorbox", i)
if i == -1:
break
- else:
+ else:
flex = 0
flexEnd = -1
flex = find_token(document.body, "\\begin_inset Flex Custom Color Box 2", flex)
i = find_token(document.header, "tcolorbox", i)
if i == -1:
break
- else:
+ else:
flex = 0
flexEnd = -1
flex = find_token(document.body, "\\begin_inset Flex Custom Color Box 3", flex)
i = find_token(document.header, "tcolorbox", i)
if i == -1:
break
- else:
+ else:
flex = 0
flexEnd = -1
flex = find_token(document.body, "\\begin_inset Flex Custom Color Box 4", flex)
i = find_token(document.header, "tcolorbox", i)
if i == -1:
break
- else:
+ else:
flex = 0
flexEnd = -1
flex = find_token(document.body, "\\begin_inset Flex Custom Color Box 5", flex)
def revert_moderncv_1(document):
" Reverts the new inset of moderncv to TeX-code in preamble "
-
+
if document.textclass != "moderncv":
return
i = 0
def revert_moderncv_2(document):
" Reverts the phone inset of moderncv to the obsoleted mobile or fax "
-
+
if document.textclass != "moderncv":
return
i = 0
def revert_achemso(document):
" Reverts the flex inset Latin to TeX code "
-
+
if document.textclass != "achemso":
return
i = 0