#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
""" Convert files to the file format generated by lyx 1.6"""
import unicodedata
import sys, os
-from parser_tools import find_token, find_end_of, find_tokens, get_value, get_value_string
+from parser_tools import find_token, find_end_of, find_tokens, get_value
####################################################################
# Private helper functions
+
+def get_value_string(lines, token, start, end = 0, trim = False, default = ""):
+ """ get_value_string(lines, token, start[[, end], trim, default]) -> string
+
+ Return tokens after token as string, in lines, where
+ token is the first element. When trim is used, the first and last character
+ of the string is trimmed."""
+
+ val = get_value(lines, token, start, end, "")
+ if not val:
+ return default
+ if trim:
+ return val[1:-1]
+ return val
+
+
def find_end_of_inset(lines, i):
" Find end of inset, where lines[i] is included."
return find_end_of(lines, i, "\\begin_inset", "\\end_inset")
# DO NOT do this:
# document.body[i] = wrap_insert_ert(...)
# wrap_into_ert may returns a multiline string, which should NOT appear
-# in document.body. Insetad, do something like this:
+# in document.body. Instead, do something like this:
# subst = wrap_inset_ert(...)
# subst = subst.split('\n')
# document.body[i:i+1] = subst
return (line[:pos + 1], line[pos + 1:])
-def latex2ert(line):
+def latex2ert(line, isindex):
'''Converts LaTeX commands into ERT. line may well be a multi-line
string when it is returned.'''
if not line:
# put all remaining braces in ERT
line = wrap_into_ert(line, '}', '}')
line = wrap_into_ert(line, '{', '{')
+ if isindex:
+ # active character that is not available in all font encodings
+ line = wrap_into_ert(line, '|', '|')
retval += line
return retval
#end up inside ERT. That routine could be modified so that it returned
#a list of lines, and we could then skip ERT bits and only deal with
#the other bits.
-def latex2lyx(data):
+def latex2lyx(data, isindex):
'''Takes a string, possibly multi-line, and returns the result of
converting LaTeX constructs into LyX constructs. Returns a list of
- lines, suitable for insertion into document.body.'''
+ lines, suitable for insertion into document.body.
+ The bool isindex specifies whether we are in an index macro (which
+ has some specific active characters that need to be ERTed).'''
if not data:
return [""]
g = m.group(3)
if s:
# this is non-math!
- s = latex2ert(s)
+ s = latex2ert(s, isindex)
subst = s.split('\n')
retval += subst
retval.append("\\begin_inset Formula " + f)
retval.append("\\end_inset")
m = mathre.match(g)
# Handle whatever is left, which is just text
- g = latex2ert(g)
+ g = latex2ert(g, isindex)
subst = g.split('\n')
retval += subst
return retval
j = find_end_of_inset(document.body, i + 1)
if j == -1:
document.warning("Malformed LyX document: Could not find end of tabular.")
+ i += 1
continue
nrows = int(document.body[i+1].split('"')[3])
j = find_end_of_inset(document.body, i + 1)
if j == -1:
document.warning("Malformed LyX document: Could not find end of tabular.")
+ i += 1
continue
m = i + 1
j = find_end_of_inset(document.body, i + 1)
if j == -1:
document.warning("Malformed LyX document: Could not find end of tabular.")
+ i += 1
continue
m = i + 1
i = find_token(document.body, "\\begin_inset Tabular", i)
if i == -1:
return
- j = find_end_of_inset(document.body, i + 1)
+ j = find_end_of_inset(document.body, i)
if j == -1:
document.warning("Malformed LyX document: Could not find end of tabular.")
+ i += 1
continue
m = i + 1
j = find_end_of_inset(document.body, i + 1)
if j == -1:
document.warning("Malformed LyX document: Could not find end of tabular.")
+ i += 1
continue
m = i + 1
document.body[i] = document.body[i].replace('\\begin_inset CharStyle', '\\begin_inset Flex')
def revert_flex(document):
- "Convert Flex to CharStyle"
+ "Revert Flex to CharStyle"
i = 0
while True:
i = find_token(document.body, "\\begin_inset Flex", i)
if j == -1:
# should not happen
document.warning("Malformed LyX document: Could not find end of graphics inset.")
+ i += 1
+ continue
# If there's a inzip param, just remove that
k = find_token(document.body, "\tinzipName", i + 1, j)
if k != -1:
linelist = [""]
else:
fullcontent = m.group(1)
- linelist = latex2lyx(fullcontent)
+ linelist = latex2lyx(fullcontent, True)
#document.warning(fullcontent)
linelist = ["\\begin_inset Index", "status collapsed", "\\begin_layout Standard", ""] + \
if j == -1:
# should not happen
document.warning("Malformed LyX document: Could not find end of Info inset.")
+ i += 1
+ continue
type = 'unknown'
arg = ''
for k in range(i, j+1):
j = find_token(document.body, "target", i)
if j == -1:
document.warning("Malformed LyX document: Can't find target for url inset")
- i = j
+ i += 1
continue
target = document.body[j][8:-1]
k = find_token(document.body, "\\end_inset", j)
if k == -1:
document.warning("Malformed LyX document: Can't find end of url inset")
- i = k
+ i = j
continue
newstuff = ["\\begin_inset Flex URL",
"status collapsed", "",
"\\end_layout",
""]
document.body[i:k] = newstuff
- i = k
+ i = i + len(newstuff)
def convert_ams_classes(document):
tc = document.textclass
"Remove TeX code command \global when it is in front of a macro"
# math macros are nowadays already defined \global, so that an additional
# \global would make the document uncompilable, see
- # http://bugzilla.lyx.org/show_bug.cgi?id=5371
+ # http://www.lyx.org/trac/ticket/5371
# We're looking for something like this:
# \begin_inset ERT
# status collapsed
return
newmodlist = []
for mod in modlist:
- if modulemap.has_key(mod):
+ if mod in modulemap:
newmodlist.append(modulemap[mod])
else:
document.warning("Can't find module %s in the module map!" % mod)
if j == -1:
# should not happen
document.warning("Malformed LyX document: Could not find end of Box inset.")
+ i += 1
+ continue
k = find_token(document.body, "status", i + 1, j)
if k == -1:
document.warning("Malformed LyX document: Missing `status' tag in Box inset.")
- return
+ i = j
+ continue
status = document.body[k]
l = find_default_layout(document, i + 1, j)
if l == -1:
document.warning("Malformed LyX document: Missing `\\begin_layout' in Box inset.")
- return
+ i = j
+ continue
m = find_token(document.body, "\\end_layout", i + 1, j)
if m == -1:
document.warning("Malformed LyX document: Missing `\\end_layout' in Box inset.")
- return
+ i = j
+ continue
ibox = find_token(document.body, "has_inner_box 1", i + 1, k)
pbox = find_token(document.body, "use_parbox 1", i + 1, k)
if ibox == -1 and pbox == -1:
j = find_token(document.header, "\\use_amsmath", 0)
if j == -1:
document.warning("Malformed LyX document: Missing '\\use_amsmath'.")
- return
+ i += 1
+ continue
document.header[j] = "\\use_amsmath 2"
else:
i = i + 1
l = find_default_layout(document, i + 1, j)
if l == -1:
document.warning("Malformed LyX document: Missing `\\begin_layout' in Float inset.")
- return
+ i = j
+ continue
subst = ['\\begin_layout Standard',
'\\begin_inset ERT',
'status collapsed', '',
l = find_default_layout(document, i + 1, j)
if l == -1:
document.warning("Malformed LyX document: Missing `\\begin_layout' in Float inset.")
- return
+ i = j
+ continue
subst = ['\\begin_layout Standard', '\\begin_inset ERT',
'status collapsed', '',
'\\begin_layout Standard', '', '', '\\backslash',
addedLines -= 1
subst = ['\\begin_inset Float figure', 'wide false', 'sideways false',
'status open', '', '\\begin_layout Plain Layout', '\\begin_inset Caption',
- '', '\\begin_layout Plain Layout'] + latex2lyx(caption) + \
+ '', '\\begin_layout Plain Layout'] + latex2lyx(caption, False) + \
[ '\\end_layout', '', '\\end_inset', '',
'\\end_layout', '', '\\begin_layout Plain Layout']
document.body[i : i] = subst
if opt != -1:
optend = find_end_of_inset(document.body, opt)
if optend == -1:
- document.warning("Malformed lyx document: Missing '\\end_inset' (OptArg).")
+ document.warning("Malformed LyX document: Missing '\\end_inset' (OptArg).")
return
optc = find_default_layout(document, opt, optend)
if optc == -1:
j = find_end_of_inset(document.body, i)
if j == -1:
document.warning("Malformed LyX document: Could not find end of space inset.")
+ i += 1
continue
document.body[i] = document.body[i].replace('\\begin_inset Space', '\\InsetSpace')
del document.body[j]
j = find_end_of_inset(document.body, i)
if j == -1:
document.warning("Malformed LyX document: Could not find end of space inset.")
+ i += 1
continue
del document.body[j]
subst = document.body[i].replace('\\begin_inset Space \\hspace*{\\fill}', \
j = find_end_of_inset(document.body, i)
if j == -1:
document.warning("Malformed LyX document: Could not find end of space inset.")
+ i += 1
continue
del document.body[j]
subst = document.body[i].replace('\\begin_inset Space \\leftarrowfill{}', \
j = find_end_of_inset(document.body, i)
if j == -1:
document.warning("Malformed LyX document: Could not find end of space inset.")
+ i += 1
continue
del document.body[j]
subst = document.body[i].replace('\\begin_inset Space \\rightarrowfill{}', \
j = find_end_of_inset(document.body, i)
if j == -1:
document.warning("Malformed LyX document: Could not find end of space inset.")
+ i += 1
continue
del document.body[j]
subst = document.body[i].replace('\\begin_inset Space \\upbracefill{}', \
j = find_end_of_inset(document.body, i)
if j == -1:
document.warning("Malformed LyX document: Could not find end of space inset.")
+ i += 1
continue
del document.body[j]
subst = document.body[i].replace('\\begin_inset Space \\downbracefill{}', \
j = find_end_of_inset(document.body, i)
if j == -1:
document.warning("Malformed LyX document: Could not find end of Newpage inset.")
+ i += 1
continue
del document.body[j]
document.body[i] = document.body[i].replace('\\begin_inset Newpage newpage', '\\newpage')
j = find_end_of_inset(document.body, i)
if j == -1:
document.warning("Malformed LyX document: Could not find end of Newline inset.")
+ i += 1
continue
del document.body[j]
document.body[i] = document.body[i].replace('\\begin_inset Newline newline', '\\newline')
def convert_paper_sizes(document):
' exchange size options legalpaper and executivepaper to correct order '
- # routine is needed to fix http://bugzilla.lyx.org/show_bug.cgi?id=4868
+ # routine is needed to fix http://www.lyx.org/trac/ticket/4868
i = 0
j = 0
i = find_token(document.header, "\\papersize executivepaper", 0)