1 # This file is part of lyx2lyx
2 # -*- coding: utf-8 -*-
3 # Copyright (C) 2007 José Matos <jamatos@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
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")
34 def wrap_into_ert(string, src, dst):
35 " Wrap a something into an ERT"
36 return string.replace(src, '\n\\begin_inset ERT\nstatus collapsed\n\\begin_layout Standard\n'
37 + dst + '\n\\end_layout\n\\end_inset\n')
40 ####################################################################
42 def fix_wrong_tables(document):
45 i = find_token(document.body, "\\begin_inset Tabular", i)
48 j = find_end_of_inset(document.body, i + 1)
50 document.warning("Malformed LyX document: Could not find end of tabular.")
54 nrows = int(document.body[i+1].split('"')[3])
55 ncols = int(document.body[i+1].split('"')[5])
57 for l in range(nrows):
59 for k in range(ncols):
60 m = find_token(document.body, '<cell', m)
62 if document.body[m].find('multicolumn') != -1:
63 multicol_cont = int(document.body[m].split('"')[1])
65 if multicol_cont == 2 and (k == 0 or prev_multicolumn == 0):
66 document.body[m] = document.body[m][:5] + document.body[m][21:]
69 prev_multicolumn = multicol_cont
76 def close_begin_deeper(document):
80 i = find_tokens(document.body, ["\\begin_deeper", "\\end_deeper"], i)
85 if document.body[i][:13] == "\\begin_deeper":
92 document.body[-2:-2] = ['\\end_deeper' for i in range(depth)]
95 def long_charstyle_names(document):
98 i = find_token(document.body, "\\begin_inset CharStyle", i)
101 document.body[i] = document.body[i].replace("CharStyle ", "CharStyle CharStyle:")
104 def revert_long_charstyle_names(document):
107 i = find_token(document.body, "\\begin_inset CharStyle", i)
110 document.body[i] = document.body[i].replace("CharStyle CharStyle:", "CharStyle")
114 def axe_show_label(document):
117 i = find_token(document.body, "\\begin_inset CharStyle", i)
120 if document.body[i + 1].find("show_label") != -1:
121 if document.body[i + 1].find("true") != -1:
122 document.body[i + 1] = "status open"
123 del document.body[ i + 2]
125 if document.body[i + 1].find("false") != -1:
126 document.body[i + 1] = "status collapsed"
127 del document.body[ i + 2]
129 document.warning("Malformed LyX document: show_label neither false nor true.")
131 document.warning("Malformed LyX document: show_label missing in CharStyle.")
136 def revert_show_label(document):
139 i = find_token(document.body, "\\begin_inset CharStyle", i)
142 if document.body[i + 1].find("status open") != -1:
143 document.body.insert(i + 1, "show_label true")
145 if document.body[i + 1].find("status collapsed") != -1:
146 document.body.insert(i + 1, "show_label false")
148 document.warning("Malformed LyX document: no legal status line in CharStyle.")
151 def revert_begin_modules(document):
154 i = find_token(document.header, "\\begin_modules", i)
157 j = find_end_of(document.header, i, "\\begin_modules", "\\end_modules")
159 # this should not happen
161 document.header[i : j + 1] = []
163 def convert_flex(document):
164 "Convert CharStyle to Flex"
167 i = find_token(document.body, "\\begin_inset CharStyle", i)
170 document.body[i] = document.body[i].replace('\\begin_inset CharStyle', '\\begin_inset Flex')
172 def revert_flex(document):
173 "Convert Flex to CharStyle"
176 i = find_token(document.body, "\\begin_inset Flex", i)
179 document.body[i] = document.body[i].replace('\\begin_inset Flex', '\\begin_inset CharStyle')
182 # Discard PDF options for hyperref
183 def revert_pdf_options(document):
184 "Revert PDF options for hyperref."
186 i = find_token(document.header, "\\use_hyperref", i)
188 del document.header[i]
189 i = find_token(document.header, "\\pdf_store_options", i)
191 del document.header[i]
192 i = find_token(document.header, "\\pdf_title", 0)
194 del document.header[i]
195 i = find_token(document.header, "\\pdf_author", 0)
197 del document.header[i]
198 i = find_token(document.header, "\\pdf_subject", 0)
200 del document.header[i]
201 i = find_token(document.header, "\\pdf_keywords", 0)
203 del document.header[i]
204 i = find_token(document.header, "\\pdf_bookmarks", 0)
206 del document.header[i]
207 i = find_token(document.header, "\\pdf_bookmarksnumbered", i)
209 del document.header[i]
210 i = find_token(document.header, "\\pdf_bookmarksopen", i)
212 del document.header[i]
213 i = find_token(document.header, "\\pdf_bookmarksopenlevel", i)
215 del document.header[i]
216 i = find_token(document.header, "\\pdf_breaklinks", i)
218 del document.header[i]
219 i = find_token(document.header, "\\pdf_pdfborder", i)
221 del document.header[i]
222 i = find_token(document.header, "\\pdf_colorlinks", i)
224 del document.header[i]
225 i = find_token(document.header, "\\pdf_backref", i)
227 del document.header[i]
228 i = find_token(document.header, "\\pdf_pagebackref", i)
230 del document.header[i]
231 i = find_token(document.header, "\\pdf_pagemode", 0)
233 del document.header[i]
234 i = find_token(document.header, "\\pdf_quoted_options", 0)
236 del document.header[i]
239 def remove_inzip_options(document):
240 "Remove inzipName and embed options from the Graphics inset"
243 i = find_token(document.body, "\\begin_inset Graphics", i)
246 j = find_end_of_inset(document.body, i + 1)
249 document.warning("Malformed LyX document: Could not find end of graphics inset.")
250 # If there's a inzip param, just remove that
251 k = find_token(document.body, "\tinzipName", i + 1, j)
254 # embed option must follow the inzipName option
255 del document.body[k+1]
259 def convert_inset_command(document):
262 \begin_inset LatexCommand cmd
264 \begin_inset CommandInset InsetType
269 i = find_token(document.body, "\\begin_inset LatexCommand", i)
272 line = document.body[i]
273 r = re.compile(r'\\begin_inset LatexCommand (.*)$')
277 #this is adapted from factory.cpp
278 if cmdName[0:4].lower() == "cite":
279 insetName = "citation"
280 elif cmdName == "url" or cmdName == "htmlurl":
282 elif cmdName[-3:] == "ref":
284 elif cmdName == "tableofcontents":
286 elif cmdName == "printnomenclature":
287 insetName = "nomencl_print"
288 elif cmdName == "printindex":
289 insetName = "index_print"
292 insertion = ["\\begin_inset CommandInset " + insetName, "LatexCommand " + cmdName]
293 document.body[i : i+1] = insertion
296 def revert_inset_command(document):
299 \begin_inset CommandInset InsetType
302 \begin_inset LatexCommand cmd
303 Some insets may end up being converted to insets earlier versions of LyX
304 will not be able to recognize. Not sure what to do about that.
308 i = find_token(document.body, "\\begin_inset CommandInset", i)
311 nextline = document.body[i+1]
312 r = re.compile(r'LatexCommand\s+(.*)$')
313 m = r.match(nextline)
315 document.warning("Malformed LyX document: Missing LatexCommand in " + document.body[i] + ".")
318 insertion = ["\\begin_inset LatexCommand " + cmdName]
319 document.body[i : i+2] = insertion
322 def convert_wrapfig_options(document):
323 "Convert optional options for wrap floats (wrapfig)."
324 # adds the tokens "lines", "placement", and "overhang"
327 i = find_token(document.body, "\\begin_inset Wrap figure", i)
330 document.body.insert(i + 1, "lines 0")
331 j = find_token(document.body, "placement", i)
332 # placement can be already set or not; if not, set it
334 document.body.insert(i + 3, "overhang 0col%")
336 document.body.insert(i + 2, "placement o")
337 document.body.insert(i + 3, "overhang 0col%")
341 def revert_wrapfig_options(document):
342 "Revert optional options for wrap floats (wrapfig)."
345 i = find_token(document.body, "lines", i)
348 j = find_token(document.body, "overhang", i+1)
349 if j != i + 2 and j != -1:
350 document.warning("Malformed LyX document: Couldn't find overhang parameter of wrap float.")
354 del document.body[j-1]
358 def convert_latexcommand_index(document):
359 "Convert from LatexCommand form to collapsable form."
362 i = find_token(document.body, "\\begin_inset CommandInset index", i)
365 if document.body[i + 1] != "LatexCommand index": # Might also be index_print
367 fullcontent = document.body[i + 2][6:].strip('"')
368 document.body[i:i + 2] = ["\\begin_inset Index",
370 "\\begin_layout Standard"]
371 # Put here the conversions needed from LaTeX string to LyXText.
372 # Here we do a minimal conversion to prevent crashes and data loss.
373 # Manual patch-up may be needed.
374 # Umlauted characters (most common ones, can be extended):
375 fullcontent = fullcontent.replace(r'\\\"a', u'ä').replace(r'\\\"o', u'ö').replace(r'\\\"u', u'ü')
377 fullcontent = wrap_into_ert(fullcontent, r'\"', '"')
378 #fullcontent = fullcontent.replace(r'\"', '\n\\begin_inset ERT\nstatus collapsed\n\\begin_layout standard\n"\n\\end_layout\n\\end_inset\n')
380 r = re.compile('^(.*?)(\$.*?\$)(.*)')
385 f = m.group(2).replace('\\\\', '\\')
389 s = wrap_into_ert(s, r'\\', '\\backslash')
390 s = wrap_into_ert(s, '{', '{')
391 s = wrap_into_ert(s, '}', '}')
392 document.body.insert(i + 3, s)
394 document.body.insert(i + 3, "\\begin_inset Formula " + f)
395 document.body.insert(i + 4, "\\end_inset")
397 # Generic, \\ -> \backslash:
398 g = wrap_into_ert(g, r'\\', '\\backslash{}')
399 g = wrap_into_ert(g, '{', '{')
400 g = wrap_into_ert(g, '}', '}')
401 document.body.insert(i + 3, g)
402 document.body[i + 4] = "\\end_layout"
406 def revert_latexcommand_index(document):
407 "Revert from collapsable form to LatexCommand form."
410 i = find_token(document.body, "\\begin_inset Index", i)
413 j = find_end_of_inset(document.body, i + 1)
416 del document.body[j - 1]
417 del document.body[j - 2] # \end_layout
418 document.body[i] = "\\begin_inset CommandInset index"
419 document.body[i + 1] = "LatexCommand index"
420 # clean up multiline stuff
422 for k in range(i + 3, j - 2):
423 line = document.body[k]
424 if line.startswith("\\begin_inset ERT"):
426 if line.startswith("\\begin_inset Formula"):
428 if line.startswith("\\begin_layout Standard"):
430 if line.startswith("\\end_layout"):
432 if line.startswith("\\end_inset"):
434 if line.startswith("status collapsed"):
436 line = line.replace(u'ä', r'\\\"a').replace(u'ö', r'\\\"o').replace(u'ü', r'\\\"u')
437 content = content + line;
438 document.body[i + 3] = "name " + '"' + content + '"'
439 for k in range(i + 4, j - 2):
440 del document.body[i + 4]
441 document.body.insert(i + 4, "")
442 del document.body[i + 2] # \begin_layout standard
446 def revert_wraptable(document):
447 "Revert wrap table to wrap figure."
450 i = find_token(document.body, "\\begin_inset Wrap table", i)
453 document.body[i] = document.body[i].replace('\\begin_inset Wrap table', '\\begin_inset Wrap figure')
457 def revert_vietnamese(document):
458 "Set language Vietnamese to English"
459 # Set document language from Vietnamese to English
461 if document.language == "vietnamese":
462 document.language = "english"
463 i = find_token(document.header, "\\language", 0)
465 document.header[i] = "\\language english"
468 j = find_token(document.body, "\\lang vietnamese", j)
471 document.body[j] = document.body[j].replace("\\lang vietnamese", "\\lang english")
475 def revert_japanese(document):
476 "Set language japanese-plain to japanese"
477 # Set document language from japanese-plain to japanese
479 if document.language == "japanese-plain":
480 document.language = "japanese"
481 i = find_token(document.header, "\\language", 0)
483 document.header[i] = "\\language japanese"
486 j = find_token(document.body, "\\lang japanese-plain", j)
489 document.body[j] = document.body[j].replace("\\lang japanese-plain", "\\lang japanese")
493 def revert_japanese_encoding(document):
494 "Set input encoding form EUC-JP-plain to EUC-JP etc."
495 # Set input encoding form EUC-JP-plain to EUC-JP etc.
497 i = find_token(document.header, "\\inputencoding EUC-JP-plain", 0)
499 document.header[i] = "\\inputencoding EUC-JP"
501 j = find_token(document.header, "\\inputencoding JIS-plain", 0)
503 document.header[j] = "\\inputencoding JIS"
505 k = find_token(document.header, "\\inputencoding SJIS-plain", 0)
506 if k != -1: # convert to UTF8 since there is currently no SJIS encoding
507 document.header[k] = "\\inputencoding UTF8"
510 def revert_inset_info(document):
511 'Replace info inset with its content'
514 i = find_token(document.body, '\\begin_inset Info', i)
517 j = find_end_of_inset(document.body, i + 1)
520 document.warning("Malformed LyX document: Could not find end of Info inset.")
523 for k in range(i, j+1):
524 if document.body[k].startswith("arg"):
525 arg = document.body[k][3:].strip().strip('"')
526 if document.body[k].startswith("type"):
527 type = document.body[k][4:].strip().strip('"')
528 # I think there is a newline after \\end_inset, which should be removed.
529 if document.body[j + 1].strip() == "":
530 document.body[i : (j + 2)] = [type + ':' + arg]
532 document.body[i : (j + 1)] = [type + ':' + arg]
535 def convert_pdf_options(document):
536 # Set the pdfusetitle tag, delete the pdf_store_options,
537 # set quotes for bookmarksopenlevel"
538 has_hr = get_value(document.header, "\\use_hyperref", 0, default = "0")
540 k = find_token(document.header, "\\use_hyperref", 0)
541 document.header.insert(k + 1, "\\pdf_pdfusetitle true")
542 k = find_token(document.header, "\\pdf_store_options", 0)
544 del document.header[k]
545 i = find_token(document.header, "\\pdf_bookmarksopenlevel", k)
547 document.header[i] = document.header[i].replace('"', '')
550 def revert_pdf_options_2(document):
551 # reset the pdfusetitle tag, set quotes for bookmarksopenlevel"
552 k = find_token(document.header, "\\use_hyperref", 0)
553 i = find_token(document.header, "\\pdf_pdfusetitle", k)
555 del document.header[i]
556 i = find_token(document.header, "\\pdf_bookmarksopenlevel", k)
558 values = document.header[i].split()
559 values[1] = ' "' + values[1] + '"'
560 document.header[i] = ''.join(values)
563 def convert_htmlurl(document):
564 'Convert "htmlurl" to "href" insets for docbook'
565 if document.backend != "docbook":
569 i = find_token(document.body, "\\begin_inset CommandInset url", i)
572 document.body[i] = "\\begin_inset CommandInset href"
573 document.body[i + 1] = "LatexCommand href"
577 def convert_url(document):
578 'Convert url insets to url charstyles'
579 if document.backend == "docbook":
583 i = find_token(document.body, "\\begin_inset CommandInset url", i)
586 n = find_token(document.body, "name", i)
588 # place the URL name in typewriter before the new URL insert
589 # grab the name 'bla' from the e.g. the line 'name "bla"',
590 # therefore start with the 6th character
591 name = document.body[n][6:-1]
592 newname = [name + " "]
593 document.body[i:i] = newname
595 j = find_token(document.body, "target", i)
597 document.warning("Malformed LyX document: Can't find target for url inset")
600 target = document.body[j][8:-1]
601 k = find_token(document.body, "\\end_inset", j)
603 document.warning("Malformed LyX document: Can't find end of url inset")
606 newstuff = ["\\begin_inset Flex URL",
607 "status collapsed", "",
608 "\\begin_layout Standard",
613 document.body[i:k] = newstuff
617 def revert_href(document):
618 'Reverts hyperlink insets (href) to url insets (url)'
621 i = find_token(document.body, "\\begin_inset CommandInset href", i)
624 document.body[i : i + 2] = \
625 ["\\begin_inset CommandInset url", "LatexCommand url"]
629 def convert_include(document):
630 'Converts include insets to new format.'
632 r = re.compile(r'\\begin_inset Include\s+\\([^{]+){([^}]*)}(?:\[(.*)\])?')
634 i = find_token(document.body, "\\begin_inset Include", i)
637 line = document.body[i]
638 previewline = document.body[i + 1]
641 document.warning("Unable to match line " + str(i) + " of body!")
647 insertion = ["\\begin_inset CommandInset include",
648 "LatexCommand " + cmd, previewline,
649 "filename \"" + fn + "\""]
652 insertion.append("lstparams " + '"' + opt + '"')
654 document.body[i : i + 2] = insertion
658 def revert_include(document):
659 'Reverts include insets to old format.'
661 r1 = re.compile('LatexCommand (.+)')
662 r2 = re.compile('filename (.+)')
663 r3 = re.compile('options (.*)')
665 i = find_token(document.body, "\\begin_inset CommandInset include", i)
668 previewline = document.body[i + 1]
669 m = r1.match(document.body[i + 2])
671 document.warning("Malformed LyX document: No LatexCommand line for `" +
672 document.body[i] + "' on line " + str(i) + ".")
676 m = r2.match(document.body[i + 3])
678 document.warning("Malformed LyX document: No filename line for `" + \
679 document.body[i] + "' on line " + str(i) + ".")
685 if (cmd == "lstinputlisting"):
686 m = r3.match(document.body[i + 4])
690 newline = "\\begin_inset Include \\" + cmd + "{" + fn + "}"
692 newline += ("[" + options + "]")
693 insertion = [newline, previewline]
694 document.body[i : i + numlines] = insertion
698 def revert_albanian(document):
699 "Set language Albanian to English"
701 if document.language == "albanian":
702 document.language = "english"
703 i = find_token(document.header, "\\language", 0)
705 document.header[i] = "\\language english"
708 j = find_token(document.body, "\\lang albanian", j)
711 document.body[j] = document.body[j].replace("\\lang albanian", "\\lang english")
715 def revert_lowersorbian(document):
716 "Set language lower Sorbian to English"
718 if document.language == "lowersorbian":
719 document.language = "english"
720 i = find_token(document.header, "\\language", 0)
722 document.header[i] = "\\language english"
725 j = find_token(document.body, "\\lang lowersorbian", j)
728 document.body[j] = document.body[j].replace("\\lang lowersorbian", "\\lang english")
732 def revert_uppersorbian(document):
733 "Set language uppersorbian to usorbian as this was used in LyX 1.5"
735 if document.language == "uppersorbian":
736 document.language = "usorbian"
737 i = find_token(document.header, "\\language", 0)
739 document.header[i] = "\\language usorbian"
742 j = find_token(document.body, "\\lang uppersorbian", j)
745 document.body[j] = document.body[j].replace("\\lang uppersorbian", "\\lang usorbian")
749 def convert_usorbian(document):
750 "Set language usorbian to uppersorbian"
752 if document.language == "usorbian":
753 document.language = "uppersorbian"
754 i = find_token(document.header, "\\language", 0)
756 document.header[i] = "\\language uppersorbian"
759 j = find_token(document.body, "\\lang usorbian", j)
762 document.body[j] = document.body[j].replace("\\lang usorbian", "\\lang uppersorbian")
766 def revert_macro_optional_params(document):
767 "Convert macro definitions with optional parameters into ERTs"
768 # Stub to convert macro definitions with one or more optional parameters
769 # into uninterpreted ERT insets
772 def revert_hyperlinktype(document):
773 'Reverts hyperlink type'
777 i = find_token(document.body, "target", i)
780 j = find_token(document.body, "type", i)
788 def revert_pagebreak(document):
789 'Reverts pagebreak to ERT'
792 i = find_token(document.body, "\\pagebreak", i)
795 document.body[i] = '\\begin_inset ERT\nstatus collapsed\n\n' \
796 '\\begin_layout Standard\n\n\n\\backslash\n' \
797 'pagebreak{}\n\\end_layout\n\n\\end_inset\n\n'
801 def revert_linebreak(document):
802 'Reverts linebreak to ERT'
805 i = find_token(document.body, "\\linebreak", i)
808 document.body[i] = '\\begin_inset ERT\nstatus collapsed\n\n' \
809 '\\begin_layout Standard\n\n\n\\backslash\n' \
810 'linebreak{}\n\\end_layout\n\n\\end_inset\n\n'
814 def revert_latin(document):
815 "Set language Latin to English"
817 if document.language == "latin":
818 document.language = "english"
819 i = find_token(document.header, "\\language", 0)
821 document.header[i] = "\\language english"
824 j = find_token(document.body, "\\lang latin", j)
827 document.body[j] = document.body[j].replace("\\lang latin", "\\lang english")
831 def revert_samin(document):
832 "Set language North Sami to English"
834 if document.language == "samin":
835 document.language = "english"
836 i = find_token(document.header, "\\language", 0)
838 document.header[i] = "\\language english"
841 j = find_token(document.body, "\\lang samin", j)
844 document.body[j] = document.body[j].replace("\\lang samin", "\\lang english")
848 def convert_serbocroatian(document):
849 "Set language Serbocroatian to Croatian as this was really Croatian in LyX 1.5"
851 if document.language == "serbocroatian":
852 document.language = "croatian"
853 i = find_token(document.header, "\\language", 0)
855 document.header[i] = "\\language croatian"
858 j = find_token(document.body, "\\lang serbocroatian", j)
861 document.body[j] = document.body[j].replace("\\lang serbocroatian", "\\lang croatian")
865 def convert_framed_notes(document):
866 "Convert framed notes to boxes. "
869 i = find_tokens(document.body, ["\\begin_inset Note Framed", "\\begin_inset Note Shaded"], i)
873 document.body[i] = document.body[i].replace("\\begin_inset Note", "\\begin_inset Box")
874 document.body.insert(i + 1, 'position "t"\nhor_pos "c"\nhas_inner_box 0\ninner_pos "t"\n' \
875 'use_parbox 0\nwidth "100col%"\nspecial "none"\nheight "1in"\n' \
876 'height_special "totalheight"')
880 def revert_framed_notes(document):
881 "Revert framed boxes to notes. "
884 i = find_tokens(document.body, ["\\begin_inset Box Framed", "\\begin_inset Box Shaded"], i)
888 j = find_end_of_inset(document.body, i + 1)
891 document.warning("Malformed LyX document: Could not find end of Box inset.")
892 k = find_token(document.body, "status", i + 1, j)
894 document.warning("Malformed LyX document: Missing `status' tag in Box inset.")
896 status = document.body[k]
897 l = find_token(document.body, "\\begin_layout Standard", i + 1, j)
899 document.warning("Malformed LyX document: Missing `\\begin_layout Standard' in Box inset.")
901 m = find_token(document.body, "\\end_layout", i + 1, j)
903 document.warning("Malformed LyX document: Missing `\\end_layout' in Box inset.")
905 ibox = find_token(document.body, "has_inner_box 1", i + 1, k)
906 pbox = find_token(document.body, "use_parbox 1", i + 1, k)
907 if ibox == -1 and pbox == -1:
908 document.body[i] = document.body[i].replace("\\begin_inset Box", "\\begin_inset Note")
909 del document.body[i+1:k]
911 document.body[i] = document.body[i].replace("\\begin_inset Box Shaded", "\\begin_inset Box Frameless")
912 document.body.insert(l + 1, "\\begin_inset Note Shaded\n" + status + "\n\\begin_layout Standard\n")
913 document.body.insert(m + 1, "\\end_layout\n\\end_inset")
917 def revert_slash(document):
918 'Revert \\SpecialChar \\slash{} to ERT'
919 for i in range(len(document.body)):
920 document.body[i] = document.body[i].replace('\\SpecialChar \\slash{}', \
921 '\\begin_inset ERT\nstatus collapsed\n\n' \
922 '\\begin_layout Standard\n\n\n\\backslash\n' \
923 'slash{}\n\\end_layout\n\n\\end_inset\n\n')
926 def revert_nobreakdash(document):
927 'Revert \\SpecialChar \\nobreakdash- to ERT'
929 for i in range(len(document.body)):
930 line = document.body[i]
931 r = re.compile(r'\\SpecialChar \\nobreakdash-')
935 document.body[i] = document.body[i].replace('\\SpecialChar \\nobreakdash-', \
936 '\\begin_inset ERT\nstatus collapsed\n\n' \
937 '\\begin_layout Standard\n\n\n\\backslash\n' \
938 'nobreakdash-\n\\end_layout\n\n\\end_inset\n\n')
941 j = find_token(document.header, "\\use_amsmath", 0)
943 document.warning("Malformed LyX document: Missing '\\use_amsmath'.")
945 document.header[j] = "\\use_amsmath 2"
948 def revert_bahasam(document):
949 "Set language Bahasa Malaysia to Bahasa Indonesia"
951 if document.language == "bahasam":
952 document.language = "bahasa"
953 i = find_token(document.header, "\\language", 0)
955 document.header[i] = "\\language bahasa"
958 j = find_token(document.body, "\\lang bahasam", j)
961 document.body[j] = document.body[j].replace("\\lang bahasam", "\\lang bahasa")
965 def revert_interlingua(document):
966 "Set language Interlingua to English"
968 if document.language == "interlingua":
969 document.language = "english"
970 i = find_token(document.header, "\\language", 0)
972 document.header[i] = "\\language english"
975 j = find_token(document.body, "\\lang interlingua", j)
978 document.body[j] = document.body[j].replace("\\lang interlingua", "\\lang english")
986 supported_versions = ["1.6.0","1.6"]
987 convert = [[277, [fix_wrong_tables]],
988 [278, [close_begin_deeper]],
989 [279, [long_charstyle_names]],
990 [280, [axe_show_label]],
993 [283, [convert_flex]],
997 [287, [convert_wrapfig_options]],
998 [288, [convert_inset_command]],
999 [289, [convert_latexcommand_index]],
1004 [294, [convert_pdf_options]],
1005 [295, [convert_htmlurl, convert_url]],
1006 [296, [convert_include]],
1007 [297, [convert_usorbian]],
1013 [303, [convert_serbocroatian]],
1014 [304, [convert_framed_notes]],
1020 revert = [[306, [revert_slash, revert_nobreakdash]],
1021 [305, [revert_interlingua]],
1022 [304, [revert_bahasam]],
1023 [303, [revert_framed_notes]],
1025 [301, [revert_latin, revert_samin]],
1026 [300, [revert_linebreak]],
1027 [299, [revert_pagebreak]],
1028 [298, [revert_hyperlinktype]],
1029 [297, [revert_macro_optional_params]],
1030 [296, [revert_albanian, revert_lowersorbian, revert_uppersorbian]],
1031 [295, [revert_include]],
1032 [294, [revert_href]],
1033 [293, [revert_pdf_options_2]],
1034 [292, [revert_inset_info]],
1035 [291, [revert_japanese, revert_japanese_encoding]],
1036 [290, [revert_vietnamese]],
1037 [289, [revert_wraptable]],
1038 [288, [revert_latexcommand_index]],
1039 [287, [revert_inset_command]],
1040 [286, [revert_wrapfig_options]],
1041 [285, [revert_pdf_options]],
1042 [284, [remove_inzip_options]],
1044 [282, [revert_flex]],
1046 [280, [revert_begin_modules]],
1047 [279, [revert_show_label]],
1048 [278, [revert_long_charstyle_names]],
1054 if __name__ == "__main__":