return l
+def read_unicodesymbols():
+ " Read the unicodesymbols list of unicode characters and corresponding commands."
+ pathname = os.path.abspath(os.path.dirname(sys.argv[0]))
+ fp = open(os.path.join(pathname.strip('lyx2lyx'), 'unicodesymbols'))
+ spec_chars = []
+ # Two backslashes, followed by some non-word character, and then a character
+ # in brackets. The idea is to check for constructs like: \"{u}, which is how
+ # they are written in the unicodesymbols file; but they can also be written
+ # as: \"u.
+ r = re.compile(r'\\\\(\W)\{(\w)\}')
+ for line in fp.readlines():
+ if line[0] != '#' and line.strip() != "" and line.find("\\") != -1:
+ line=line.replace(' "',' ') # remove all quotation marks with spaces before
+ line=line.replace('" ',' ') # remove all quotation marks with spaces after
+ line=line.replace(r'\"','"') # replace \" by " (for characters with diaeresis)
+ try:
+ [ucs4,command,dead] = line.split(None,2)
+ spec_chars.append([command, unichr(eval(ucs4))])
+ except:
+ continue
+ m = r.match(command)
+ if m != None:
+ command = "\\\\"
+ # If the character is a double-quote, then we need to escape it, too,
+ # since it is done that way in the LyX file.
+ if m.group(1) == "\"":
+ command += "\\"
+ command += m.group(1) + m.group(2)
+ spec_chars.append([command, unichr(eval(ucs4))])
+ fp.close()
+ return spec_chars
+
+
+def latex2lyx(data):
+ '''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.'''
+
+ mathre = re.compile('^(.*?)(\$.*?\$)(.*)')
+ retval = []
+
+ # Convert LaTeX to Unicode
+ reps = read_unicodesymbols()
+ for rep in reps:
+ try:
+ data = data.replace(rep[0], rep[1])
+ except:
+ # There seems to be a character in the unicodesymbols file
+ # that causes problems, namely, 0x2109.
+ pass
+ # Generic, \" -> ":
+ data = wrap_into_ert(data, r'\"', '"')
+ # Math:
+ lines = data.split('\n')
+ for line in lines:
+ #document.warning("LINE: " + line)
+ #document.warning(str(i) + ":" + document.body[i])
+ #document.warning("LAST: " + document.body[-1])
+ g = line
+ m = mathre.match(g)
+ if m == None:
+ g = wrap_into_ert(g, '\\', '\\backslash')
+ g = wrap_into_ert(g, '{', '{')
+ g = wrap_into_ert(g, '}', '}')
+ subst = g.split('\n')
+ retval += subst
+ continue
+ while m != None:
+ s = m.group(1)
+ f = m.group(2).replace('\\\\', '\\')
+ g = m.group(3)
+ if s:
+ # this is non-math!
+ s = wrap_into_ert(s, '\\', '\\backslash')
+ s = wrap_into_ert(s, '{', '{')
+ s = wrap_into_ert(s, '}', '}')
+ subst = s.split('\n')
+ retval += subst
+ retval.append("\\begin_inset Formula " + f)
+ retval.append("\\end_inset")
+ m = mathre.match(g)
+ # Generic, \\ -> \backslash:
+ g = wrap_into_ert(g, r'\\', '\\backslash')
+ g = wrap_into_ert(g, '{', '{')
+ g = wrap_into_ert(g, '}', '}')
+ subst = g.split('\n')
+ retval += subst
+ return retval
+
+
####################################################################
def convert_ltcaption(document):
i = k
-# To convert and revert indices, we need to convert between LaTeX
-# strings and LyXText. Here we do a minimal conversion to prevent
-# crashes and data loss. Manual patch-up may be needed.
-replacements = [
- [r'\\\"a', u'ä'],
- [r'\\\"o', u'ö'],
- [r'\\\"u', u'ü'],
- [r'\\\'a', u'á'],
- [r'\\\'e', u'é'],
- [r'\\\'i', u'í'],
- [r'\\\'o', u'ó'],
- [r'\\\'u', u'ú']
-]
-
def convert_latexcommand_index(document):
"Convert from LatexCommand form to collapsable form."
i = 0
+ r1 = re.compile('name "(.*)"')
while True:
i = find_token(document.body, "\\begin_inset CommandInset index", i)
if i == -1:
return
if document.body[i + 1] != "LatexCommand index": # Might also be index_print
return
- fullcontent = document.body[i + 2][5:]
- fullcontent.strip()
- fullcontent = fullcontent[1:-1]
+ m = r1.match(document.body[i + 2])
+ if m == None:
+ document.warning("Unable to match: " + document.body[i+2])
+ i += 1
+ continue
+ fullcontent = m.group(1)
+ #document.warning(fullcontent)
document.body[i:i + 3] = ["\\begin_inset Index",
"status collapsed",
"\\begin_layout Standard"]
# We are now on the blank line preceding "\end_inset"
# We will write the content here, into the inset.
- # Do the LaTeX --> LyX text conversion
- for rep in replacements:
- fullcontent = fullcontent.replace(rep[0], rep[1])
- # Generic, \" -> ":
- fullcontent = wrap_into_ert(fullcontent, r'\"', '"')
- # Math:
- r = re.compile('^(.*?)(\$.*?\$)(.*)')
- lines = fullcontent.split('\n')
- for line in lines:
- #document.warning("LINE: " + line)
- #document.warning(str(i) + ":" + document.body[i])
- #document.warning("LAST: " + document.body[-1])
- g = line
- while r.match(g):
- m = r.match(g)
- s = m.group(1)
- f = m.group(2).replace('\\\\', '\\')
- g = m.group(3)
- if s:
- # this is non-math!
- s = wrap_into_ert(s, r'\\', '\\backslash')
- s = wrap_into_ert(s, '{', '{')
- s = wrap_into_ert(s, '}', '}')
- subst = s.split('\n')
- document.body[i:i] = subst
- i += len(subst)
- document.body.insert(i + 1, "\\begin_inset Formula " + f)
- document.body.insert(i + 2, "\\end_inset")
- i += 2
- # Generic, \\ -> \backslash:
- g = wrap_into_ert(g, r'\\', '\\backslash')
- g = wrap_into_ert(g, '{', '{')
- g = wrap_into_ert(g, '}', '}')
- subst = g.split('\n')
- document.body[i+1:i+1] = subst
- i += len(subst)
+ linelist = latex2lyx(fullcontent)
+ document.body[i+1:i+1] = linelist
+ i += len(linelist)
+
document.body.insert(i + 1, "\\end_layout")
+ i += 1
def revert_latexcommand_index(document):
i = 0
r0 = re.compile('preview.*')
r1 = re.compile('LatexCommand (.+)')
- r2 = re.compile('filename (.+)')
- r3 = re.compile('options (.*)')
+ r2 = re.compile('filename "(.+)"')
+ r3 = re.compile('lstparams "(.*)"')
while True:
i = find_token(document.body, "\\begin_inset CommandInset include", i)
if i == -1:
revert_inset_embedding(document, 'External')
-# FIXME This code can still be cleaned up a fair bit.
def convert_subfig(document):
" Convert subfigures to subfloats. "
i = 0
continue
k = find_token(document.body, '\tsubcaption', i, endInset)
if k == -1:
- i += 1
+ i = endInset
continue
l = find_token(document.body, '\tsubcaptionText', i, endInset)
+ if l == -1:
+ document.warning("Malformed lyx document: Can't find subcaptionText!")
+ i = endInset
+ continue
caption = document.body[l][16:].strip('"')
- savestr = document.body[i]
- laststr = document.body[endInset]
del document.body[l]
del document.body[k]
addedLines = -2
- # savestr should no longer be needed here.
subst = ['\\begin_inset Float figure', 'wide false', 'sideways false',
'status open', '', '\\begin_layout Plain Layout', '\\begin_inset Caption',
- '', '\\begin_layout Plain Layout',
- caption, '\\end_layout', '', '\\end_inset', '',
- '\\end_layout', '', '\\begin_layout Plain Layout', savestr]
- document.body[i : i+1] = subst
- addedLines += len(subst) - 1
+ '', '\\begin_layout Plain Layout'] + latex2lyx(caption) + \
+ [ '\\end_layout', '', '\\end_inset', '',
+ '\\end_layout', '', '\\begin_layout Plain Layout']
+ document.body[i : i] = subst
+ addedLines += len(subst)
endInset += addedLines
- # There should be an easier way to do this.
- subst = ['', '\\end_inset', '', '\\end_layout', laststr]
- document.body[endInset : endInset+1] = subst
- addedLines += len(subst) - 1
+ subst = ['', '\\end_inset', '', '\\end_layout']
+ document.body[endInset : endInset] = subst
+ addedLines += len(subst)
i += addedLines + 1
insertion = insertion.split('\n')
document.body[k : k + 1] = insertion
addedLines += len(insertion) - 1
- add_to_preamble(document,
- ['\\usepackage{subfig}\n'])
+ add_to_preamble(document, ['\\usepackage{subfig}\n'])
i += addedLines + 1