commit a80da13cc1f0af6faa9e73cf23b664fbd732bb05
Author: Juergen Spitzmueller <[email protected]>
Date:   Sun Dec 27 12:48:11 2015 +0100

    Rewrite and split the moderncv conversion routine.
    
    This fixes several conversion problems, amongst others the redundant
    \end_layout reported by Kornel.

diff --git a/lib/lyx2lyx/lyx_2_2.py b/lib/lyx2lyx/lyx_2_2.py
index 54c97ac..43389d4 100644
--- a/lib/lyx2lyx/lyx_2_2.py
+++ b/lib/lyx2lyx/lyx_2_2.py
@@ -1910,72 +1910,100 @@ def revert_moderncv_2(document):
     i += 1
 
 
-def convert_moderncv(document):
-  " Convert the Fax and Mobile inset of moderncv to the new phone inset "
-  
-  if document.textclass != "moderncv":
-    return
-  i = 0
-  j = 0
-  lineArg = 0
-  while True:
-    # \mobile
-    i = find_token(document.body, "\\begin_layout Mobile", i)
-    if i == -1:
-      return
-    j = find_end_of_layout(document.body, i)
-    if j == -1:
-      document.warning("Malformed LyX document: Can't find end of Mobile 
layout")
-      i += 1
-      return
-    document.body[i + 1 : i + 1] = ["\\begin_inset Argument 1", "status open", 
"",
-                        "\\begin_layout Plain Layout", "mobile", 
"\\end_layout", "",
-                        "\\end_inset", ""]
-    # \fax
-    i = find_token(document.body, "\\begin_layout Fax", i)
-    if i == -1:
-      return
-    j = find_end_of_layout(document.body, i)
-    if j == -1:
-      document.warning("Malformed LyX document: Can't find end of Fax layout")
-      i += 1
-      return
-    document.body[i + 1 : i + 1] = ["\\begin_inset Argument 1", "status open", 
"",
-                        "\\begin_layout Plain Layout", "fax", "\\end_layout", 
"",
-                        "\\end_inset", ""]
-    # \firstname and \familyname
-    i1 = find_token(document.body, "\\begin_layout FirstName", 0)
-    if i1 == -1:
-      return
-    j1 = find_end_of_layout(document.body, i1)
-    if j1 == -1:
-      document.warning("Malformed LyX document: Can't find end of FirstName 
layout")
-      i1 += 1
-      return
-    FirstName = document.body[i1 + 1 : i1 + 2]
-    i2 = find_token(document.body, "\\begin_layout FamilyName", 0)
-    if i2 == -1:
-      return
-    j2 = find_end_of_layout(document.body, i2)
-    if j2 == -1:
-      document.warning("Malformed LyX document: Can't find end of FamilyName 
layout")
-      i2 += 1
-      return
-    FamilyName = document.body[i2 + 1 : i2 + 2]
-    if j1 > j2:
-      k = j1
-      l = i2
-    else:
-      k = j2
-      l = i1
-    document.body[k + 1 : k + 1] = ["\\begin_layout Name", "\\begin_inset 
Argument 1", "status open", "",
-                        "\\begin_layout Plain Layout", FirstName[0], 
"\\end_layout", "",
-                        "\\end_inset", "", FamilyName[0], "\\end_layout", ""]
-    #document.body[i2 + 1 : i2 + 1] = ["hellok: ", str(k)]
-    del(document.body[l : k])
-    i += 1
-    i1 += 1
-    i2 += 1
+def convert_moderncv_phone(document):
+    " Convert the Fax and Mobile inset of moderncv to the new phone inset "
+
+    if document.textclass != "moderncv":
+        return
+    i = 0
+    j = 0
+    lineArg = 0
+
+    phone_dict = {
+        "Mobile" : "mobile",
+        "Fax" : "fax",
+        }
+
+    rx = re.compile(r'^\\begin_layout (\S+)$')
+    while True:
+        # substitute \fax and \mobile by \phone[fax] and \phone[mobile], 
respectively
+        i = find_token(document.body, "\\begin_layout", i)
+        if i == -1:
+            return
+
+        m = rx.match(document.body[i])
+        val = ""
+        if m:
+            val = m.group(1)
+        if val not in list(phone_dict.keys()):
+            i += 1
+            continue
+        j = find_end_of_layout(document.body, i)
+        if j == -1:
+            document.warning("Malformed LyX document: Can't find end of Mobile 
layout")
+            i += 1
+            return
+
+        document.body[i : i + 1] = ["\\begin_layout Phone", "\\begin_inset 
Argument 1", "status open", "",
+                            "\\begin_layout Plain Layout", phone_dict[val], 
"\\end_layout", "",
+                            "\\end_inset", ""]
+
+
+def convert_moderncv_name(document):
+    " Convert the FirstName and LastName layout of moderncv to the general 
Name layout "
+
+    if document.textclass != "moderncv":
+        return
+
+    fnb = 0 # Begin of FirstName inset
+    fne = 0 # End of FirstName inset
+    lnb = 0 # Begin of LastName (FamilyName) inset
+    lne = 0 # End of LastName (FamilyName) inset
+    nb = 0 # Begin of substituting Name inset
+    ne = 0 # End of substituting Name inset
+    FirstName = [] # FirstName content
+    FamilyName = [] # LastName content
+
+    while True:
+        # locate FirstName
+        fnb = find_token(document.body, "\\begin_layout FirstName", fnb)
+        if fnb != -1:
+            fne = find_end_of_layout(document.body, fnb)
+            if fne == -1:
+                document.warning("Malformed LyX document: Can't find end of 
FirstName layout")
+                return
+            FirstName = document.body[fnb + 1 : fne]
+        # locate FamilyName
+        lnb = find_token(document.body, "\\begin_layout FamilyName", lnb)
+        if lnb != -1:
+            lne = find_end_of_layout(document.body, lnb)
+            if lne == -1:
+                document.warning("Malformed LyX document: Can't find end of 
FamilyName layout")
+                return
+            FamilyName = document.body[lnb + 1 : lne]
+        # Determine the region for the substituting Name layout
+        if fnb == -1 and lnb == -1: # Neither FirstName nor FamilyName exists 
-> Do nothing
+            return
+        elif fnb == -1: # Only FamilyName exists -> New Name insets replaces 
that
+            nb = lnb
+            ne = lne
+        elif lnb == -1: # Only FirstName exists -> New Name insets replaces 
that
+            nb = fnb
+            ne = fne
+        elif fne > lne: # FirstName position before FamilyName -> New Name 
insets spans
+            nb = lnb #     from FamilyName begin
+            ne = fne #     to FirstName end
+        else: #           FirstName position before FamilyName -> New Name 
insets spans
+            nb = fnb #     from FirstName begin
+            ne = lne #     to FamilyName end
+
+        # Insert the substituting layout now. If FirstName exists, use an 
otpional argument.
+        if FirstName == []:
+            document.body[nb : ne + 1] = ["\\begin_layout Name"] + FamilyName 
+ ["\\end_layout", ""]
+        else:
+            document.body[nb : ne + 1] = ["\\begin_layout Name", 
"\\begin_inset Argument 1", "status open", "",
+                                "\\begin_layout Plain Layout"] + FirstName + 
["\\end_layout", "",
+                                "\\end_inset", ""] + FamilyName + 
["\\end_layout", ""]
 
 
 def revert_achemso(document):
@@ -2180,7 +2208,7 @@ convert = [
            [496, [convert_nounzip]],
            [497, [convert_external_bbox]],
            [498, []],
-           [499, [convert_moderncv]],
+           [499, [convert_moderncv_phone, convert_moderncv_name]],
            [500, []],
            [501, [convert_fontsettings]],
            [502, []],

Reply via email to