return find_end_of(lines, i, "\\begin_inset", "\\end_inset")
+# Note that text can be either a list of lines or a single line.
def add_to_preamble(document, text):
""" Add text to the preamble if it is not already there.
Only the first line is checked!"""
+ if not type(text) is list:
+ # split on \n just in case
+ # it'll give us the one element list we want
+ # if there's no \n, too
+ text = text.split('\n')
+
if find_token(document.preamble, text[0], 0) != -1:
return
del document.header[i]
+def revert_DIN_C_pagesizes(document):
+ i = 0
+ " Revert DIN C page sizes to default "
+ i = find_token(document.header, '\\papersize', 0)
+ if i != -1:
+ size = document.header[i][11:]
+ if size == "c0paper" or size == "c1paper" or size == "c2paper" \
+ or size == "c3paper" or size == "c4paper" or size == "c5paper" \
+ or size == "c6paper":
+ del document.header[i]
+
+
def convert_html_quotes(document):
" Remove quotes around html_latex_start and html_latex_end "
# only revert frameless boxes without an inner box
i = find_token(document.body, '\\begin_inset Box Frameless', i)
if i == -1:
+ # remove the option use_makebox
+ revert_use_makebox(document)
return
z = find_end_of_inset(document.body, i)
if z == -1:
return
j = find_token(document.body, 'use_makebox 1', i)
# assure we found the makebox of the current box
- if j > z or j == -1:
+ if j < z and j != -1:
+ y = find_token(document.body, "\\begin_layout", i)
+ if y > z or y == -1:
+ document.warning("Malformed LyX document: Can't find layout in box.")
+ return
+ # remove the \end_layout \end_inset pair
+ document.body[z - 2:z + 1] = put_cmd_in_ert("}")
+ # determine the alignment
+ k = find_token(document.body, 'hor_pos', j - 4)
+ align = document.body[k][9]
+ # determine the width
+ l = find_token(document.body, 'width "', j + 1)
+ length = document.body[l][7:]
+ # remove trailing '"'
+ length = length[:-1]
+ # latex_length returns "bool,length"
+ length = latex_length(length).split(",")[1]
+ subst = "\\makebox[" + length + "][" \
+ + align + "]{"
+ document.body[i:y + 1] = put_cmd_in_ert(subst)
+ i += 1
+
+
+def revert_use_makebox(document):
+ " Deletes use_makebox option of boxes "
+ h = 0
+ while 1:
+ # remove the option use_makebox
+ h = find_token(document.body, 'use_makebox', 0)
+ if h == -1:
+ return
+ del document.body[h]
+ h += 1
+
+
+def convert_use_makebox(document):
+ " Adds use_makebox option for boxes "
+ i = 0
+ while 1:
+ # remove the option use_makebox
+ i = find_token(document.body, '\\begin_inset Box', i)
+ if i == -1:
return
- y = find_token(document.body, "\\begin_layout", i)
- if y > z or y == -1:
- document.warning("Malformed LyX document: Can't find layout in box.")
+ k = find_token(document.body, 'use_parbox', i)
+ if k == -1:
+ document.warning("Malformed LyX document: Can't find use_parbox statement in box.")
return
- # remove the \end_layout \end_inset pair
- document.body[z - 2:z + 1] = put_cmd_in_ert("}")
- # determine the alignment
- k = find_token(document.body, 'hor_pos', j - 4)
- align = document.body[k][9]
- # determine the width
- l = find_token(document.body, 'width "', j + 1)
- length = document.body[l][7:]
- # remove trailing '"'
- length = length[:-1]
- # latex_length returns "bool,length"
- length = latex_length(length).split(",")[1]
- subst = "\\makebox[" + length + "][" \
- + align + "]{"
- document.body[i:y + 1] = put_cmd_in_ert(subst)
- i += 1
+ document.body.insert(k + 1, "use_makebox 0")
+ i = k + 1
def revert_IEEEtran(document):
" Convert IEEEtran layouts and styles to TeX code "
if document.textclass != "IEEEtran":
return
-
revert_flex_inset(document, "IEEE membership", "\\IEEEmembership", 0)
revert_flex_inset(document, "Lowercase", "\\MakeLowercase", 0)
-
layouts = ("Special Paper Notice", "After Title Text", "Publication ID",
"Page headings", "Biography without photo")
-
latexcmd = {"Special Paper Notice": "\\IEEEspecialpapernotice",
"After Title Text": "\\IEEEaftertitletext",
"Publication ID": "\\IEEEpubid"}
-
obsoletedby = {"Page headings": "MarkBoth",
"Biography without photo": "BiographyNoPhoto"}
-
for layout in layouts:
i = 0
while True:
del document.body[i:j + 1]
+def revert_nameref(document):
+ " Convert namerefs to regular references "
+ cmds = ["Nameref", "nameref"]
+ foundone = False
+ rx = re.compile(r'reference "(.*)"')
+ for cmd in cmds:
+ i = 0
+ oldcmd = "LatexCommand " + cmd
+ while 1:
+ # It seems better to look for this, as most of the reference
+ # insets won't be ones we care about.
+ i = find_token(document.body, oldcmd, i)
+ if i == -1:
+ break
+ cmdloc = i
+ i += 1
+ # Make sure it is actually in an inset!
+ # We could just check document.lines[i-1], but that relies
+ # upon something that might easily change.
+ # We'll look back a few lines.
+ stins = cmdloc - 10
+ if stins < 0:
+ stins = 0
+ stins = find_token(document.body, "\\begin_inset CommandInset ref", stins)
+ if stins == -1 or stins > cmdloc:
+ continue
+ endins = find_end_of_inset(document.body, stins)
+ if endins == -1:
+ document.warning("Can't find end of inset at line " + stins + "!!")
+ continue
+ if endins < cmdloc:
+ continue
+ refline = find_token(document.body, "reference", stins)
+ if refline == -1 or refline > endins:
+ document.warning("Can't find reference for inset at line " + stinst + "!!")
+ continue
+ m = rx.match(document.body[refline])
+ if not m:
+ document.warning("Can't match reference line: " + document.body[ref])
+ continue
+ foundone = True
+ ref = m.group(1)
+ newcontent = ['\\begin_inset ERT', 'status collapsed', '', \
+ '\\begin_layout Plain Layout', '', '\\backslash', \
+ cmd + '{' + ref + '}', '\\end_layout', '', '\\end_inset']
+ document.body[stins:endins + 1] = newcontent
+ if foundone:
+ add_to_preamble(document, "\usepackage{nameref}")
+
+
+def remove_Nameref(document):
+ " Convert Nameref commands to nameref commands "
+ i = 0
+ while 1:
+ # It seems better to look for this, as most of the reference
+ # insets won't be ones we care about.
+ i = find_token(document.body, "LatexCommand Nameref" , i)
+ if i == -1:
+ break
+ cmdloc = i
+ i += 1
+
+ # Make sure it is actually in an inset!
+ # We could just check document.lines[i-1], but that relies
+ # upon something that might easily change.
+ # We'll look back a few lines.
+ stins = cmdloc - 10
+ if stins < 0:
+ stins = 0
+ stins = find_token(document.body, "\\begin_inset CommandInset ref", stins)
+ if stins == -1 or stins > cmdloc:
+ continue
+ endins = find_end_of_inset(document.body, stins)
+ if endins == -1:
+ document.warning("Can't find end of inset at line " + stins + "!!")
+ continue
+ if endins < cmdloc:
+ continue
+ document.body[cmdloc] = "LatexCommand nameref"
+
+
+def revert_mathrsfs(document):
+ " Load mathrsfs if \mathrsfs us use in the document "
+ i = 0
+ end = len(document.body) - 1
+ while True:
+ j = document.body[i].find("\\mathscr{")
+ if j != -1:
+ add_to_preamble(document, ["% this command was inserted by lyx2lyx"])
+ add_to_preamble(document, ["\\usepackage{mathrsfs}"])
+ break
+ if i == end:
+ break
+ i += 1
+
+
##
# Conversion hub
#
[391, []],
[392, [convert_beamer_args]],
[393, [convert_optarg]],
- [394, []]
+ [394, [convert_use_makebox]],
+ [395, []],
+ [396, []],
+ [397, [remove_Nameref]],
+ [398, []]
]
-revert = [[393, [revert_makebox]],
+revert = [[397, [revert_mathrsfs]],
+ [396, []],
+ [395, [revert_nameref]],
+ [394, [revert_DIN_C_pagesizes]],
+ [393, [revert_makebox]],
[392, [revert_argument]],
[391, [revert_beamer_args]],
[390, [revert_align_decimal, revert_IEEEtran]],