1 # This file is part of lyx2lyx
2 # -*- coding: utf-8 -*-
3 # Copyright (C) 2007-2008 The LyX Team <lyx-devel@lists.lyx.org>
5 # This program is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU General Public License
7 # as published by the Free Software Foundation; either version 2
8 # of the License, or (at your option) any later version.
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 """ Convert files to the file format generated by lyx 1.6"""
25 from parser_tools import find_token, find_end_of, find_tokens, get_value, get_value_string
27 ####################################################################
28 # Private helper functions
30 def find_end_of_inset(lines, i):
31 " Find end of inset, where lines[i] is included."
32 return find_end_of(lines, i, "\\begin_inset", "\\end_inset")
36 # document.body[i] = wrap_insert_ert(...)
37 # wrap_into_ert may returns a multiline string, which should NOT appear
38 # in document.body. Insetad, do something like this:
39 # subst = wrap_inset_ert(...)
40 # subst = subst.split('\n')
41 # document.body[i:i+1] = subst
43 # where the last statement resets the counter to accord with the added
45 def wrap_into_ert(string, src, dst):
46 " Wrap a something into an ERT"
47 return string.replace(src, '\n\\begin_inset ERT\nstatus collapsed\n\\begin_layout Standard\n'
48 + dst + '\n\\end_layout\n\\end_inset\n')
50 def add_to_preamble(document, text):
51 """ Add text to the preamble if it is not already there.
52 Only the first line is checked!"""
54 if find_token(document.preamble, text[0], 0) != -1:
57 document.preamble.extend(text)
59 # Convert a LyX length into a LaTeX length
61 units = {"text%":"\\backslash\ntextwidth", "col%":"\\backslash\ncolumnwidth",
62 "page%":"\\backslash\npagewidth", "line%":"\\backslash\nlinewidth",
63 "theight%":"\\backslash\ntextheight", "pheight%":"\\backslash\npageheight"}
65 # Convert LyX units to LaTeX units
66 for unit in units.keys():
67 if len.find(unit) != -1:
68 len = '%f' % (len2value(len) / 100)
69 len = len.strip('0') + units[unit]
74 # Return the value of len without the unit in numerical form.
76 result = re.search('([+-]?[0-9.]+)', len)
78 return float(result.group(1))
82 # Unfortunately, this doesn't really work, since Standard isn't always default.
83 # But it's as good as we can do right now.
84 def find_default_layout(document, start, end):
85 l = find_token(document.body, "\\begin_layout Standard", start, end)
87 l = find_token(document.body, "\\begin_layout PlainLayout", start, end)
89 l = find_token(document.body, "\\begin_layout Plain Layout", start, end)
92 def get_option(document, m, option, default):
93 l = document.body[m].find(option)
96 val = document.body[m][l:].split('"')[1]
99 def remove_option(document, m, option):
100 l = document.body[m].find(option)
102 val = document.body[m][l:].split('"')[1]
103 document.body[m] = document.body[m][:l-1] + document.body[m][l+len(option + '="' + val + '"'):]
106 def set_option(document, m, option, value):
107 l = document.body[m].find(option)
109 oldval = document.body[m][l:].split('"')[1]
110 l = l + len(option + '="')
111 document.body[m] = document.body[m][:l] + value + document.body[m][l+len(oldval):]
113 document.body[m] = document.body[m][:-1] + ' ' + option + '="' + value + '">'
117 ####################################################################
119 def convert_ltcaption(document):
122 i = find_token(document.body, "\\begin_inset Tabular", i)
125 j = find_end_of_inset(document.body, i + 1)
127 document.warning("Malformed LyX document: Could not find end of tabular.")
130 nrows = int(document.body[i+1].split('"')[3])
131 ncols = int(document.body[i+1].split('"')[5])
134 for k in range(nrows):
135 m = find_token(document.body, "<row", m)
138 for k in range(ncols):
139 m = find_token(document.body, "<cell", m)
141 mend = find_token(document.body, "</cell>", m + 1)
142 # first look for caption insets
143 mcap = find_token(document.body, "\\begin_inset Caption", m + 1, mend)
144 # then look for ERT captions
146 mcap = find_token(document.body, "caption", m + 1, mend)
148 mcap = find_token(document.body, "\\backslash", mcap - 1, mcap)
151 if caption == 'true':
153 set_option(document, r, 'caption', 'true')
154 set_option(document, m, 'multicolumn', '1')
155 set_option(document, m, 'bottomline', 'false')
156 set_option(document, m, 'topline', 'false')
157 set_option(document, m, 'rightline', 'false')
158 set_option(document, m, 'leftline', 'false')
159 #j = find_end_of_inset(document.body, j + 1)
161 set_option(document, m, 'multicolumn', '2')
168 #FIXME Use of wrap_into_ert can confuse lyx2lyx
169 def revert_ltcaption(document):
172 i = find_token(document.body, "\\begin_inset Tabular", i)
175 j = find_end_of_inset(document.body, i + 1)
177 document.warning("Malformed LyX document: Could not find end of tabular.")
181 nrows = int(document.body[i+1].split('"')[3])
182 ncols = int(document.body[i+1].split('"')[5])
184 for k in range(nrows):
185 m = find_token(document.body, "<row", m)
186 caption = get_option(document, m, 'caption', 'false')
187 if caption == 'true':
188 remove_option(document, m, 'caption')
189 for k in range(ncols):
190 m = find_token(document.body, "<cell", m)
191 remove_option(document, m, 'multicolumn')
193 m = find_token(document.body, "\\begin_inset Caption", m)
196 m = find_end_of_inset(document.body, m + 1)
197 document.body[m] += wrap_into_ert("","","\\backslash\n\\backslash\n%")
203 def convert_tablines(document):
206 i = find_token(document.body, "\\begin_inset Tabular", i)
208 # LyX 1.3 inserted an extra space between \begin_inset
209 # and Tabular so let us try if this is the case and fix it.
210 i = find_token(document.body, "\\begin_inset Tabular", i)
214 document.body[i] = "\\begin_inset Tabular"
215 j = find_end_of_inset(document.body, i + 1)
217 document.warning("Malformed LyX document: Could not find end of tabular.")
221 nrows = int(document.body[i+1].split('"')[3])
222 ncols = int(document.body[i+1].split('"')[5])
225 for k in range(ncols):
226 m = find_token(document.body, "<column", m)
227 left = get_option(document, m, 'leftline', 'false')
228 right = get_option(document, m, 'rightline', 'false')
229 col_info.append([left, right])
230 remove_option(document, m, 'leftline')
231 remove_option(document, m, 'rightline')
235 for k in range(nrows):
236 m = find_token(document.body, "<row", m)
237 top = get_option(document, m, 'topline', 'false')
238 bottom = get_option(document, m, 'bottomline', 'false')
239 row_info.append([top, bottom])
240 remove_option(document, m, 'topline')
241 remove_option(document, m, 'bottomline')
246 for k in range(nrows*ncols):
247 m = find_token(document.body, "<cell", m)
248 mc_info.append(get_option(document, m, 'multicolumn', '0'))
251 for l in range(nrows):
252 for k in range(ncols):
253 m = find_token(document.body, '<cell', m)
254 if mc_info[l*ncols + k] == '0':
255 r = set_option(document, m, 'topline', row_info[l][0])
256 r = set_option(document, m, 'bottomline', row_info[l][1])
257 r = set_option(document, m, 'leftline', col_info[k][0])
258 r = set_option(document, m, 'rightline', col_info[k][1])
259 elif mc_info[l*ncols + k] == '1':
261 while s < ncols and mc_info[l*ncols + s] == '2':
263 if s < ncols and mc_info[l*ncols + s] != '1':
264 r = set_option(document, m, 'rightline', col_info[k][1])
265 if k > 0 and mc_info[l*ncols + k - 1] == '0':
266 r = set_option(document, m, 'leftline', col_info[k][0])
271 def revert_tablines(document):
274 i = find_token(document.body, "\\begin_inset Tabular", i)
277 j = find_end_of_inset(document.body, i + 1)
279 document.warning("Malformed LyX document: Could not find end of tabular.")
283 nrows = int(document.body[i+1].split('"')[3])
284 ncols = int(document.body[i+1].split('"')[5])
287 for k in range(nrows*ncols):
288 m = find_token(document.body, "<cell", m)
289 top = get_option(document, m, 'topline', 'false')
290 bottom = get_option(document, m, 'bottomline', 'false')
291 left = get_option(document, m, 'leftline', 'false')
292 right = get_option(document, m, 'rightline', 'false')
293 lines.append([top, bottom, left, right])
296 # we will want to ignore longtable captions
299 for k in range(nrows):
300 m = find_token(document.body, "<row", m)
301 caption = get_option(document, m, 'caption', 'false')
302 caption_info.append([caption])
307 for k in range(ncols):
308 m = find_token(document.body, "<column", m)
310 for l in range(nrows):
311 left = lines[l*ncols + k][2]
312 if left == 'false' and caption_info[l] == 'false':
314 set_option(document, m, 'leftline', left)
316 for l in range(nrows):
317 right = lines[l*ncols + k][3]
318 if right == 'false' and caption_info[l] == 'false':
320 set_option(document, m, 'rightline', right)
324 for k in range(nrows):
325 m = find_token(document.body, "<row", m)
327 for l in range(ncols):
328 top = lines[k*ncols + l][0]
331 if caption_info[k] == 'false':
333 set_option(document, m, 'topline', top)
335 for l in range(ncols):
336 bottom = lines[k*ncols + l][1]
337 if bottom == 'false':
339 if caption_info[k] == 'false':
341 set_option(document, m, 'bottomline', bottom)
347 def fix_wrong_tables(document):
350 i = find_token(document.body, "\\begin_inset Tabular", i)
353 j = find_end_of_inset(document.body, i + 1)
355 document.warning("Malformed LyX document: Could not find end of tabular.")
359 nrows = int(document.body[i+1].split('"')[3])
360 ncols = int(document.body[i+1].split('"')[5])
362 for l in range(nrows):
364 for k in range(ncols):
365 m = find_token(document.body, '<cell', m)
367 if document.body[m].find('multicolumn') != -1:
368 multicol_cont = int(document.body[m].split('"')[1])
370 if multicol_cont == 2 and (k == 0 or prev_multicolumn == 0):
371 document.body[m] = document.body[m][:5] + document.body[m][21:]
374 prev_multicolumn = multicol_cont
381 def close_begin_deeper(document):
385 i = find_tokens(document.body, ["\\begin_deeper", "\\end_deeper"], i)
390 if document.body[i][:13] == "\\begin_deeper":
397 document.body[-2:-2] = ['\\end_deeper' for i in range(depth)]
400 def long_charstyle_names(document):
403 i = find_token(document.body, "\\begin_inset CharStyle", i)
406 document.body[i] = document.body[i].replace("CharStyle ", "CharStyle CharStyle:")
409 def revert_long_charstyle_names(document):
412 i = find_token(document.body, "\\begin_inset CharStyle", i)
415 document.body[i] = document.body[i].replace("CharStyle CharStyle:", "CharStyle")
419 def axe_show_label(document):
422 i = find_token(document.body, "\\begin_inset CharStyle", i)
425 if document.body[i + 1].find("show_label") != -1:
426 if document.body[i + 1].find("true") != -1:
427 document.body[i + 1] = "status open"
428 del document.body[ i + 2]
430 if document.body[i + 1].find("false") != -1:
431 document.body[i + 1] = "status collapsed"
432 del document.body[ i + 2]
434 document.warning("Malformed LyX document: show_label neither false nor true.")
436 document.warning("Malformed LyX document: show_label missing in CharStyle.")
441 def revert_show_label(document):
444 i = find_token(document.body, "\\begin_inset CharStyle", i)
447 if document.body[i + 1].find("status open") != -1:
448 document.body.insert(i + 1, "show_label true")
450 if document.body[i + 1].find("status collapsed") != -1:
451 document.body.insert(i + 1, "show_label false")
453 document.warning("Malformed LyX document: no legal status line in CharStyle.")
456 def revert_begin_modules(document):
459 i = find_token(document.header, "\\begin_modules", i)
462 j = find_end_of(document.header, i, "\\begin_modules", "\\end_modules")
464 # this should not happen
466 document.header[i : j + 1] = []
468 def convert_flex(document):
469 "Convert CharStyle to Flex"
472 i = find_token(document.body, "\\begin_inset CharStyle", i)
475 document.body[i] = document.body[i].replace('\\begin_inset CharStyle', '\\begin_inset Flex')
477 def revert_flex(document):
478 "Convert Flex to CharStyle"
481 i = find_token(document.body, "\\begin_inset Flex", i)
484 document.body[i] = document.body[i].replace('\\begin_inset Flex', '\\begin_inset CharStyle')
487 # Discard PDF options for hyperref
488 def revert_pdf_options(document):
489 "Revert PDF options for hyperref."
490 # store the PDF options and delete the entries from the Lyx file
498 bookmarksnumbered = ""
500 bookmarksopenlevel = ""
508 i = find_token(document.header, "\\use_hyperref", i)
510 hyperref = get_value(document.header, "\\use_hyperref", i) == 'true'
511 del document.header[i]
512 i = find_token(document.header, "\\pdf_store_options", i)
514 del document.header[i]
515 i = find_token(document.header, "\\pdf_title", 0)
517 title = get_value_string(document.header, '\\pdf_title', 0, 0, True)
518 title = ' pdftitle={' + title + '}'
519 del document.header[i]
520 i = find_token(document.header, "\\pdf_author", 0)
522 author = get_value_string(document.header, '\\pdf_author', 0, 0, True)
524 author = ' pdfauthor={' + author + '}'
526 author = ',\n pdfauthor={' + author + '}'
527 del document.header[i]
528 i = find_token(document.header, "\\pdf_subject", 0)
530 subject = get_value_string(document.header, '\\pdf_subject', 0, 0, True)
531 if title == "" and author == "":
532 subject = ' pdfsubject={' + subject + '}'
534 subject = ',\n pdfsubject={' + subject + '}'
535 del document.header[i]
536 i = find_token(document.header, "\\pdf_keywords", 0)
538 keywords = get_value_string(document.header, '\\pdf_keywords', 0, 0, True)
539 if title == "" and author == "" and subject == "":
540 keywords = ' pdfkeywords={' + keywords + '}'
542 keywords = ',\n pdfkeywords={' + keywords + '}'
543 del document.header[i]
544 i = find_token(document.header, "\\pdf_bookmarks", 0)
546 bookmarks = get_value_string(document.header, '\\pdf_bookmarks', 0)
547 bookmarks = ',\n bookmarks=' + bookmarks
548 del document.header[i]
549 i = find_token(document.header, "\\pdf_bookmarksnumbered", i)
551 bookmarksnumbered = get_value_string(document.header, '\\pdf_bookmarksnumbered', 0)
552 bookmarksnumbered = ',\n bookmarksnumbered=' + bookmarksnumbered
553 del document.header[i]
554 i = find_token(document.header, "\\pdf_bookmarksopen", i)
556 bookmarksopen = get_value_string(document.header, '\\pdf_bookmarksopen', 0)
557 bookmarksopen = ',\n bookmarksopen=' + bookmarksopen
558 del document.header[i]
559 i = find_token(document.header, "\\pdf_bookmarksopenlevel", i)
561 bookmarksopenlevel = get_value_string(document.header, '\\pdf_bookmarksopenlevel', 0, 0, True)
562 bookmarksopenlevel = ',\n bookmarksopenlevel=' + bookmarksopenlevel
563 del document.header[i]
564 i = find_token(document.header, "\\pdf_breaklinks", i)
566 breaklinks = get_value_string(document.header, '\\pdf_breaklinks', 0)
567 breaklinks = ',\n breaklinks=' + breaklinks
568 del document.header[i]
569 i = find_token(document.header, "\\pdf_pdfborder", i)
571 pdfborder = get_value_string(document.header, '\\pdf_pdfborder', 0)
572 if pdfborder == 'true':
573 pdfborder = ',\n pdfborder={0 0 0}'
575 pdfborder = ',\n pdfborder={0 0 1}'
576 del document.header[i]
577 i = find_token(document.header, "\\pdf_colorlinks", i)
579 colorlinks = get_value_string(document.header, '\\pdf_colorlinks', 0)
580 colorlinks = ',\n colorlinks=' + colorlinks
581 del document.header[i]
582 i = find_token(document.header, "\\pdf_backref", i)
584 backref = get_value_string(document.header, '\\pdf_backref', 0)
585 backref = ',\n backref=' + backref
586 del document.header[i]
587 i = find_token(document.header, "\\pdf_pagebackref", i)
589 pagebackref = get_value_string(document.header, '\\pdf_pagebackref', 0)
590 pagebackref = ',\n pagebackref=' + pagebackref
591 del document.header[i]
592 i = find_token(document.header, "\\pdf_pagemode", 0)
594 pagemode = get_value_string(document.header, '\\pdf_pagemode', 0)
595 pagemode = ',\n pdfpagemode=' + pagemode
596 del document.header[i]
597 i = find_token(document.header, "\\pdf_quoted_options", 0)
599 otheroptions = get_value_string(document.header, '\\pdf_quoted_options', 0, 0, True)
600 if title == "" and author == "" and subject == "" and keywords == "":
601 otheroptions = ' ' + otheroptions
603 otheroptions = ',\n ' + otheroptions
604 del document.header[i]
606 # write to the preamble when hyperref was used
608 # preamble write preparations
609 # bookmark numbers are only output when they are turned on
610 if bookmarksopen == ',\n bookmarksopen=true':
611 bookmarksopen = bookmarksopen + bookmarksopenlevel
612 if bookmarks == ',\n bookmarks=true':
613 bookmarks = bookmarks + bookmarksnumbered + bookmarksopen
615 bookmarks = bookmarks
616 # hypersetup is only output when there are things to be set up
617 setupstart = '\\hypersetup{%\n'
619 if otheroptions == "" and title == "" and author == ""\
620 and subject == "" and keywords == "":
624 add_to_preamble(document,
625 ['% Commands inserted by lyx2lyx for PDF properties',
626 '\\usepackage[unicode=true'
645 def remove_inzip_options(document):
646 "Remove inzipName and embed options from the Graphics inset"
649 i = find_token(document.body, "\\begin_inset Graphics", i)
652 j = find_end_of_inset(document.body, i + 1)
655 document.warning("Malformed LyX document: Could not find end of graphics inset.")
656 # If there's a inzip param, just remove that
657 k = find_token(document.body, "\tinzipName", i + 1, j)
660 # embed option must follow the inzipName option
661 del document.body[k+1]
665 def convert_inset_command(document):
668 \begin_inset LatexCommand cmd
670 \begin_inset CommandInset InsetType
675 i = find_token(document.body, "\\begin_inset LatexCommand", i)
678 line = document.body[i]
679 r = re.compile(r'\\begin_inset LatexCommand (.*)$')
683 #this is adapted from factory.cpp
684 if cmdName[0:4].lower() == "cite":
685 insetName = "citation"
686 elif cmdName == "url" or cmdName == "htmlurl":
688 elif cmdName[-3:] == "ref":
690 elif cmdName == "tableofcontents":
692 elif cmdName == "printnomenclature":
693 insetName = "nomencl_print"
694 elif cmdName == "printindex":
695 insetName = "index_print"
698 insertion = ["\\begin_inset CommandInset " + insetName, "LatexCommand " + cmdName]
699 document.body[i : i+1] = insertion
702 def revert_inset_command(document):
705 \begin_inset CommandInset InsetType
708 \begin_inset LatexCommand cmd
709 Some insets may end up being converted to insets earlier versions of LyX
710 will not be able to recognize. Not sure what to do about that.
714 i = find_token(document.body, "\\begin_inset CommandInset", i)
717 nextline = document.body[i+1]
718 r = re.compile(r'LatexCommand\s+(.*)$')
719 m = r.match(nextline)
721 document.warning("Malformed LyX document: Missing LatexCommand in " + document.body[i] + ".")
724 insertion = ["\\begin_inset LatexCommand " + cmdName]
725 document.body[i : i+2] = insertion
728 def convert_wrapfig_options(document):
729 "Convert optional options for wrap floats (wrapfig)."
730 # adds the tokens "lines", "placement", and "overhang"
733 i = find_token(document.body, "\\begin_inset Wrap figure", i)
736 document.body.insert(i + 1, "lines 0")
737 j = find_token(document.body, "placement", i)
738 # placement can be already set or not; if not, set it
740 document.body.insert(i + 3, "overhang 0col%")
742 document.body.insert(i + 2, "placement o")
743 document.body.insert(i + 3, "overhang 0col%")
747 def revert_wrapfig_options(document):
748 "Revert optional options for wrap floats (wrapfig)."
751 i = find_token(document.body, "\\begin_inset Wrap figure", i)
754 j = find_end_of_inset(document.body, i)
756 document.warning("Can't find end of Wrap inset at line " + str(i))
759 k = find_default_layout(document, i, j)
761 document.warning("Can't find default layout for Wrap figure!")
764 # Options should be between i and k now
765 l = find_token(document.body, "lines", i, k)
767 document.warning("Can't find lines option for Wrap figure!")
770 m = find_token(document.body, "overhang", i + 1, k)
772 document.warning("Malformed LyX document: Couldn't find overhang parameter of wrap float!")
775 # Do these in reverse order
781 # To convert and revert indices, we need to convert between LaTeX
782 # strings and LyXText. Here we do a minimal conversion to prevent
783 # crashes and data loss. Manual patch-up may be needed.
795 def convert_latexcommand_index(document):
796 "Convert from LatexCommand form to collapsable form."
799 i = find_token(document.body, "\\begin_inset CommandInset index", i)
802 if document.body[i + 1] != "LatexCommand index": # Might also be index_print
804 fullcontent = document.body[i + 2][5:]
806 fullcontent = fullcontent[1:-1]
807 document.body[i:i + 3] = ["\\begin_inset Index",
809 "\\begin_layout Standard"]
811 # We are now on the blank line preceding "\end_inset"
812 # We will write the content here, into the inset.
814 # Do the LaTeX --> LyX text conversion
815 for rep in replacements:
816 fullcontent = fullcontent.replace(rep[0], rep[1])
818 fullcontent = wrap_into_ert(fullcontent, r'\"', '"')
820 r = re.compile('^(.*?)(\$.*?\$)(.*)')
821 lines = fullcontent.split('\n')
823 #document.warning("LINE: " + line)
824 #document.warning(str(i) + ":" + document.body[i])
825 #document.warning("LAST: " + document.body[-1])
830 f = m.group(2).replace('\\\\', '\\')
834 s = wrap_into_ert(s, r'\\', '\\backslash')
835 s = wrap_into_ert(s, '{', '{')
836 s = wrap_into_ert(s, '}', '}')
837 subst = s.split('\n')
838 document.body[i:i] = subst
840 document.body.insert(i + 1, "\\begin_inset Formula " + f)
841 document.body.insert(i + 2, "\\end_inset")
843 # Generic, \\ -> \backslash:
844 g = wrap_into_ert(g, r'\\', '\\backslash')
845 g = wrap_into_ert(g, '{', '{')
846 g = wrap_into_ert(g, '}', '}')
847 subst = g.split('\n')
848 document.body[i+1:i+1] = subst
850 document.body.insert(i + 1, "\\end_layout")
853 def revert_latexcommand_index(document):
854 "Revert from collapsable form to LatexCommand form."
857 i = find_token(document.body, "\\begin_inset Index", i)
860 j = find_end_of_inset(document.body, i + 1)
863 del document.body[j - 1]
864 del document.body[j - 2] # \end_layout
865 document.body[i] = "\\begin_inset CommandInset index"
866 document.body[i + 1] = "LatexCommand index"
867 # clean up multiline stuff
870 for k in range(i + 3, j - 2):
871 line = document.body[k]
872 if line.startswith("\\begin_inset ERT"):
873 ert_end = find_end_of_inset(document.body, k + 1)
875 if line.startswith("\\begin_inset Formula"):
877 if line.startswith("\\begin_layout Standard"):
879 if line.startswith("\\begin_layout Plain Layout"):
881 if line.startswith("\\end_layout"):
883 if line.startswith("\\end_inset"):
885 if line.startswith("status collapsed"):
887 if line.startswith("status open"):
889 # a lossless reversion is not possible
890 # try at least to handle some common insets and settings
891 # do not replace inside ERTs
893 # Do the LyX text --> LaTeX conversion
894 for rep in replacements:
895 line = line.replace(rep[1], rep[0])
896 line = line.replace(r'\backslash', r'\textbackslash{}')
897 line = line.replace(r'\series bold', r'\bfseries{}').replace(r'\series default', r'\mdseries{}')
898 line = line.replace(r'\shape italic', r'\itshape{}').replace(r'\shape smallcaps', r'\scshape{}')
899 line = line.replace(r'\shape slanted', r'\slshape{}').replace(r'\shape default', r'\upshape{}')
900 line = line.replace(r'\emph on', r'\em{}').replace(r'\emph default', r'\em{}')
901 line = line.replace(r'\noun on', r'\scshape{}').replace(r'\noun default', r'\upshape{}')
902 line = line.replace(r'\bar under', r'\underbar{').replace(r'\bar default', r'}')
903 line = line.replace(r'\family sans', r'\sffamily{}').replace(r'\family default', r'\normalfont{}')
904 line = line.replace(r'\family typewriter', r'\ttfamily{}').replace(r'\family roman', r'\rmfamily{}')
905 line = line.replace(r'\InsetSpace ', r'').replace(r'\SpecialChar ', r'')
907 line = line.replace(r'\backslash', r'\\')
908 content = content + line;
909 document.body[i + 3] = "name " + '"' + content + '"'
910 for k in range(i + 4, j - 2):
911 del document.body[i + 4]
912 document.body.insert(i + 4, "")
913 del document.body[i + 2] # \begin_layout standard
917 def revert_wraptable(document):
918 "Revert wrap table to wrap figure."
921 i = find_token(document.body, "\\begin_inset Wrap table", i)
924 document.body[i] = document.body[i].replace('\\begin_inset Wrap table', '\\begin_inset Wrap figure')
928 def revert_vietnamese(document):
929 "Set language Vietnamese to English"
930 # Set document language from Vietnamese to English
932 if document.language == "vietnamese":
933 document.language = "english"
934 i = find_token(document.header, "\\language", 0)
936 document.header[i] = "\\language english"
939 j = find_token(document.body, "\\lang vietnamese", j)
942 document.body[j] = document.body[j].replace("\\lang vietnamese", "\\lang english")
946 def revert_japanese(document):
947 "Set language japanese-plain to japanese"
948 # Set document language from japanese-plain to japanese
950 if document.language == "japanese-plain":
951 document.language = "japanese"
952 i = find_token(document.header, "\\language", 0)
954 document.header[i] = "\\language japanese"
957 j = find_token(document.body, "\\lang japanese-plain", j)
960 document.body[j] = document.body[j].replace("\\lang japanese-plain", "\\lang japanese")
964 def revert_japanese_encoding(document):
965 "Set input encoding form EUC-JP-plain to EUC-JP etc."
966 # Set input encoding form EUC-JP-plain to EUC-JP etc.
968 i = find_token(document.header, "\\inputencoding EUC-JP-plain", 0)
970 document.header[i] = "\\inputencoding EUC-JP"
972 j = find_token(document.header, "\\inputencoding JIS-plain", 0)
974 document.header[j] = "\\inputencoding JIS"
976 k = find_token(document.header, "\\inputencoding SJIS-plain", 0)
977 if k != -1: # convert to UTF8 since there is currently no SJIS encoding
978 document.header[k] = "\\inputencoding UTF8"
981 def revert_inset_info(document):
982 'Replace info inset with its content'
985 i = find_token(document.body, '\\begin_inset Info', i)
988 j = find_end_of_inset(document.body, i + 1)
991 document.warning("Malformed LyX document: Could not find end of Info inset.")
994 for k in range(i, j+1):
995 if document.body[k].startswith("arg"):
996 arg = document.body[k][3:].strip().strip('"')
997 if document.body[k].startswith("type"):
998 type = document.body[k][4:].strip().strip('"')
999 # I think there is a newline after \\end_inset, which should be removed.
1000 if document.body[j + 1].strip() == "":
1001 document.body[i : (j + 2)] = [type + ':' + arg]
1003 document.body[i : (j + 1)] = [type + ':' + arg]
1006 def convert_pdf_options(document):
1007 # Set the pdfusetitle tag, delete the pdf_store_options,
1008 # set quotes for bookmarksopenlevel"
1009 has_hr = get_value(document.header, "\\use_hyperref", 0, default = "0")
1011 k = find_token(document.header, "\\use_hyperref", 0)
1012 document.header.insert(k + 1, "\\pdf_pdfusetitle true")
1013 k = find_token(document.header, "\\pdf_store_options", 0)
1015 del document.header[k]
1016 i = find_token(document.header, "\\pdf_bookmarksopenlevel", k)
1018 document.header[i] = document.header[i].replace('"', '')
1021 def revert_pdf_options_2(document):
1022 # reset the pdfusetitle tag, set quotes for bookmarksopenlevel"
1023 k = find_token(document.header, "\\use_hyperref", 0)
1024 i = find_token(document.header, "\\pdf_pdfusetitle", k)
1026 del document.header[i]
1027 i = find_token(document.header, "\\pdf_bookmarksopenlevel", k)
1029 values = document.header[i].split()
1030 values[1] = ' "' + values[1] + '"'
1031 document.header[i] = ''.join(values)
1034 def convert_htmlurl(document):
1035 'Convert "htmlurl" to "href" insets for docbook'
1036 if document.backend != "docbook":
1040 i = find_token(document.body, "\\begin_inset CommandInset url", i)
1043 document.body[i] = "\\begin_inset CommandInset href"
1044 document.body[i + 1] = "LatexCommand href"
1048 def convert_url(document):
1049 'Convert url insets to url charstyles'
1050 if document.backend == "docbook":
1054 i = find_token(document.body, "\\begin_inset CommandInset url", i)
1057 n = find_token(document.body, "name", i)
1059 # place the URL name in typewriter before the new URL insert
1060 # grab the name 'bla' from the e.g. the line 'name "bla"',
1061 # therefore start with the 6th character
1062 name = document.body[n][6:-1]
1063 newname = [name + " "]
1064 document.body[i:i] = newname
1066 j = find_token(document.body, "target", i)
1068 document.warning("Malformed LyX document: Can't find target for url inset")
1071 target = document.body[j][8:-1]
1072 k = find_token(document.body, "\\end_inset", j)
1074 document.warning("Malformed LyX document: Can't find end of url inset")
1077 newstuff = ["\\begin_inset Flex URL",
1078 "status collapsed", "",
1079 "\\begin_layout Standard",
1084 document.body[i:k] = newstuff
1087 def convert_ams_classes(document):
1088 tc = document.textclass
1089 if (tc != "amsart" and tc != "amsart-plain" and
1090 tc != "amsart-seq" and tc != "amsbook"):
1092 if tc == "amsart-plain":
1093 document.textclass = "amsart"
1094 document.set_textclass()
1095 document.add_module("Theorems (Starred)")
1097 if tc == "amsart-seq":
1098 document.textclass = "amsart"
1099 document.set_textclass()
1100 document.add_module("Theorems (AMS)")
1102 #Now we want to see if any of the environments in the extended theorems
1103 #module were used in this document. If so, we'll add that module, too.
1104 layouts = ["Criterion", "Algorithm", "Axiom", "Condition", "Note", \
1105 "Notation", "Summary", "Acknowledgement", "Conclusion", "Fact", \
1108 r = re.compile(r'^\\begin_layout (.*?)\*?\s*$')
1111 i = find_token(document.body, "\\begin_layout", i)
1114 m = r.match(document.body[i])
1116 document.warning("Weirdly formed \\begin_layout at line %d of body!" % i)
1120 if layouts.count(m) != 0:
1121 document.add_module("Theorems (AMS-Extended)")
1125 def revert_href(document):
1126 'Reverts hyperlink insets (href) to url insets (url)'
1129 i = find_token(document.body, "\\begin_inset CommandInset href", i)
1132 document.body[i : i + 2] = \
1133 ["\\begin_inset CommandInset url", "LatexCommand url"]
1136 def revert_url(document):
1137 'Reverts Flex URL insets to old-style URL insets'
1140 i = find_token(document.body, "\\begin_inset Flex URL", i)
1143 j = find_end_of_inset(document.body, i)
1145 document.warning("Can't find end of inset in revert_url!")
1147 k = find_default_layout(document, i, j)
1149 document.warning("Can't find default layout in revert_url!")
1152 l = find_end_of(document.body, k, "\\begin_layout", "\\end_layout")
1153 if l == -1 or l >= j:
1154 document.warning("Can't find end of default layout in revert_url!")
1157 # OK, so the inset's data is between lines k and l.
1158 data = " ".join(document.body[k+1:l])
1160 newinset = ["\\begin_inset LatexCommand url", "target \"" + data + "\"",\
1162 document.body[i:j+1] = newinset
1163 i = i + len(newinset)
1166 def convert_include(document):
1167 'Converts include insets to new format.'
1169 r = re.compile(r'\\begin_inset Include\s+\\([^{]+){([^}]*)}(?:\[(.*)\])?')
1171 i = find_token(document.body, "\\begin_inset Include", i)
1174 line = document.body[i]
1175 previewline = document.body[i + 1]
1178 document.warning("Unable to match line " + str(i) + " of body!")
1184 insertion = ["\\begin_inset CommandInset include",
1185 "LatexCommand " + cmd, previewline,
1186 "filename \"" + fn + "\""]
1189 insertion.append("lstparams " + '"' + opt + '"')
1191 document.body[i : i + 2] = insertion
1195 def revert_include(document):
1196 'Reverts include insets to old format.'
1198 r0 = re.compile('preview.*')
1199 r1 = re.compile('LatexCommand (.+)')
1200 r2 = re.compile('filename (.+)')
1201 r3 = re.compile('lstparams "(.*)"')
1203 i = find_token(document.body, "\\begin_inset CommandInset include", i)
1207 if r0.match(document.body[nextline]):
1208 previewline = document.body[nextline]
1212 m = r1.match(document.body[nextline])
1214 document.warning("Malformed LyX document: No LatexCommand line for `" +
1215 document.body[i] + "' on line " + str(i) + ".")
1220 m = r2.match(document.body[nextline])
1222 document.warning("Malformed LyX document: No filename line for `" + \
1223 document.body[i] + "' on line " + str(i) + ".")
1229 if (cmd == "lstinputlisting"):
1230 m = r3.match(document.body[nextline])
1232 options = m.group(1)
1235 newline = "\\begin_inset Include \\" + cmd + "{" + fn + "}"
1237 newline += ("[" + options + "]")
1238 insertion = [newline]
1239 if previewline != "":
1240 insertion.append(previewline)
1241 document.body[i : nextline] = insertion
1245 def revert_albanian(document):
1246 "Set language Albanian to English"
1248 if document.language == "albanian":
1249 document.language = "english"
1250 i = find_token(document.header, "\\language", 0)
1252 document.header[i] = "\\language english"
1255 j = find_token(document.body, "\\lang albanian", j)
1258 document.body[j] = document.body[j].replace("\\lang albanian", "\\lang english")
1262 def revert_lowersorbian(document):
1263 "Set language lower Sorbian to English"
1265 if document.language == "lowersorbian":
1266 document.language = "english"
1267 i = find_token(document.header, "\\language", 0)
1269 document.header[i] = "\\language english"
1272 j = find_token(document.body, "\\lang lowersorbian", j)
1275 document.body[j] = document.body[j].replace("\\lang lowersorbian", "\\lang english")
1279 def revert_uppersorbian(document):
1280 "Set language uppersorbian to usorbian as this was used in LyX 1.5"
1282 if document.language == "uppersorbian":
1283 document.language = "usorbian"
1284 i = find_token(document.header, "\\language", 0)
1286 document.header[i] = "\\language usorbian"
1289 j = find_token(document.body, "\\lang uppersorbian", j)
1292 document.body[j] = document.body[j].replace("\\lang uppersorbian", "\\lang usorbian")
1296 def convert_usorbian(document):
1297 "Set language usorbian to uppersorbian"
1299 if document.language == "usorbian":
1300 document.language = "uppersorbian"
1301 i = find_token(document.header, "\\language", 0)
1303 document.header[i] = "\\language uppersorbian"
1306 j = find_token(document.body, "\\lang usorbian", j)
1309 document.body[j] = document.body[j].replace("\\lang usorbian", "\\lang uppersorbian")
1313 def revert_macro_optional_params(document):
1314 "Convert macro definitions with optional parameters into ERTs"
1315 # Stub to convert macro definitions with one or more optional parameters
1316 # into uninterpreted ERT insets
1319 def revert_hyperlinktype(document):
1320 'Reverts hyperlink type'
1324 i = find_token(document.body, "target", i)
1327 j = find_token(document.body, "type", i)
1331 del document.body[j]
1335 def revert_pagebreak(document):
1336 'Reverts pagebreak to ERT'
1339 i = find_token(document.body, "\\pagebreak", i)
1342 document.body[i] = '\\begin_inset ERT\nstatus collapsed\n\n' \
1343 '\\begin_layout Standard\n\n\n\\backslash\n' \
1344 'pagebreak{}\n\\end_layout\n\n\\end_inset\n\n'
1348 def revert_linebreak(document):
1349 'Reverts linebreak to ERT'
1352 i = find_token(document.body, "\\linebreak", i)
1355 document.body[i] = '\\begin_inset ERT\nstatus collapsed\n\n' \
1356 '\\begin_layout Standard\n\n\n\\backslash\n' \
1357 'linebreak{}\n\\end_layout\n\n\\end_inset\n\n'
1361 def revert_latin(document):
1362 "Set language Latin to English"
1364 if document.language == "latin":
1365 document.language = "english"
1366 i = find_token(document.header, "\\language", 0)
1368 document.header[i] = "\\language english"
1371 j = find_token(document.body, "\\lang latin", j)
1374 document.body[j] = document.body[j].replace("\\lang latin", "\\lang english")
1378 def revert_samin(document):
1379 "Set language North Sami to English"
1381 if document.language == "samin":
1382 document.language = "english"
1383 i = find_token(document.header, "\\language", 0)
1385 document.header[i] = "\\language english"
1388 j = find_token(document.body, "\\lang samin", j)
1391 document.body[j] = document.body[j].replace("\\lang samin", "\\lang english")
1395 def convert_serbocroatian(document):
1396 "Set language Serbocroatian to Croatian as this was really Croatian in LyX 1.5"
1398 if document.language == "serbocroatian":
1399 document.language = "croatian"
1400 i = find_token(document.header, "\\language", 0)
1402 document.header[i] = "\\language croatian"
1405 j = find_token(document.body, "\\lang serbocroatian", j)
1408 document.body[j] = document.body[j].replace("\\lang serbocroatian", "\\lang croatian")
1412 def convert_framed_notes(document):
1413 "Convert framed notes to boxes. "
1416 i = find_tokens(document.body, ["\\begin_inset Note Framed", "\\begin_inset Note Shaded"], i)
1419 subst = [document.body[i].replace("\\begin_inset Note", "\\begin_inset Box"),
1428 'height_special "totalheight"']
1429 document.body[i:i+1] = subst
1433 def convert_module_names(document):
1434 modulemap = { 'Braille' : 'braille', 'Endnote' : 'endnotes', 'Foot to End' : 'foottoend',\
1435 'Hanging' : 'hanging', 'Linguistics' : 'linguistics', 'Logical Markup' : 'logicalmkup', \
1436 'Theorems (AMS-Extended)' : 'theorems-ams-extended', 'Theorems (AMS)' : 'theorems-ams', \
1437 'Theorems (Order By Chapter)' : 'theorems-chap', 'Theorems (Order By Section)' : 'theorems-sec', \
1438 'Theorems (Starred)' : 'theorems-starred', 'Theorems' : 'theorems-std' }
1439 modlist = document.get_module_list()
1440 if len(modlist) == 0:
1444 if modulemap.has_key(mod):
1445 newmodlist.append(modulemap[mod])
1447 document.warning("Can't find module %s in the module map!" % mod)
1448 newmodlist.append(mod)
1449 document.set_module_list(newmodlist)
1452 def revert_module_names(document):
1453 modulemap = { 'braille' : 'Braille', 'endnotes' : 'Endnote', 'foottoend' : 'Foot to End',\
1454 'hanging' : 'Hanging', 'linguistics' : 'Linguistics', 'logicalmkup' : 'Logical Markup', \
1455 'theorems-ams-extended' : 'Theorems (AMS-Extended)', 'theorems-ams' : 'Theorems (AMS)', \
1456 'theorems-chap' : 'Theorems (Order By Chapter)', 'theorems-sec' : 'Theorems (Order By Section)', \
1457 'theorems-starred' : 'Theorems (Starred)', 'theorems-std' : 'Theorems'}
1458 modlist = document.get_module_list()
1459 if len(modlist) == 0:
1463 if modulemap.has_key(mod):
1464 newmodlist.append(modulemap[mod])
1466 document.warning("Can't find module %s in the module map!" % mod)
1467 newmodlist.append(mod)
1468 document.set_module_list(newmodlist)
1471 def revert_colsep(document):
1472 i = find_token(document.header, "\\columnsep", 0)
1475 colsepline = document.header[i]
1476 r = re.compile(r'\\columnsep (.*)')
1477 m = r.match(colsepline)
1479 document.warning("Malformed column separation line!")
1482 del document.header[i]
1483 #it seems to be safe to add the package even if it is already used
1484 pretext = ["\\usepackage{geometry}", "\\geometry{columnsep=" + colsep + "}"]
1486 add_to_preamble(document, pretext)
1489 def revert_framed_notes(document):
1490 "Revert framed boxes to notes. "
1493 i = find_tokens(document.body, ["\\begin_inset Box Framed", "\\begin_inset Box Shaded"], i)
1497 j = find_end_of_inset(document.body, i + 1)
1500 document.warning("Malformed LyX document: Could not find end of Box inset.")
1501 k = find_token(document.body, "status", i + 1, j)
1503 document.warning("Malformed LyX document: Missing `status' tag in Box inset.")
1505 status = document.body[k]
1506 l = find_default_layout(document, i + 1, j)
1508 document.warning("Malformed LyX document: Missing `\\begin_layout' in Box inset.")
1510 m = find_token(document.body, "\\end_layout", i + 1, j)
1512 document.warning("Malformed LyX document: Missing `\\end_layout' in Box inset.")
1514 ibox = find_token(document.body, "has_inner_box 1", i + 1, k)
1515 pbox = find_token(document.body, "use_parbox 1", i + 1, k)
1516 if ibox == -1 and pbox == -1:
1517 document.body[i] = document.body[i].replace("\\begin_inset Box", "\\begin_inset Note")
1518 del document.body[i+1:k]
1520 document.body[i] = document.body[i].replace("\\begin_inset Box Shaded", "\\begin_inset Box Frameless")
1521 subst1 = [document.body[l],
1522 "\\begin_inset Note Shaded",
1524 '\\begin_layout Standard']
1525 document.body[l:l + 1] = subst1
1526 subst2 = [document.body[m], "\\end_layout", "\\end_inset"]
1527 document.body[m:m + 1] = subst2
1531 def revert_slash(document):
1532 'Revert \\SpecialChar \\slash{} to ERT'
1533 r = re.compile(r'\\SpecialChar \\slash{}')
1535 while i < len(document.body):
1536 m = r.match(document.body[i])
1538 subst = ['\\begin_inset ERT',
1539 'status collapsed', '',
1540 '\\begin_layout Standard',
1541 '', '', '\\backslash',
1545 document.body[i: i+1] = subst
1551 def revert_nobreakdash(document):
1552 'Revert \\SpecialChar \\nobreakdash- to ERT'
1554 while i < len(document.body):
1555 line = document.body[i]
1556 r = re.compile(r'\\SpecialChar \\nobreakdash-')
1559 subst = ['\\begin_inset ERT',
1560 'status collapsed', '',
1561 '\\begin_layout Standard', '', '',
1566 document.body[i:i+1] = subst
1568 j = find_token(document.header, "\\use_amsmath", 0)
1570 document.warning("Malformed LyX document: Missing '\\use_amsmath'.")
1572 document.header[j] = "\\use_amsmath 2"
1577 #Returns number of lines added/removed
1578 def revert_nocite_key(body, start, end):
1579 'key "..." -> \nocite{...}'
1580 r = re.compile(r'^key "(.*)"')
1584 m = r.match(body[i])
1586 body[i:i+1] = ["\\backslash", "nocite{" + m.group(1) + "}"]
1587 j += 1 # because we added a line
1588 i += 2 # skip that line
1591 j -= 1 # because we deleted a line
1592 # no need to change i, since it now points to the next line
1596 def revert_nocite(document):
1597 "Revert LatexCommand nocite to ERT"
1600 i = find_token(document.body, "\\begin_inset CommandInset citation", i)
1603 if (document.body[i+1] != "LatexCommand nocite"):
1604 # note that we already incremented i
1607 insetEnd = find_end_of_inset(document.body, i)
1609 #this should not happen
1610 document.warning("End of CommandInset citation not found in revert_nocite!")
1613 paramLocation = i + 2 #start of the inset's parameters
1615 document.body[i:i+2] = \
1616 ["\\begin_inset ERT", "status collapsed", "", "\\begin_layout Standard"]
1617 # that added two lines
1620 #print insetEnd, document.body[i: insetEnd + 1]
1621 insetEnd += revert_nocite_key(document.body, paramLocation, insetEnd)
1622 #print insetEnd, document.body[i: insetEnd + 1]
1623 document.body.insert(insetEnd, "\\end_layout")
1624 document.body.insert(insetEnd + 1, "")
1628 def revert_btprintall(document):
1629 "Revert (non-bibtopic) btPrintAll option to ERT \nocite{*}"
1630 i = find_token(document.header, '\\use_bibtopic', 0)
1632 document.warning("Malformed lyx document: Missing '\\use_bibtopic'.")
1634 if get_value(document.header, '\\use_bibtopic', 0) == "false":
1636 while i < len(document.body):
1637 i = find_token(document.body, "\\begin_inset CommandInset bibtex", i)
1640 j = find_end_of_inset(document.body, i + 1)
1642 #this should not happen
1643 document.warning("End of CommandInset bibtex not found in revert_btprintall!")
1644 j = len(document.body)
1645 # this range isn't really right, but it should be OK, since we shouldn't
1646 # see more than one matching line in each inset
1648 for k in range(i, j):
1649 if (document.body[k] == 'btprint "btPrintAll"'):
1650 del document.body[k]
1651 subst = ["\\begin_inset ERT",
1652 "status collapsed", "",
1653 "\\begin_layout Standard", "",
1658 document.body[i:i] = subst
1659 addlines = addedlines + len(subst) - 1
1663 def revert_bahasam(document):
1664 "Set language Bahasa Malaysia to Bahasa Indonesia"
1666 if document.language == "bahasam":
1667 document.language = "bahasa"
1668 i = find_token(document.header, "\\language", 0)
1670 document.header[i] = "\\language bahasa"
1673 j = find_token(document.body, "\\lang bahasam", j)
1676 document.body[j] = document.body[j].replace("\\lang bahasam", "\\lang bahasa")
1680 def revert_interlingua(document):
1681 "Set language Interlingua to English"
1683 if document.language == "interlingua":
1684 document.language = "english"
1685 i = find_token(document.header, "\\language", 0)
1687 document.header[i] = "\\language english"
1690 j = find_token(document.body, "\\lang interlingua", j)
1693 document.body[j] = document.body[j].replace("\\lang interlingua", "\\lang english")
1697 def revert_serbianlatin(document):
1698 "Set language Serbian-Latin to Croatian"
1700 if document.language == "serbian-latin":
1701 document.language = "croatian"
1702 i = find_token(document.header, "\\language", 0)
1704 document.header[i] = "\\language croatian"
1707 j = find_token(document.body, "\\lang serbian-latin", j)
1710 document.body[j] = document.body[j].replace("\\lang serbian-latin", "\\lang croatian")
1714 def revert_rotfloat(document):
1715 " Revert sideways custom floats. "
1718 # whitespace intended (exclude \\begin_inset FloatList)
1719 i = find_token(document.body, "\\begin_inset Float ", i)
1722 line = document.body[i]
1723 r = re.compile(r'\\begin_inset Float (.*)$')
1726 document.warning("Unable to match line " + str(i) + " of body!")
1729 floattype = m.group(1)
1730 if floattype == "figure" or floattype == "table":
1733 j = find_end_of_inset(document.body, i)
1735 document.warning("Malformed lyx document: Missing '\\end_inset' in revert_rotfloat.")
1739 if get_value(document.body, 'sideways', i, j) == "false":
1742 l = find_default_layout(document, i + 1, j)
1744 document.warning("Malformed LyX document: Missing `\\begin_layout' in Float inset.")
1746 subst = ['\\begin_layout Standard',
1747 '\\begin_inset ERT',
1748 'status collapsed', '',
1749 '\\begin_layout Standard', '', '',
1751 'end{sideways' + floattype + '}',
1752 '\\end_layout', '', '\\end_inset']
1753 document.body[j : j+1] = subst
1754 addedLines = len(subst) - 1
1755 del document.body[i+1 : l]
1756 addedLines -= (l-1) - (i+1)
1757 subst = ['\\begin_inset ERT', 'status collapsed', '',
1758 '\\begin_layout Standard', '', '', '\\backslash',
1759 'begin{sideways' + floattype + '}',
1760 '\\end_layout', '', '\\end_inset', '',
1762 document.body[i : i+1] = subst
1763 addedLines += len(subst) - 1
1764 if floattype == "algorithm":
1765 add_to_preamble(document,
1766 ['% Commands inserted by lyx2lyx for sideways algorithm float',
1767 '\\usepackage{rotfloat}',
1768 '\\floatstyle{ruled}',
1769 '\\newfloat{algorithm}{tbp}{loa}',
1770 '\\floatname{algorithm}{Algorithm}'])
1772 document.warning("Cannot create preamble definition for custom float" + floattype + ".")
1776 def revert_widesideways(document):
1777 " Revert wide sideways floats. "
1780 # whitespace intended (exclude \\begin_inset FloatList)
1781 i = find_token(document.body, '\\begin_inset Float ', i)
1784 line = document.body[i]
1785 r = re.compile(r'\\begin_inset Float (.*)$')
1788 document.warning("Unable to match line " + str(i) + " of body!")
1791 floattype = m.group(1)
1792 if floattype != "figure" and floattype != "table":
1795 j = find_end_of_inset(document.body, i)
1797 document.warning("Malformed lyx document: Missing '\\end_inset' in revert_widesideways.")
1800 if get_value(document.body, 'sideways', i, j) == "false" or \
1801 get_value(document.body, 'wide', i, j) == "false":
1804 l = find_default_layout(document, i + 1, j)
1806 document.warning("Malformed LyX document: Missing `\\begin_layout' in Float inset.")
1808 subst = ['\\begin_layout Standard', '\\begin_inset ERT',
1809 'status collapsed', '',
1810 '\\begin_layout Standard', '', '', '\\backslash',
1811 'end{sideways' + floattype + '*}',
1812 '\\end_layout', '', '\\end_inset']
1813 document.body[j : j+1] = subst
1814 addedLines = len(subst) - 1
1815 del document.body[i+1:l-1]
1816 addedLines -= (l-1) - (i+1)
1817 subst = ['\\begin_inset ERT', 'status collapsed', '',
1818 '\\begin_layout Standard', '', '', '\\backslash',
1819 'begin{sideways' + floattype + '*}', '\\end_layout', '',
1820 '\\end_inset', '', '\\end_layout', '']
1821 document.body[i : i+1] = subst
1822 addedLines += len(subst) - 1
1823 add_to_preamble(document, ['\\usepackage{rotfloat}\n'])
1827 def revert_inset_embedding(document, type):
1828 ' Remove embed tag from certain type of insets'
1831 i = find_token(document.body, "\\begin_inset %s" % type, i)
1834 j = find_end_of_inset(document.body, i)
1836 document.warning("Malformed lyx document: Missing '\\end_inset' in revert_inset_embedding.")
1839 k = find_token(document.body, "\tembed", i, j)
1841 k = find_token(document.body, "embed", i, j)
1843 del document.body[k]
1847 def revert_external_embedding(document):
1848 ' Remove embed tag from external inset '
1849 revert_inset_embedding(document, 'External')
1852 # FIXME This code can still be cleaned up a fair bit.
1853 def convert_subfig(document):
1854 " Convert subfigures to subfloats. "
1857 i = find_token(document.body, '\\begin_inset Graphics', i)
1860 endInset = find_end_of_inset(document.body, i)
1862 document.warning("Malformed lyx document: Missing '\\end_inset' in convert_subfig.")
1865 k = find_token(document.body, '\tsubcaption', i, endInset)
1869 l = find_token(document.body, '\tsubcaptionText', i, endInset)
1870 caption = document.body[l][16:].strip('"')
1871 savestr = document.body[i]
1872 laststr = document.body[endInset]
1873 del document.body[l]
1874 del document.body[k]
1876 # savestr should no longer be needed here.
1877 subst = ['\\begin_inset Float figure', 'wide false', 'sideways false',
1878 'status open', '', '\\begin_layout Plain Layout', '\\begin_inset Caption',
1879 '', '\\begin_layout Plain Layout',
1880 caption, '\\end_layout', '', '\\end_inset', '',
1881 '\\end_layout', '', '\\begin_layout Plain Layout', savestr]
1882 document.body[i : i+1] = subst
1883 addedLines += len(subst) - 1
1884 endInset += addedLines
1885 # There should be an easier way to do this.
1886 subst = ['', '\\end_inset', '', '\\end_layout', laststr]
1887 document.body[endInset : endInset+1] = subst
1888 addedLines += len(subst) - 1
1892 def revert_subfig(document):
1893 " Revert subfloats. "
1896 # whitespace intended (exclude \\begin_inset FloatList)
1897 i = find_tokens(document.body, ['\\begin_inset Float ', '\\begin_inset Wrap'], i)
1903 j = find_end_of_inset(document.body, i)
1905 document.warning("Malformed lyx document: Missing '\\end_inset' (float) at line " + str(i + len(document.header)) + ".\n\t" + document.body[i])
1906 # document.warning(document.body[i-1] + "\n" + document.body[i+1])
1908 continue # this will get us back to the outer loop, since j == -1
1909 # look for embedded float (= subfloat)
1910 # whitespace intended (exclude \\begin_inset FloatList)
1911 k = find_token(document.body, '\\begin_inset Float ', i + 1, j)
1914 l = find_end_of_inset(document.body, k)
1916 document.warning("Malformed lyx document: Missing '\\end_inset' (embedded float).")
1919 continue # escape to the outer loop
1920 m = find_default_layout(document, k + 1, l)
1922 cap = find_token(document.body, '\\begin_inset Caption', k + 1, l)
1927 capend = find_end_of_inset(document.body, cap)
1929 document.warning("Malformed lyx document: Missing '\\end_inset' (caption).")
1933 lbl = find_token(document.body, '\\begin_inset CommandInset label', cap, capend)
1935 lblend = find_end_of_inset(document.body, lbl + 1)
1937 document.warning("Malformed lyx document: Missing '\\end_inset' (label).")
1939 for line in document.body[lbl:lblend + 1]:
1940 if line.startswith('name '):
1941 label = line.split()[1].strip('"')
1948 opt = find_token(document.body, '\\begin_inset OptArg', cap, capend)
1950 optend = find_end_of_inset(document.body, opt)
1952 document.warning("Malformed lyx document: Missing '\\end_inset' (OptArg).")
1954 optc = find_default_layout(document, opt, optend)
1956 document.warning("Malformed LyX document: Missing `\\begin_layout' in Float inset.")
1958 optcend = find_end_of(document.body, optc, "\\begin_layout", "\\end_layout")
1959 for line in document.body[optc:optcend]:
1960 if not line.startswith('\\'):
1961 shortcap += line.strip()
1965 for line in document.body[cap:capend]:
1966 if line in document.body[lbl:lblend]:
1968 elif line in document.body[opt:optend]:
1970 elif not line.startswith('\\'):
1971 caption += line.strip()
1973 caption += "\\backslash\nlabel{" + label + "}"
1974 subst = '\\begin_layout Plain Layout\n\\begin_inset ERT\nstatus collapsed\n\n' \
1975 '\\begin_layout Plain Layout\n\n}\n\\end_layout\n\n\\end_inset\n\n' \
1976 '\\end_layout\n\n\\begin_layout Plain Layout\n'
1977 subst = subst.split('\n')
1978 document.body[l : l+1] = subst
1979 addedLines = len(subst) - 1
1980 # this is before l and so is unchanged by the multiline insertion
1982 del document.body[cap:capend+1]
1983 addedLines -= (capend + 1 - cap)
1984 del document.body[k+1:m-1]
1985 addedLines -= (m - 1 - (k + 1))
1986 insertion = '\\begin_inset ERT\nstatus collapsed\n\n' \
1987 '\\begin_layout Plain Layout\n\n\\backslash\n' \
1989 if len(shortcap) > 0:
1990 insertion = insertion + "[" + shortcap + "]"
1991 if len(caption) > 0:
1992 insertion = insertion + "[" + caption + "]"
1993 insertion = insertion + '{%\n\\end_layout\n\n\\end_inset\n\n\\end_layout\n'
1994 insertion = insertion.split('\n')
1995 document.body[k : k + 1] = insertion
1996 addedLines += len(insertion) - 1
1997 add_to_preamble(document,
1998 ['\\usepackage{subfig}\n'])
2002 def revert_wrapplacement(document):
2003 " Revert placement options wrap floats (wrapfig). "
2006 i = find_token(document.body, "\\begin_inset Wrap figure", i)
2009 e = find_end_of_inset(document.body, i)
2010 j = find_token(document.body, "placement", i + 1, e)
2012 document.warning("Malformed LyX document: Couldn't find placement parameter of wrap float.")
2015 r = re.compile("placement (o|i|l|r)")
2016 m = r.match(document.body[j])
2018 document.warning("Malformed LyX document: Placement option isn't O|I|R|L!")
2019 document.body[j] = "placement " + m.group(1).lower()
2023 def remove_extra_embedded_files(document):
2024 " Remove \extra_embedded_files from buffer params "
2025 i = find_token(document.header, '\\extra_embedded_files', 0)
2028 document.header.pop(i)
2031 def convert_spaceinset(document):
2032 " Convert '\\InsetSpace foo' to '\\begin_inset Space foo\n\\end_inset' "
2034 while i < len(document.body):
2035 m = re.match(r'(.*)\\InsetSpace (.*)', document.body[i])
2039 subst = [before, "\\begin_inset Space " + after, "\\end_inset"]
2040 document.body[i: i+1] = subst
2046 def revert_spaceinset(document):
2047 " Revert '\\begin_inset Space foo\n\\end_inset' to '\\InsetSpace foo' "
2050 i = find_token(document.body, "\\begin_inset Space", i)
2053 j = find_end_of_inset(document.body, i)
2055 document.warning("Malformed LyX document: Could not find end of space inset.")
2057 document.body[i] = document.body[i].replace('\\begin_inset Space', '\\InsetSpace')
2058 del document.body[j]
2061 def convert_hfill(document):
2062 " Convert hfill to space inset "
2065 i = find_token(document.body, "\\hfill", i)
2068 subst = document.body[i].replace('\\hfill', \
2069 '\n\\begin_inset Space \\hfill{}\n\\end_inset')
2070 subst = subst.split('\n')
2071 document.body[i : i+1] = subst
2075 def revert_hfills(document):
2076 ' Revert \\hfill commands '
2077 hfill = re.compile(r'\\hfill')
2078 dotfill = re.compile(r'\\dotfill')
2079 hrulefill = re.compile(r'\\hrulefill')
2082 i = find_token(document.body, "\\InsetSpace", i)
2085 if hfill.search(document.body[i]):
2086 document.body[i] = \
2087 document.body[i].replace('\\InsetSpace \\hfill{}', '\\hfill')
2090 if dotfill.search(document.body[i]):
2091 subst = document.body[i].replace('\\InsetSpace \\dotfill{}', \
2092 '\\begin_inset ERT\nstatus collapsed\n\n' \
2093 '\\begin_layout Standard\n\n\n\\backslash\n' \
2094 'dotfill{}\n\\end_layout\n\n\\end_inset\n\n')
2095 subst = subst.split('\n')
2096 document.body[i : i+1] = subst
2099 if hrulefill.search(document.body[i]):
2100 subst = document.body[i].replace('\\InsetSpace \\hrulefill{}', \
2101 '\\begin_inset ERT\nstatus collapsed\n\n' \
2102 '\\begin_layout Standard\n\n\n\\backslash\n' \
2103 'hrulefill{}\n\\end_layout\n\n\\end_inset\n\n')
2104 subst = subst.split('\n')
2105 document.body[i : i+1] = subst
2110 def revert_hspace(document):
2111 ' Revert \\InsetSpace \\hspace{} to ERT '
2113 hspace = re.compile(r'\\hspace{}')
2114 hstar = re.compile(r'\\hspace\*{}')
2116 i = find_token(document.body, "\\InsetSpace \\hspace", i)
2119 length = get_value(document.body, '\\length', i+1)
2121 document.warning("Malformed lyx document: Missing '\\length' in Space inset.")
2123 del document.body[i+1]
2125 if hstar.search(document.body[i]):
2126 subst = document.body[i].replace('\\InsetSpace \\hspace*{}', \
2127 '\\begin_inset ERT\nstatus collapsed\n\n' \
2128 '\\begin_layout Standard\n\n\n\\backslash\n' \
2129 'hspace*{' + length + '}\n\\end_layout\n\n\\end_inset\n\n')
2130 subst = subst.split('\n')
2131 document.body[i : i+1] = subst
2132 addedLines += len(subst) - 1
2135 if hspace.search(document.body[i]):
2136 subst = document.body[i].replace('\\InsetSpace \\hspace{}', \
2137 '\\begin_inset ERT\nstatus collapsed\n\n' \
2138 '\\begin_layout Standard\n\n\n\\backslash\n' \
2139 'hspace{' + length + '}\n\\end_layout\n\n\\end_inset\n\n')
2140 subst = subst.split('\n')
2141 document.body[i : i+1] = subst
2142 addedLines += len(subst) - 1
2148 def revert_protected_hfill(document):
2149 ' Revert \\begin_inset Space \\hspace*{\\fill} to ERT '
2152 i = find_token(document.body, '\\begin_inset Space \\hspace*{\\fill}', i)
2155 j = find_end_of_inset(document.body, i)
2157 document.warning("Malformed LyX document: Could not find end of space inset.")
2159 del document.body[j]
2160 subst = document.body[i].replace('\\begin_inset Space \\hspace*{\\fill}', \
2161 '\\begin_inset ERT\nstatus collapsed\n\n' \
2162 '\\begin_layout Standard\n\n\n\\backslash\n' \
2163 'hspace*{\n\\backslash\nfill}\n\\end_layout\n\n\\end_inset\n\n')
2164 subst = subst.split('\n')
2165 document.body[i : i+1] = subst
2169 def revert_leftarrowfill(document):
2170 ' Revert \\begin_inset Space \\leftarrowfill{} to ERT '
2173 i = find_token(document.body, '\\begin_inset Space \\leftarrowfill{}', i)
2176 j = find_end_of_inset(document.body, i)
2178 document.warning("Malformed LyX document: Could not find end of space inset.")
2180 del document.body[j]
2181 subst = document.body[i].replace('\\begin_inset Space \\leftarrowfill{}', \
2182 '\\begin_inset ERT\nstatus collapsed\n\n' \
2183 '\\begin_layout Standard\n\n\n\\backslash\n' \
2184 'leftarrowfill{}\n\\end_layout\n\n\\end_inset\n\n')
2185 subst = subst.split('\n')
2186 document.body[i : i+1] = subst
2190 def revert_rightarrowfill(document):
2191 ' Revert \\begin_inset Space \\rightarrowfill{} to ERT '
2194 i = find_token(document.body, '\\begin_inset Space \\rightarrowfill{}', i)
2197 j = find_end_of_inset(document.body, i)
2199 document.warning("Malformed LyX document: Could not find end of space inset.")
2201 del document.body[j]
2202 subst = document.body[i].replace('\\begin_inset Space \\rightarrowfill{}', \
2203 '\\begin_inset ERT\nstatus collapsed\n\n' \
2204 '\\begin_layout Standard\n\n\n\\backslash\n' \
2205 'rightarrowfill{}\n\\end_layout\n\n\\end_inset\n\n')
2206 subst = subst.split('\n')
2207 document.body[i : i+1] = subst
2211 def revert_upbracefill(document):
2212 ' Revert \\begin_inset Space \\upbracefill{} to ERT '
2215 i = find_token(document.body, '\\begin_inset Space \\upbracefill{}', i)
2218 j = find_end_of_inset(document.body, i)
2220 document.warning("Malformed LyX document: Could not find end of space inset.")
2222 del document.body[j]
2223 subst = document.body[i].replace('\\begin_inset Space \\upbracefill{}', \
2224 '\\begin_inset ERT\nstatus collapsed\n\n' \
2225 '\\begin_layout Standard\n\n\n\\backslash\n' \
2226 'upbracefill{}\n\\end_layout\n\n\\end_inset\n\n')
2227 subst = subst.split('\n')
2228 document.body[i : i+1] = subst
2232 def revert_downbracefill(document):
2233 ' Revert \\begin_inset Space \\downbracefill{} to ERT '
2236 i = find_token(document.body, '\\begin_inset Space \\downbracefill{}', i)
2239 j = find_end_of_inset(document.body, i)
2241 document.warning("Malformed LyX document: Could not find end of space inset.")
2243 del document.body[j]
2244 subst = document.body[i].replace('\\begin_inset Space \\downbracefill{}', \
2245 '\\begin_inset ERT\nstatus collapsed\n\n' \
2246 '\\begin_layout Standard\n\n\n\\backslash\n' \
2247 'downbracefill{}\n\\end_layout\n\n\\end_inset\n\n')
2248 subst = subst.split('\n')
2249 document.body[i : i+1] = subst
2253 def revert_local_layout(document):
2254 ' Revert local layout headers.'
2257 i = find_token(document.header, "\\begin_local_layout", i)
2260 j = find_end_of(document.header, i, "\\begin_local_layout", "\\end_local_layout")
2262 # this should not happen
2264 document.header[i : j + 1] = []
2267 def convert_pagebreaks(document):
2268 ' Convert inline Newpage insets to new format '
2271 i = find_token(document.body, '\\newpage', i)
2274 document.body[i:i+1] = ['\\begin_inset Newpage newpage',
2278 i = find_token(document.body, '\\pagebreak', i)
2281 document.body[i:i+1] = ['\\begin_inset Newpage pagebreak',
2285 i = find_token(document.body, '\\clearpage', i)
2288 document.body[i:i+1] = ['\\begin_inset Newpage clearpage',
2292 i = find_token(document.body, '\\cleardoublepage', i)
2295 document.body[i:i+1] = ['\\begin_inset Newpage cleardoublepage',
2299 def revert_pagebreaks(document):
2300 ' Revert \\begin_inset Newpage to previous inline format '
2303 i = find_token(document.body, '\\begin_inset Newpage', i)
2306 j = find_end_of_inset(document.body, i)
2308 document.warning("Malformed LyX document: Could not find end of Newpage inset.")
2310 del document.body[j]
2311 document.body[i] = document.body[i].replace('\\begin_inset Newpage newpage', '\\newpage')
2312 document.body[i] = document.body[i].replace('\\begin_inset Newpage pagebreak', '\\pagebreak')
2313 document.body[i] = document.body[i].replace('\\begin_inset Newpage clearpage', '\\clearpage')
2314 document.body[i] = document.body[i].replace('\\begin_inset Newpage cleardoublepage', '\\cleardoublepage')
2317 def convert_linebreaks(document):
2318 ' Convert inline Newline insets to new format '
2321 i = find_token(document.body, '\\newline', i)
2324 document.body[i:i+1] = ['\\begin_inset Newline newline',
2328 i = find_token(document.body, '\\linebreak', i)
2331 document.body[i:i+1] = ['\\begin_inset Newline linebreak',
2335 def revert_linebreaks(document):
2336 ' Revert \\begin_inset Newline to previous inline format '
2339 i = find_token(document.body, '\\begin_inset Newline', i)
2342 j = find_end_of_inset(document.body, i)
2344 document.warning("Malformed LyX document: Could not find end of Newline inset.")
2346 del document.body[j]
2347 document.body[i] = document.body[i].replace('\\begin_inset Newline newline', '\\newline')
2348 document.body[i] = document.body[i].replace('\\begin_inset Newline linebreak', '\\linebreak')
2351 def convert_japanese_plain(document):
2352 ' Set language japanese-plain to japanese '
2354 if document.language == "japanese-plain":
2355 document.language = "japanese"
2356 i = find_token(document.header, "\\language", 0)
2358 document.header[i] = "\\language japanese"
2361 j = find_token(document.body, "\\lang japanese-plain", j)
2364 document.body[j] = document.body[j].replace("\\lang japanese-plain", "\\lang japanese")
2368 def revert_pdfpages(document):
2369 ' Revert pdfpages external inset to ERT '
2372 i = find_token(document.body, "\\begin_inset External", i)
2375 j = find_end_of_inset(document.body, i)
2377 document.warning("Malformed lyx document: Missing '\\end_inset' in revert_pdfpages.")
2380 if get_value(document.body, 'template', i, j) == "PDFPages":
2381 filename = get_value(document.body, 'filename', i, j)
2383 r = re.compile(r'\textra PDFLaTeX \"(.*)\"$')
2384 for k in range(i, j):
2385 m = r.match(document.body[k])
2388 angle = get_value(document.body, 'rotateAngle', i, j)
2389 width = get_value(document.body, 'width', i, j)
2390 height = get_value(document.body, 'height', i, j)
2391 scale = get_value(document.body, 'scale', i, j)
2392 keepAspectRatio = find_token(document.body, "\tkeepAspectRatio", i, j)
2396 options += ",angle=" + angle
2398 options += "angle=" + angle
2401 options += ",width=" + convert_len(width)
2403 options += "width=" + convert_len(width)
2406 options += ",height=" + convert_len(height)
2408 options += "height=" + convert_len(height)
2411 options += ",scale=" + scale
2413 options += "scale=" + scale
2414 if keepAspectRatio != '':
2416 options += ",keepaspectratio"
2418 options += "keepaspectratio"
2420 options = '[' + options + ']'
2421 del document.body[i+1:j+1]
2422 document.body[i:i+1] = ['\\begin_inset ERT',
2425 '\\begin_layout Standard',
2428 'includepdf' + options + '{' + filename + '}',
2432 add_to_preamble(document, ['\\usepackage{pdfpages}\n'])
2438 def revert_mexican(document):
2439 ' Set language Spanish(Mexico) to Spanish '
2441 if document.language == "spanish-mexico":
2442 document.language = "spanish"
2443 i = find_token(document.header, "\\language", 0)
2445 document.header[i] = "\\language spanish"
2448 j = find_token(document.body, "\\lang spanish-mexico", j)
2451 document.body[j] = document.body[j].replace("\\lang spanish-mexico", "\\lang spanish")
2455 def remove_embedding(document):
2456 ' Remove embed tag from all insets '
2457 revert_inset_embedding(document, 'Graphics')
2458 revert_inset_embedding(document, 'External')
2459 revert_inset_embedding(document, 'CommandInset include')
2460 revert_inset_embedding(document, 'CommandInset bibtex')
2463 def revert_master(document):
2464 ' Remove master param '
2465 i = find_token(document.header, "\\master", 0)
2467 del document.header[i]
2470 def revert_graphics_group(document):
2471 ' Revert group information from graphics insets '
2474 i = find_token(document.body, "\\begin_inset Graphics", i)
2477 j = find_end_of_inset(document.body, i)
2479 document.warning("Malformed lyx document: Missing '\\end_inset' in revert_graphics_group.")
2482 k = find_token(document.body, " groupId", i, j)
2486 del document.body[k]
2490 def update_apa_styles(document):
2491 ' Replace obsolete styles '
2493 if document.textclass != "apa":
2496 obsoletedby = { "Acknowledgments": "Acknowledgements",
2497 "Section*": "Section",
2498 "Subsection*": "Subsection",
2499 "Subsubsection*": "Subsubsection",
2500 "Paragraph*": "Paragraph",
2501 "Subparagraph*": "Subparagraph"}
2504 i = find_token(document.body, "\\begin_layout", i)
2508 layout = document.body[i][14:]
2509 if layout in obsoletedby:
2510 document.body[i] = "\\begin_layout " + obsoletedby[layout]
2515 def convert_paper_sizes(document):
2516 ' exchange size options legalpaper and executivepaper to correct order '
2517 # routine is needed to fix http://bugzilla.lyx.org/show_bug.cgi?id=4868
2520 i = find_token(document.header, "\\papersize executivepaper", 0)
2522 document.header[i] = "\\papersize legalpaper"
2524 j = find_token(document.header, "\\papersize legalpaper", 0)
2526 document.header[j] = "\\papersize executivepaper"
2529 def revert_paper_sizes(document):
2530 ' exchange size options legalpaper and executivepaper to correct order '
2533 i = find_token(document.header, "\\papersize executivepaper", 0)
2535 document.header[i] = "\\papersize legalpaper"
2537 j = find_token(document.header, "\\papersize legalpaper", 0)
2539 document.header[j] = "\\papersize executivepaper"
2542 def convert_InsetSpace(document):
2543 " Convert '\\begin_inset Space foo' to '\\begin_inset space foo'"
2546 i = find_token(document.body, "\\begin_inset Space", i)
2549 document.body[i] = document.body[i].replace('\\begin_inset Space', '\\begin_inset space')
2552 def revert_InsetSpace(document):
2553 " Revert '\\begin_inset space foo' to '\\begin_inset Space foo'"
2556 i = find_token(document.body, "\\begin_inset space", i)
2559 document.body[i] = document.body[i].replace('\\begin_inset space', '\\begin_inset Space')
2562 def convert_display_enum(document):
2563 " Convert 'display foo' to 'display false/true'"
2566 i = find_token(document.body, "\tdisplay", i)
2569 val = get_value(document.body, 'display', i)
2571 document.body[i] = document.body[i].replace('none', 'false')
2572 if val == "default":
2573 document.body[i] = document.body[i].replace('default', 'true')
2574 if val == "monochrome":
2575 document.body[i] = document.body[i].replace('monochrome', 'true')
2576 if val == "grayscale":
2577 document.body[i] = document.body[i].replace('grayscale', 'true')
2579 document.body[i] = document.body[i].replace('color', 'true')
2580 if val == "preview":
2581 document.body[i] = document.body[i].replace('preview', 'true')
2585 def revert_display_enum(document):
2586 " Revert 'display false/true' to 'display none/color'"
2589 i = find_token(document.body, "\tdisplay", i)
2592 val = get_value(document.body, 'display', i)
2594 document.body[i] = document.body[i].replace('false', 'none')
2596 document.body[i] = document.body[i].replace('true', 'default')
2600 def remove_fontsCJK(document):
2601 ' Remove font_cjk param '
2602 i = find_token(document.header, "\\font_cjk", 0)
2604 del document.header[i]
2607 def convert_plain_layout(document):
2608 " Convert 'PlainLayout' to 'Plain Layout'"
2611 i = find_token(document.body, '\\begin_layout PlainLayout', i)
2614 document.body[i] = document.body[i].replace('\\begin_layout PlainLayout', \
2615 '\\begin_layout Plain Layout')
2619 def revert_plain_layout(document):
2620 " Convert 'PlainLayout' to 'Plain Layout'"
2623 i = find_token(document.body, '\\begin_layout Plain Layout', i)
2626 document.body[i] = document.body[i].replace('\\begin_layout Plain Layout', \
2627 '\\begin_layout PlainLayout')
2631 def revert_plainlayout(document):
2632 " Convert 'PlainLayout' to 'Plain Layout'"
2635 i = find_token(document.body, '\\begin_layout PlainLayout', i)
2638 # This will be incorrect for some document classes, since Standard is not always
2639 # the default. But (a) it is probably the best we can do and (b) it will actually
2640 # work, in fact, since an unknown layout will be converted to default.
2641 document.body[i] = document.body[i].replace('\\begin_layout PlainLayout', \
2642 '\\begin_layout Standard')
2646 def revert_polytonicgreek(document):
2647 "Set language polytonic Greek to Greek"
2649 if document.language == "polutonikogreek":
2650 document.language = "greek"
2651 i = find_token(document.header, "\\language", 0)
2653 document.header[i] = "\\language greek"
2656 j = find_token(document.body, "\\lang polutonikogreek", j)
2659 document.body[j] = document.body[j].replace("\\lang polutonikogreek", "\\lang greek")
2667 supported_versions = ["1.6.0","1.6"]
2668 convert = [[277, [fix_wrong_tables]],
2669 [278, [close_begin_deeper]],
2670 [279, [long_charstyle_names]],
2671 [280, [axe_show_label]],
2674 [283, [convert_flex]],
2678 [287, [convert_wrapfig_options]],
2679 [288, [convert_inset_command]],
2680 [289, [convert_latexcommand_index]],
2685 [294, [convert_pdf_options]],
2686 [295, [convert_htmlurl, convert_url]],
2687 [296, [convert_include]],
2688 [297, [convert_usorbian]],
2694 [303, [convert_serbocroatian]],
2695 [304, [convert_framed_notes]],
2702 [311, [convert_ams_classes]],
2704 [313, [convert_module_names]],
2707 [316, [convert_subfig]],
2710 [319, [convert_spaceinset, convert_hfill]],
2712 [321, [convert_tablines]],
2713 [322, [convert_plain_layout]],
2714 [323, [convert_pagebreaks]],
2715 [324, [convert_linebreaks]],
2716 [325, [convert_japanese_plain]],
2719 [328, [remove_embedding, remove_extra_embedded_files, remove_inzip_options]],
2722 [331, [convert_ltcaption]],
2724 [333, [update_apa_styles]],
2725 [334, [convert_paper_sizes]],
2726 [335, [convert_InsetSpace]],
2728 [337, [convert_display_enum]],
2732 revert = [[337, [revert_polytonicgreek]],
2733 [336, [revert_display_enum]],
2734 [335, [remove_fontsCJK]],
2735 [334, [revert_InsetSpace]],
2736 [333, [revert_paper_sizes]],
2738 [331, [revert_graphics_group]],
2739 [330, [revert_ltcaption]],
2740 [329, [revert_leftarrowfill, revert_rightarrowfill, revert_upbracefill, revert_downbracefill]],
2741 [328, [revert_master]],
2743 [326, [revert_mexican]],
2744 [325, [revert_pdfpages]],
2746 [323, [revert_linebreaks]],
2747 [322, [revert_pagebreaks]],
2748 [321, [revert_local_layout, revert_plain_layout]],
2749 [320, [revert_tablines]],
2750 [319, [revert_protected_hfill]],
2751 [318, [revert_spaceinset, revert_hfills, revert_hspace]],
2752 [317, [remove_extra_embedded_files]],
2753 [316, [revert_wrapplacement]],
2754 [315, [revert_subfig]],
2755 [314, [revert_colsep, revert_plainlayout]],
2757 [312, [revert_module_names]],
2758 [311, [revert_rotfloat, revert_widesideways]],
2759 [310, [revert_external_embedding]],
2760 [309, [revert_btprintall]],
2761 [308, [revert_nocite]],
2762 [307, [revert_serbianlatin]],
2763 [306, [revert_slash, revert_nobreakdash]],
2764 [305, [revert_interlingua]],
2765 [304, [revert_bahasam]],
2766 [303, [revert_framed_notes]],
2768 [301, [revert_latin, revert_samin]],
2769 [300, [revert_linebreak]],
2770 [299, [revert_pagebreak]],
2771 [298, [revert_hyperlinktype]],
2772 [297, [revert_macro_optional_params]],
2773 [296, [revert_albanian, revert_lowersorbian, revert_uppersorbian]],
2774 [295, [revert_include]],
2775 [294, [revert_href, revert_url]],
2776 [293, [revert_pdf_options_2]],
2777 [292, [revert_inset_info]],
2778 [291, [revert_japanese, revert_japanese_encoding]],
2779 [290, [revert_vietnamese]],
2780 [289, [revert_wraptable]],
2781 [288, [revert_latexcommand_index]],
2782 [287, [revert_inset_command]],
2783 [286, [revert_wrapfig_options]],
2784 [285, [revert_pdf_options]],
2785 [284, [remove_inzip_options]],
2787 [282, [revert_flex]],
2789 [280, [revert_begin_modules]],
2790 [279, [revert_show_label]],
2791 [278, [revert_long_charstyle_names]],
2797 if __name__ == "__main__":