Browse Source

Merge pull request #11 from TypeNetwork/fea-fix-anchors-v2

Fea fix anchors v2
CJ Dunn 6 years ago
parent
commit
3580c80490

+ 1012 - 0
Scripts/anchorFix.py

@@ -0,0 +1,1012 @@
+"""
+Fix glyph anchors for Roboto VF.
+
+Script uses lxml since ufoLib rearranges data.
+
+The script will do the following:
+
+1. Deletes anchors used for design puposes e.g making glyphs built with
+   components
+2. Renames anchors so no custom MarkWriterFeature is needed for fontmake
+3. Ensures each mark glyph only has 1 anchor which starts with an '_'
+"""
+from __future__ import print_function
+import sys
+from lxml import etree
+import copy
+import os
+from glob import glob
+
+
+DUPLICATE_ANCHOR_GLYPHS = [
+    "A",
+    "A",
+    "A.smcp",
+    "A.smcp",
+    "A.unic",
+    "A.unic",
+    "AE",
+    "AE",
+    "AE.smcp",
+    "AE.smcp",
+    "B",
+    "B",
+    "B.smcp",
+    "B.smcp",
+    "C",
+    "C",
+    "C.smcp",
+    "C.smcp",
+    "D",
+    "D",
+    "D.smcp",
+    "D.smcp",
+    "E",
+    "E",
+    "E.smcp",
+    "E.smcp",
+    "E.unic",
+    "E.unic",
+    "Eng",
+    "Eng",
+    "Eng.smcp",
+    "Eng.smcp",
+    "Epsilon1",
+    "Epsilon1",
+    "Esh",
+    "Esh",
+    "F",
+    "F",
+    "F.smcp",
+    "F.smcp",
+    "G",
+    "G",
+    "G.smcp",
+    "G.smcp",
+    "Gamma",
+    "Gamma",
+    "Gamma.smcp",
+    "Gamma.smcp",
+    "Gbar",
+    "Gbar",
+    "Gsmallcap",
+    "Gsmallcap",
+    "Gsmallcaphook",
+    "Gsmallcaphook",
+    "H",
+    "H",
+    "H.smcp",
+    "H.smcp",
+    "Hbar",
+    "Hbar",
+    "Hbar.smcp",
+    "Hbar.smcp",
+    "I",
+    "I",
+    "I.smcp",
+    "I.smcp",
+    "Ibar",
+    "Ibar",
+    "Ismallcap",
+    "Ismallcap",
+    "J",
+    "J",
+    "J.smcp",
+    "J.smcp",
+    "K",
+    "K",
+    "K.smcp",
+    "K.smcp",
+    "L",
+    "L",
+    "L.smcp",
+    "L.smcp",
+    "Lslash",
+    "Lslash",
+    "Lslash.smcp",
+    "Lslash.smcp",
+    "Lsmallcap",
+    "Lsmallcap",
+    "M",
+    "M",
+    "M.smcp",
+    "M.smcp",
+    "M.unic",
+    "M.unic",
+    "N",
+    "N",
+    "N.smcp",
+    "N.smcp",
+    "N.unic",
+    "N.unic",
+    "Nsmallcap",
+    "Nsmallcap",
+    "O",
+    "O",
+    "O.smcp",
+    "O.smcp",
+    "OE",
+    "OE",
+    "OEsmallcap",
+    "OEsmallcap",
+    "Ohorn",
+    "Ohorn",
+    "Oslash",
+    "Oslash",
+    "Oslash.smcp",
+    "Oslash.smcp",
+    "P",
+    "P",
+    "P.smcp",
+    "P.smcp",
+    "Q",
+    "Q",
+    "Q.smcp",
+    "Q.smcp",
+    "R",
+    "R",
+    "R.alt",
+    "R.alt",
+    "R.smcp",
+    "R.smcp",
+    "Rsmallcap",
+    "Rsmallcap",
+    "Rsmallcapinv",
+    "Rsmallcapinv",
+    "S",
+    "S",
+    "S.smcp",
+    "S.smcp",
+    "Schwa",
+    "Schwa",
+    "T",
+    "T",
+    "T.smcp",
+    "T.smcp",
+    "Thorn.smcp",
+    "Thorn.smcp",
+    "U",
+    "U",
+    "U.smcp",
+    "U.smcp",
+    "U.unic",
+    "U.unic",
+    "Uhorn",
+    "Uhorn",
+    "V",
+    "V",
+    "V.smcp",
+    "V.smcp",
+    "W",
+    "W",
+    "W.smcp",
+    "W.smcp",
+    "X",
+    "X",
+    "X.smcp",
+    "X.smcp",
+    "Y",
+    "Y",
+    "Y.smcp",
+    "Y.smcp",
+    "Ysmallcap",
+    "Ysmallcap",
+    "Z",
+    "Z",
+    "Z.smcp",
+    "Z.smcp",
+    "Zbar",
+    "Zbar",
+    "a",
+    "a",
+    "a_uni02DE",
+    "a_uni02DE",
+    "ae",
+    "ae",
+    "alpha",
+    "alpha",
+    "ascript",
+    "ascript",
+    "ascriptturn",
+    "ascriptturn",
+    "aturn",
+    "aturn",
+    "b",
+    "b",
+    "babygamma",
+    "babygamma",
+    "bbar",
+    "bbar",
+    "bbar_uni1ABE",
+    "bbar_uni1ABE",
+    "bhook",
+    "bhook",
+    "bullseye",
+    "bullseye",
+    "c",
+    "c",
+    "ccurl",
+    "ccurl",
+    "cstretch",
+    "cstretch",
+    "d",
+    "d",
+    "dcroat",
+    "dcroat",
+    "dcroat_uni1ABE",
+    "dcroat_uni1ABE",
+    "dhook",
+    "dhook",
+    "dotlessi",
+    "dotlessi",
+    "drthook",
+    "drthook",
+    "dyogh",
+    "dyogh",
+    "dz",
+    "dz",
+    "dzcurl",
+    "dzcurl",
+    "e",
+    "e",
+    "eng",
+    "eng",
+    "eng_uni1ABE",
+    "eng_uni1ABE",
+    "epsilon",
+    "epsilon",
+    "epsilon1",
+    "epsilon1",
+    "epsilon1rev",
+    "epsilon1rev",
+    "epsilon1revclosed",
+    "epsilon1revclosed",
+    "epsilon1revhook",
+    "epsilon1revhook",
+    "epsilonclosed",
+    "epsilonclosed",
+    "erev",
+    "erev",
+    "esh",
+    "esh",
+    "eshcurl",
+    "eshcurl",
+    "eshshortrev",
+    "eshshortrev",
+    "eta",
+    "eta",
+    "f",
+    "f",
+    "finalkaf",
+    "finalkaf",
+    "finalmem",
+    "finalmem",
+    "finalnun",
+    "finalnun",
+    "g",
+    "g",
+    "gamma1",
+    "gamma1",
+    "gbar",
+    "gbar",
+    "gbar_uni1ABE",
+    "gbar_uni1ABE",
+    "gcursive",
+    "gcursive",
+    "ghook",
+    "ghook",
+    "glottalstop",
+    "glottalstop",
+    "glottalstopbar",
+    "glottalstopbar",
+    "glottalstopbarrev",
+    "glottalstopbarrev",
+    "glottalstopinv",
+    "glottalstopinv",
+    "glottalstoprevinv",
+    "glottalstoprevinv",
+    "h",
+    "h",
+    "henghook",
+    "henghook",
+    "hhook",
+    "hhook",
+    "hturn",
+    "hturn",
+    "i",
+    "i",
+    "ibar",
+    "ibar",
+    "iota",
+    "iota",
+    "iota1",
+    "iota1",
+    "j",
+    "j",
+    "jcrosstail",
+    "jcrosstail",
+    "jdotlessbar",
+    "jdotlessbar",
+    "jhookdblbar",
+    "jhookdblbar",
+    "k",
+    "k",
+    "k.alt",
+    "k.alt",
+    "kgreenlandic",
+    "kgreenlandic",
+    "kturn",
+    "kturn",
+    "l",
+    "l",
+    "lbar",
+    "lbar",
+    "lbelt",
+    "lbelt",
+    "lmidtilde",
+    "lmidtilde",
+    "longs",
+    "longs",
+    "lrthook",
+    "lrthook",
+    "lslash",
+    "lslash",
+    "lyogh",
+    "lyogh",
+    "m",
+    "m",
+    "mhook",
+    "mhook",
+    "mturn",
+    "mturn",
+    "mturndescend",
+    "mturndescend",
+    "n",
+    "n",
+    "nlfthook",
+    "nlfthook",
+    "nrthook",
+    "nrthook",
+    "o",
+    "o",
+    "oe",
+    "oe",
+    "ohorn",
+    "ohorn",
+    "omega",
+    "omega",
+    "omegaclosed",
+    "omegaclosed",
+    "oopen",
+    "oopen",
+    "oslash",
+    "oslash",
+    "p",
+    "p",
+    "philatin",
+    "philatin",
+    "psi",
+    "psi",
+    "q",
+    "q",
+    "qhook",
+    "qhook",
+    "r",
+    "r",
+    "rdescend",
+    "rdescend",
+    "rfishhook",
+    "rfishhook",
+    "rfishhookrev",
+    "rfishhookrev",
+    "rho",
+    "rho",
+    "rrthook",
+    "rrthook",
+    "rturn",
+    "rturn",
+    "rturnascend",
+    "rturnascend",
+    "rturnrthook",
+    "rturnrthook",
+    "s",
+    "s",
+    "schwa",
+    "schwa",
+    "schwahook",
+    "schwahook",
+    "srthook",
+    "srthook",
+    "t",
+    "t",
+    "tccurl",
+    "tccurl",
+    "tesh",
+    "tesh",
+    "trthook",
+    "trthook",
+    "ts",
+    "ts",
+    "tturn",
+    "tturn",
+    "u",
+    "u",
+    "ubar",
+    "ubar",
+    "uhorn",
+    "uhorn",
+    "uni0069.ccmp",
+    "uni0069.ccmp",
+    "uni006A.ccmp",
+    "uni006A.ccmp",
+    "uni012F.ccmp",
+    "uni012F.ccmp",
+    "uni0237",
+    "uni0237",
+    "uni023D",
+    "uni023D",
+    "uni0243",
+    "uni0243",
+    "uni0244",
+    "uni0244",
+    "uni0248",
+    "uni0248",
+    "uni0249",
+    "uni0249",
+    "uni0249.ccmp",
+    "uni0249.ccmp",
+    "uni024C",
+    "uni024C",
+    "uni024D",
+    "uni024D",
+    "uni024E",
+    "uni024E",
+    "uni024F",
+    "uni024F",
+    "uni0268.ccmp",
+    "uni0268.ccmp",
+    "uni0292",
+    "uni0292",
+    "uni0293",
+    "uni0293",
+    "uni029D.ccmp",
+    "uni029D.ccmp",
+    "uni02A9",
+    "uni02A9",
+    "uni02AB",
+    "uni02AB",
+    "uni02AC",
+    "uni02AC",
+    "uni02AE",
+    "uni02AE",
+    "uni02B2.ccmp",
+    "uni02B2.ccmp",
+    "uni03D2",
+    "uni03D2",
+    "uni03D6",
+    "uni03D6",
+    "uni03F3.ccmp",
+    "uni03F3.ccmp",
+    "uni0404",
+    "uni0404",
+    "uni0404.smcp",
+    "uni0404.smcp",
+    "uni0416",
+    "uni0416",
+    "uni0416.smcp",
+    "uni0416.smcp",
+    "uni0417",
+    "uni0417",
+    "uni0417.smcp",
+    "uni0417.smcp",
+    "uni0418",
+    "uni0418",
+    "uni0418.smcp",
+    "uni0418.smcp",
+    "uni0423",
+    "uni0423",
+    "uni0423.smcp",
+    "uni0423.smcp",
+    "uni0427",
+    "uni0427",
+    "uni0427.smcp",
+    "uni0427.smcp",
+    "uni042B",
+    "uni042B",
+    "uni042B.smcp",
+    "uni042B.smcp",
+    "uni042D",
+    "uni042D",
+    "uni042D.smcp",
+    "uni042D.smcp",
+    "uni042E",
+    "uni042E",
+    "uni042E.smcp",
+    "uni042E.smcp",
+    "uni042F",
+    "uni042F",
+    "uni042F.smcp",
+    "uni042F.smcp",
+    "uni0432",
+    "uni0432",
+    "uni0433",
+    "uni0433",
+    "uni0434",
+    "uni0434",
+    "uni0436",
+    "uni0436",
+    "uni0437",
+    "uni0437",
+    "uni0438",
+    "uni0438",
+    "uni043A",
+    "uni043A",
+    "uni043B",
+    "uni043B",
+    "uni043C",
+    "uni043C",
+    "uni043D",
+    "uni043D",
+    "uni043F",
+    "uni043F",
+    "uni0442",
+    "uni0442",
+    "uni0444",
+    "uni0444",
+    "uni0446",
+    "uni0446",
+    "uni0447",
+    "uni0447",
+    "uni0448",
+    "uni0448",
+    "uni0449",
+    "uni0449",
+    "uni044B",
+    "uni044B",
+    "uni044D",
+    "uni044D",
+    "uni044E",
+    "uni044E",
+    "uni044F",
+    "uni044F",
+    "uni0454",
+    "uni0454",
+    "uni0456.ccmp",
+    "uni0456.ccmp",
+    "uni0458.ccmp",
+    "uni0458.ccmp",
+    "uni0460",
+    "uni0460",
+    "uni0461",
+    "uni0461",
+    "uni046F",
+    "uni046F",
+    "uni0472",
+    "uni0472",
+    "uni0473",
+    "uni0473",
+    "uni0474",
+    "uni0474",
+    "uni0475",
+    "uni0475",
+    "uni047B",
+    "uni047B",
+    "uni047F",
+    "uni047F",
+    "uni0480",
+    "uni0480",
+    "uni0481",
+    "uni0481",
+    "uni048A",
+    "uni048A",
+    "uni048B",
+    "uni048B",
+    "uni04A8",
+    "uni04A8",
+    "uni04A8.smcp",
+    "uni04A8.smcp",
+    "uni04A9",
+    "uni04A9",
+    "uni04BA",
+    "uni04BA",
+    "uni04BA.smcp",
+    "uni04BA.smcp",
+    "uni04D8",
+    "uni04D8",
+    "uni04D8.smcp",
+    "uni04D8.smcp",
+    "uni04E8.smcp",
+    "uni04E8.smcp",
+    "uni0504",
+    "uni0504",
+    "uni0506",
+    "uni0506",
+    "uni050A",
+    "uni050A",
+    "uni050C",
+    "uni050C",
+    "uni050D",
+    "uni050D",
+    "uni050E",
+    "uni050E",
+    "uni0510",
+    "uni0510",
+    "uni1D00",
+    "uni1D00",
+    "uni1D01",
+    "uni1D01",
+    "uni1D02",
+    "uni1D02",
+    "uni1D03",
+    "uni1D03",
+    "uni1D04",
+    "uni1D04",
+    "uni1D05",
+    "uni1D05",
+    "uni1D06",
+    "uni1D06",
+    "uni1D07",
+    "uni1D07",
+    "uni1D08",
+    "uni1D08",
+    "uni1D09",
+    "uni1D09",
+    "uni1D0A",
+    "uni1D0A",
+    "uni1D0B",
+    "uni1D0B",
+    "uni1D0C",
+    "uni1D0C",
+    "uni1D0D",
+    "uni1D0D",
+    "uni1D0E",
+    "uni1D0E",
+    "uni1D0F",
+    "uni1D0F",
+    "uni1D10",
+    "uni1D10",
+    "uni1D14",
+    "uni1D14",
+    "uni1D15",
+    "uni1D15",
+    "uni1D18",
+    "uni1D18",
+    "uni1D19",
+    "uni1D19",
+    "uni1D1A",
+    "uni1D1A",
+    "uni1D1B",
+    "uni1D1B",
+    "uni1D1C",
+    "uni1D1C",
+    "uni1D20",
+    "uni1D20",
+    "uni1D21",
+    "uni1D21",
+    "uni1D22",
+    "uni1D22",
+    "uni1D23",
+    "uni1D23",
+    "uni1D24",
+    "uni1D24",
+    "uni1D25",
+    "uni1D25",
+    "uni1D26",
+    "uni1D26",
+    "uni1D27",
+    "uni1D27",
+    "uni1D28",
+    "uni1D28",
+    "uni1D29",
+    "uni1D29",
+    "uni1D2A",
+    "uni1D2A",
+    "uni1D2B",
+    "uni1D2B",
+    "uni1D62.ccmp",
+    "uni1D62.ccmp",
+    "uni1D6B",
+    "uni1D6B",
+    "uni1D6C",
+    "uni1D6C",
+    "uni1D6D",
+    "uni1D6D",
+    "uni1D6E",
+    "uni1D6E",
+    "uni1D6F",
+    "uni1D6F",
+    "uni1D70",
+    "uni1D70",
+    "uni1D71",
+    "uni1D71",
+    "uni1D72",
+    "uni1D72",
+    "uni1D73",
+    "uni1D73",
+    "uni1D74",
+    "uni1D74",
+    "uni1D75",
+    "uni1D75",
+    "uni1D76",
+    "uni1D76",
+    "uni1D77",
+    "uni1D77",
+    "uni1D79",
+    "uni1D79",
+    "uni1D7A",
+    "uni1D7A",
+    "uni1D7C",
+    "uni1D7C",
+    "uni1D7D",
+    "uni1D7D",
+    "uni1D7E",
+    "uni1D7E",
+    "uni1D7F",
+    "uni1D7F",
+    "uni1D80",
+    "uni1D80",
+    "uni1D81",
+    "uni1D81",
+    "uni1D82",
+    "uni1D82",
+    "uni1D83",
+    "uni1D83",
+    "uni1D84",
+    "uni1D84",
+    "uni1D85",
+    "uni1D85",
+    "uni1D86",
+    "uni1D86",
+    "uni1D87",
+    "uni1D87",
+    "uni1D88",
+    "uni1D88",
+    "uni1D89",
+    "uni1D89",
+    "uni1D8A",
+    "uni1D8A",
+    "uni1D8B",
+    "uni1D8B",
+    "uni1D8C",
+    "uni1D8C",
+    "uni1D8D",
+    "uni1D8D",
+    "uni1D8E",
+    "uni1D8E",
+    "uni1D8F",
+    "uni1D8F",
+    "uni1D90",
+    "uni1D90",
+    "uni1D91",
+    "uni1D91",
+    "uni1D92",
+    "uni1D92",
+    "uni1D93",
+    "uni1D93",
+    "uni1D94",
+    "uni1D94",
+    "uni1D95",
+    "uni1D95",
+    "uni1D96",
+    "uni1D96",
+    "uni1D96.ccmp",
+    "uni1D96.ccmp",
+    "uni1D97",
+    "uni1D97",
+    "uni1D98",
+    "uni1D98",
+    "uni1D99",
+    "uni1D99",
+    "uni1D9A",
+    "uni1D9A",
+    "uni1DA4.ccmp",
+    "uni1DA4.ccmp",
+    "uni1DA8.ccmp",
+    "uni1DA8.ccmp",
+    "uni1E2C",
+    "uni1E2C",
+    "uni1E2D",
+    "uni1E2D",
+    "uni1E2E",
+    "uni1E2E",
+    "uni1E2F",
+    "uni1E2F",
+    "uni2071.ccmp",
+    "uni2071.ccmp",
+    "uni2C7C.ccmp",
+    "uni2C7C.ccmp",
+    "upsilon",
+    "upsilon",
+    "upsilonlatin",
+    "upsilonlatin",
+    "v",
+    "v",
+    "vscript",
+    "vscript",
+    "vturn",
+    "vturn",
+    "w",
+    "w",
+    "wturn",
+    "wturn",
+    "x",
+    "x",
+    "y",
+    "y",
+    "yturn",
+    "yturn",
+    "z",
+    "z",
+    "zbar",
+    "zbar",
+    "zcurl",
+    "zcurl",
+    "zrthook",
+    "zrthook"
+    # mkmk
+    "uni0351",
+    "uni0350",
+    "uni0357",
+    "uni035B",
+    "uni0343",
+    "uni0342",
+    "acuterightnosp",
+    "graveleftnosp",
+    "uni0346",
+    "diaeresistonosnosp",
+    "uni034A",
+    "overscoredblnosp",
+    "tildevertsupnosp",
+    "xsupnosp",
+    "anglesupnosp",
+    "uni030C_uni1ABB",
+    "dieresisnosp_uni1ABB",
+    "uni034C",
+    "tildecomb_uni1ABB",
+    "uni0352",
+    "uni034B",
+    "macroncomb_uni1ABB",
+    "tildecomb_uni1ABC",
+    "tildevertsupnosp",
+    "overscoredblnosp",
+    "xsupnosp",
+    "anglesupnosp",
+    "uni0357",
+    "uni0352",
+    "uni0350",
+    "uni0351",
+    "uni035B",
+    "uni0346",
+    "diaeresistonosnosp",
+    "acuterightnosp",
+    "uni034C",
+    "uni034B",
+    "tildecomb_uni1ABC",
+    "dieresisnosp_uni1ABB",
+    "tildecomb_uni1ABB",
+    "uni0342",
+    "uni0343",
+    "graveleftnosp",
+    "uni030C_uni1ABB",
+    "macroncomb_uni1ABB",
+    "uni034A"
+]
+
+
+def duplicate_anchor(glyph, src, dst):
+    outline = glyph.find('outline')
+    src_anc = glyph.xpath("//point[@name='{}']".format(src))[0]
+    dst_anc = glyph.xpath("//point[@name='{}']".format(dst))
+
+    if not dst_anc:
+        dst_anc = copy.deepcopy(src_anc.getparent())
+        dst_anc.getchildren()[0].attrib['name'] = dst
+        outline.append(dst_anc)
+
+
+def rename_anchor(glyph, src, dst):
+    anc = glyph.xpath("//point[@name='{}']".format(src))
+    if anc:
+        anc[0].attrib['name'] = dst
+
+
+def delete_anchor(glyph, anc_name):
+    anc = glyph.xpath("//point[@name='{}']".format(anc_name))
+    if anc:
+        anc = anc[0].getparent()
+        anc.getparent().remove(anc)
+
+
+def _delete_design_anchors(glyph):
+    anchors_to_delete = [
+        "_ogonek",
+        "_rhalfring",
+        "_right",
+        "_tonos",
+        "_top",
+        "_bottom",
+        "_bottomu",
+        "_caron",
+        "_cross",
+        "_dot",
+        "_left",
+        "ogonek",
+        "rhalfring",
+        "right",
+        "tonos",
+        "bottomu",
+        "caron",
+        "cross",
+        "dot",
+        "left"
+    ]
+    for anchor in anchors_to_delete:
+        delete_anchor(glyph, anchor)
+
+
+def _rename_anchors(glyph):
+    anchors = [
+        ("_marktop", "_top"),
+        ("_markbottom", "_bottom"),
+        ("_marktop_dd", "_top_dd"),
+        ("_markbottom_dd", "_bottom_dd"),
+        ("_markrhotichook", "_rhotichook"),
+        ("_marktop0315", "_top0315"),
+        ("_markparent_top", "_parent_top"),
+        ("_markparenthesses.w1", "_parenthesses.w1"),
+        ("_markparenthesses.w2", "_parenthesses.w2"),
+        ("_markparenthesses.w3", "_parenthesses.w3"),
+        ("mkmktop", "top"),
+        ("mkmkbottom_acc", "bottom"),
+    ]
+
+    for before_anchor, after_anchor in anchors:
+        rename_anchor(glyph, before_anchor, after_anchor)
+
+
+def _script_already_used(glyph):
+    """Check if a user has already executed the script on the .ufo.
+    Executing the script multiple times on the same .ufo will lead to
+    unforeseen modifications."""
+    prev_added_anc = glyph.xpath("//point[@name='parent_top']")
+    if prev_added_anc:
+        return True
+    return False
+
+
+def main(ufo_path):
+    if not ufo_path.endswith('ufo'):
+        raise Exception('{} is not a ufo'.format(ufo_path))
+    glifs = glob(os.path.join(ufo_path, 'glyphs', '*.glif'))
+
+    # check script has not already been run on this font
+    a_glyph = etree.parse(os.path.join(ufo_path, 'glyphs', 'a.glif'))
+    if _script_already_used(a_glyph):
+        raise Exception('Script has already been used')
+
+    for path in glifs:
+        glyph = etree.parse(path)
+        glyph_name = glyph.getroot().attrib['name']
+
+        _delete_design_anchors(glyph)
+        _rename_anchors(glyph)
+
+        if glyph_name in ['cedilla', 'commaaccent', 'ogonek']:
+            delete_anchor(glyph, 'bottom')
+
+        if glyph_name in ['uni1ABB', 'uni1ABC']:
+            delete_anchor(glyph, '_top')
+
+        if glyph_name in DUPLICATE_ANCHOR_GLYPHS:
+            duplicate_anchor(glyph, "top", "parent_top")
+        glyph.write(path)
+
+    print('Fixed anchors: {}'.format(ufo_path))
+
+
+if __name__ == '__main__':
+    if len(sys.argv) != 2:
+        raise Exception("Include path to ufo")
+    else:
+        ufo_path = sys.argv[1]
+        main(sys.argv[1])

+ 1025 - 0
Scripts/anchorFix_v2.py

@@ -0,0 +1,1025 @@
+from __future__ import print_function
+
+
+
+
+DUPLICATE_ANCHOR_GLYPHS = [
+    "A",
+    "A",
+    "A.smcp",
+    "A.smcp",
+    "A.unic",
+    "A.unic",
+    "AE",
+    "AE",
+    "AE.smcp",
+    "AE.smcp",
+    "B",
+    "B",
+    "B.smcp",
+    "B.smcp",
+    "C",
+    "C",
+    "C.smcp",
+    "C.smcp",
+    "D",
+    "D",
+    "D.smcp",
+    "D.smcp",
+    "E",
+    "E",
+    "E.smcp",
+    "E.smcp",
+    "E.unic",
+    "E.unic",
+    "Eng",
+    "Eng",
+    "Eng.smcp",
+    "Eng.smcp",
+    "Epsilon1",
+    "Epsilon1",
+    "Esh",
+    "Esh",
+    "F",
+    "F",
+    "F.smcp",
+    "F.smcp",
+    "G",
+    "G",
+    "G.smcp",
+    "G.smcp",
+    "Gamma",
+    "Gamma",
+    "Gamma.smcp",
+    "Gamma.smcp",
+    "Gbar",
+    "Gbar",
+    "Gsmallcap",
+    "Gsmallcap",
+    "Gsmallcaphook",
+    "Gsmallcaphook",
+    "H",
+    "H",
+    "H.smcp",
+    "H.smcp",
+    "Hbar",
+    "Hbar",
+    "Hbar.smcp",
+    "Hbar.smcp",
+    "I",
+    "I",
+    "I.smcp",
+    "I.smcp",
+    "Ibar",
+    "Ibar",
+    "Ismallcap",
+    "Ismallcap",
+    "J",
+    "J",
+    "J.smcp",
+    "J.smcp",
+    "K",
+    "K",
+    "K.smcp",
+    "K.smcp",
+    "L",
+    "L",
+    "L.smcp",
+    "L.smcp",
+    "Lslash",
+    "Lslash",
+    "Lslash.smcp",
+    "Lslash.smcp",
+    "Lsmallcap",
+    "Lsmallcap",
+    "M",
+    "M",
+    "M.smcp",
+    "M.smcp",
+    "M.unic",
+    "M.unic",
+    "N",
+    "N",
+    "N.smcp",
+    "N.smcp",
+    "N.unic",
+    "N.unic",
+    "Nsmallcap",
+    "Nsmallcap",
+    "O",
+    "O",
+    "O.smcp",
+    "O.smcp",
+    "OE",
+    "OE",
+    "OEsmallcap",
+    "OEsmallcap",
+    "Ohorn",
+    "Ohorn",
+    "Oslash",
+    "Oslash",
+    "Oslash.smcp",
+    "Oslash.smcp",
+    "P",
+    "P",
+    "P.smcp",
+    "P.smcp",
+    "Q",
+    "Q",
+    "Q.smcp",
+    "Q.smcp",
+    "R",
+    "R",
+    "R.alt",
+    "R.alt",
+    "R.smcp",
+    "R.smcp",
+    "Rsmallcap",
+    "Rsmallcap",
+    "Rsmallcapinv",
+    "Rsmallcapinv",
+    "S",
+    "S",
+    "S.smcp",
+    "S.smcp",
+    "Schwa",
+    "Schwa",
+    "T",
+    "T",
+    "T.smcp",
+    "T.smcp",
+    "Thorn.smcp",
+    "Thorn.smcp",
+    "U",
+    "U",
+    "U.smcp",
+    "U.smcp",
+    "U.unic",
+    "U.unic",
+    "Uhorn",
+    "Uhorn",
+    "V",
+    "V",
+    "V.smcp",
+    "V.smcp",
+    "W",
+    "W",
+    "W.smcp",
+    "W.smcp",
+    "X",
+    "X",
+    "X.smcp",
+    "X.smcp",
+    "Y",
+    "Y",
+    "Y.smcp",
+    "Y.smcp",
+    "Ysmallcap",
+    "Ysmallcap",
+    "Z",
+    "Z",
+    "Z.smcp",
+    "Z.smcp",
+    "Zbar",
+    "Zbar",
+    "a",
+    "a",
+    "a_uni02DE",
+    "a_uni02DE",
+    "ae",
+    "ae",
+    "alpha",
+    "alpha",
+    "ascript",
+    "ascript",
+    "ascriptturn",
+    "ascriptturn",
+    "aturn",
+    "aturn",
+    "b",
+    "b",
+    "babygamma",
+    "babygamma",
+    "bbar",
+    "bbar",
+    "bbar_uni1ABE",
+    "bbar_uni1ABE",
+    "bhook",
+    "bhook",
+    "bullseye",
+    "bullseye",
+    "c",
+    "c",
+    "ccurl",
+    "ccurl",
+    "cstretch",
+    "cstretch",
+    "d",
+    "d",
+    "dcroat",
+    "dcroat",
+    "dcroat_uni1ABE",
+    "dcroat_uni1ABE",
+    "dhook",
+    "dhook",
+    "dotlessi",
+    "dotlessi",
+    "drthook",
+    "drthook",
+    "dyogh",
+    "dyogh",
+    "dz",
+    "dz",
+    "dzcurl",
+    "dzcurl",
+    "e",
+    "e",
+    "eng",
+    "eng",
+    "eng_uni1ABE",
+    "eng_uni1ABE",
+    "epsilon",
+    "epsilon",
+    "epsilon1",
+    "epsilon1",
+    "epsilon1rev",
+    "epsilon1rev",
+    "epsilon1revclosed",
+    "epsilon1revclosed",
+    "epsilon1revhook",
+    "epsilon1revhook",
+    "epsilonclosed",
+    "epsilonclosed",
+    "erev",
+    "erev",
+    "esh",
+    "esh",
+    "eshcurl",
+    "eshcurl",
+    "eshshortrev",
+    "eshshortrev",
+    "eta",
+    "eta",
+    "f",
+    "f",
+    "finalkaf",
+    "finalkaf",
+    "finalmem",
+    "finalmem",
+    "finalnun",
+    "finalnun",
+    "g",
+    "g",
+    "gamma1",
+    "gamma1",
+    "gbar",
+    "gbar",
+    "gbar_uni1ABE",
+    "gbar_uni1ABE",
+    "gcursive",
+    "gcursive",
+    "ghook",
+    "ghook",
+    "glottalstop",
+    "glottalstop",
+    "glottalstopbar",
+    "glottalstopbar",
+    "glottalstopbarrev",
+    "glottalstopbarrev",
+    "glottalstopinv",
+    "glottalstopinv",
+    "glottalstoprevinv",
+    "glottalstoprevinv",
+    "h",
+    "h",
+    "henghook",
+    "henghook",
+    "hhook",
+    "hhook",
+    "hturn",
+    "hturn",
+    "i",
+    "i",
+    "ibar",
+    "ibar",
+    "iota",
+    "iota",
+    "iota1",
+    "iota1",
+    "j",
+    "j",
+    "jcrosstail",
+    "jcrosstail",
+    "jdotlessbar",
+    "jdotlessbar",
+    "jhookdblbar",
+    "jhookdblbar",
+    "k",
+    "k",
+    "k.alt",
+    "k.alt",
+    "kgreenlandic",
+    "kgreenlandic",
+    "kturn",
+    "kturn",
+    "l",
+    "l",
+    "lbar",
+    "lbar",
+    "lbelt",
+    "lbelt",
+    "lmidtilde",
+    "lmidtilde",
+    "longs",
+    "longs",
+    "lrthook",
+    "lrthook",
+    "lslash",
+    "lslash",
+    "lyogh",
+    "lyogh",
+    "m",
+    "m",
+    "mhook",
+    "mhook",
+    "mturn",
+    "mturn",
+    "mturndescend",
+    "mturndescend",
+    "n",
+    "n",
+    "nlfthook",
+    "nlfthook",
+    "nrthook",
+    "nrthook",
+    "o",
+    "o",
+    "oe",
+    "oe",
+    "ohorn",
+    "ohorn",
+    "omega",
+    "omega",
+    "omegaclosed",
+    "omegaclosed",
+    "oopen",
+    "oopen",
+    "oslash",
+    "oslash",
+    "p",
+    "p",
+    "philatin",
+    "philatin",
+    "psi",
+    "psi",
+    "q",
+    "q",
+    "qhook",
+    "qhook",
+    "r",
+    "r",
+    "rdescend",
+    "rdescend",
+    "rfishhook",
+    "rfishhook",
+    "rfishhookrev",
+    "rfishhookrev",
+    "rho",
+    "rho",
+    "rrthook",
+    "rrthook",
+    "rturn",
+    "rturn",
+    "rturnascend",
+    "rturnascend",
+    "rturnrthook",
+    "rturnrthook",
+    "s",
+    "s",
+    "schwa",
+    "schwa",
+    "schwahook",
+    "schwahook",
+    "srthook",
+    "srthook",
+    "t",
+    "t",
+    "tccurl",
+    "tccurl",
+    "tesh",
+    "tesh",
+    "trthook",
+    "trthook",
+    "ts",
+    "ts",
+    "tturn",
+    "tturn",
+    "u",
+    "u",
+    "ubar",
+    "ubar",
+    "uhorn",
+    "uhorn",
+    "uni0069.ccmp",
+    "uni0069.ccmp",
+    "uni006A.ccmp",
+    "uni006A.ccmp",
+    "uni012F.ccmp",
+    "uni012F.ccmp",
+    "uni0237",
+    "uni0237",
+    "uni023D",
+    "uni023D",
+    "uni0243",
+    "uni0243",
+    "uni0244",
+    "uni0244",
+    "uni0248",
+    "uni0248",
+    "uni0249",
+    "uni0249",
+    "uni0249.ccmp",
+    "uni0249.ccmp",
+    "uni024C",
+    "uni024C",
+    "uni024D",
+    "uni024D",
+    "uni024E",
+    "uni024E",
+    "uni024F",
+    "uni024F",
+    "uni0268.ccmp",
+    "uni0268.ccmp",
+    "uni0292",
+    "uni0292",
+    "uni0293",
+    "uni0293",
+    "uni029D.ccmp",
+    "uni029D.ccmp",
+    "uni02A9",
+    "uni02A9",
+    "uni02AB",
+    "uni02AB",
+    "uni02AC",
+    "uni02AC",
+    "uni02AE",
+    "uni02AE",
+    "uni02B2.ccmp",
+    "uni02B2.ccmp",
+    "uni03D2",
+    "uni03D2",
+    "uni03D6",
+    "uni03D6",
+    "uni03F3.ccmp",
+    "uni03F3.ccmp",
+    "uni0404",
+    "uni0404",
+    "uni0404.smcp",
+    "uni0404.smcp",
+    "uni0416",
+    "uni0416",
+    "uni0416.smcp",
+    "uni0416.smcp",
+    "uni0417",
+    "uni0417",
+    "uni0417.smcp",
+    "uni0417.smcp",
+    "uni0418",
+    "uni0418",
+    "uni0418.smcp",
+    "uni0418.smcp",
+    "uni0423",
+    "uni0423",
+    "uni0423.smcp",
+    "uni0423.smcp",
+    "uni0427",
+    "uni0427",
+    "uni0427.smcp",
+    "uni0427.smcp",
+    "uni042B",
+    "uni042B",
+    "uni042B.smcp",
+    "uni042B.smcp",
+    "uni042D",
+    "uni042D",
+    "uni042D.smcp",
+    "uni042D.smcp",
+    "uni042E",
+    "uni042E",
+    "uni042E.smcp",
+    "uni042E.smcp",
+    "uni042F",
+    "uni042F",
+    "uni042F.smcp",
+    "uni042F.smcp",
+    "uni0432",
+    "uni0432",
+    "uni0433",
+    "uni0433",
+    "uni0434",
+    "uni0434",
+    "uni0436",
+    "uni0436",
+    "uni0437",
+    "uni0437",
+    "uni0438",
+    "uni0438",
+    "uni043A",
+    "uni043A",
+    "uni043B",
+    "uni043B",
+    "uni043C",
+    "uni043C",
+    "uni043D",
+    "uni043D",
+    "uni043F",
+    "uni043F",
+    "uni0442",
+    "uni0442",
+    "uni0444",
+    "uni0444",
+    "uni0446",
+    "uni0446",
+    "uni0447",
+    "uni0447",
+    "uni0448",
+    "uni0448",
+    "uni0449",
+    "uni0449",
+    "uni044B",
+    "uni044B",
+    "uni044D",
+    "uni044D",
+    "uni044E",
+    "uni044E",
+    "uni044F",
+    "uni044F",
+    "uni0454",
+    "uni0454",
+    "uni0456.ccmp",
+    "uni0456.ccmp",
+    "uni0458.ccmp",
+    "uni0458.ccmp",
+    "uni0460",
+    "uni0460",
+    "uni0461",
+    "uni0461",
+    "uni046F",
+    "uni046F",
+    "uni0472",
+    "uni0472",
+    "uni0473",
+    "uni0473",
+    "uni0474",
+    "uni0474",
+    "uni0475",
+    "uni0475",
+    "uni047B",
+    "uni047B",
+    "uni047F",
+    "uni047F",
+    "uni0480",
+    "uni0480",
+    "uni0481",
+    "uni0481",
+    "uni048A",
+    "uni048A",
+    "uni048B",
+    "uni048B",
+    "uni04A8",
+    "uni04A8",
+    "uni04A8.smcp",
+    "uni04A8.smcp",
+    "uni04A9",
+    "uni04A9",
+    "uni04BA",
+    "uni04BA",
+    "uni04BA.smcp",
+    "uni04BA.smcp",
+    "uni04D8",
+    "uni04D8",
+    "uni04D8.smcp",
+    "uni04D8.smcp",
+    "uni04E8.smcp",
+    "uni04E8.smcp",
+    "uni0504",
+    "uni0504",
+    "uni0506",
+    "uni0506",
+    "uni050A",
+    "uni050A",
+    "uni050C",
+    "uni050C",
+    "uni050D",
+    "uni050D",
+    "uni050E",
+    "uni050E",
+    "uni0510",
+    "uni0510",
+    "uni1D00",
+    "uni1D00",
+    "uni1D01",
+    "uni1D01",
+    "uni1D02",
+    "uni1D02",
+    "uni1D03",
+    "uni1D03",
+    "uni1D04",
+    "uni1D04",
+    "uni1D05",
+    "uni1D05",
+    "uni1D06",
+    "uni1D06",
+    "uni1D07",
+    "uni1D07",
+    "uni1D08",
+    "uni1D08",
+    "uni1D09",
+    "uni1D09",
+    "uni1D0A",
+    "uni1D0A",
+    "uni1D0B",
+    "uni1D0B",
+    "uni1D0C",
+    "uni1D0C",
+    "uni1D0D",
+    "uni1D0D",
+    "uni1D0E",
+    "uni1D0E",
+    "uni1D0F",
+    "uni1D0F",
+    "uni1D10",
+    "uni1D10",
+    "uni1D14",
+    "uni1D14",
+    "uni1D15",
+    "uni1D15",
+    "uni1D18",
+    "uni1D18",
+    "uni1D19",
+    "uni1D19",
+    "uni1D1A",
+    "uni1D1A",
+    "uni1D1B",
+    "uni1D1B",
+    "uni1D1C",
+    "uni1D1C",
+    "uni1D20",
+    "uni1D20",
+    "uni1D21",
+    "uni1D21",
+    "uni1D22",
+    "uni1D22",
+    "uni1D23",
+    "uni1D23",
+    "uni1D24",
+    "uni1D24",
+    "uni1D25",
+    "uni1D25",
+    "uni1D26",
+    "uni1D26",
+    "uni1D27",
+    "uni1D27",
+    "uni1D28",
+    "uni1D28",
+    "uni1D29",
+    "uni1D29",
+    "uni1D2A",
+    "uni1D2A",
+    "uni1D2B",
+    "uni1D2B",
+    "uni1D62.ccmp",
+    "uni1D62.ccmp",
+    "uni1D6B",
+    "uni1D6B",
+    "uni1D6C",
+    "uni1D6C",
+    "uni1D6D",
+    "uni1D6D",
+    "uni1D6E",
+    "uni1D6E",
+    "uni1D6F",
+    "uni1D6F",
+    "uni1D70",
+    "uni1D70",
+    "uni1D71",
+    "uni1D71",
+    "uni1D72",
+    "uni1D72",
+    "uni1D73",
+    "uni1D73",
+    "uni1D74",
+    "uni1D74",
+    "uni1D75",
+    "uni1D75",
+    "uni1D76",
+    "uni1D76",
+    "uni1D77",
+    "uni1D77",
+    "uni1D79",
+    "uni1D79",
+    "uni1D7A",
+    "uni1D7A",
+    "uni1D7C",
+    "uni1D7C",
+    "uni1D7D",
+    "uni1D7D",
+    "uni1D7E",
+    "uni1D7E",
+    "uni1D7F",
+    "uni1D7F",
+    "uni1D80",
+    "uni1D80",
+    "uni1D81",
+    "uni1D81",
+    "uni1D82",
+    "uni1D82",
+    "uni1D83",
+    "uni1D83",
+    "uni1D84",
+    "uni1D84",
+    "uni1D85",
+    "uni1D85",
+    "uni1D86",
+    "uni1D86",
+    "uni1D87",
+    "uni1D87",
+    "uni1D88",
+    "uni1D88",
+    "uni1D89",
+    "uni1D89",
+    "uni1D8A",
+    "uni1D8A",
+    "uni1D8B",
+    "uni1D8B",
+    "uni1D8C",
+    "uni1D8C",
+    "uni1D8D",
+    "uni1D8D",
+    "uni1D8E",
+    "uni1D8E",
+    "uni1D8F",
+    "uni1D8F",
+    "uni1D90",
+    "uni1D90",
+    "uni1D91",
+    "uni1D91",
+    "uni1D92",
+    "uni1D92",
+    "uni1D93",
+    "uni1D93",
+    "uni1D94",
+    "uni1D94",
+    "uni1D95",
+    "uni1D95",
+    "uni1D96",
+    "uni1D96",
+    "uni1D96.ccmp",
+    "uni1D96.ccmp",
+    "uni1D97",
+    "uni1D97",
+    "uni1D98",
+    "uni1D98",
+    "uni1D99",
+    "uni1D99",
+    "uni1D9A",
+    "uni1D9A",
+    "uni1DA4.ccmp",
+    "uni1DA4.ccmp",
+    "uni1DA8.ccmp",
+    "uni1DA8.ccmp",
+    "uni1E2C",
+    "uni1E2C",
+    "uni1E2D",
+    "uni1E2D",
+    "uni1E2E",
+    "uni1E2E",
+    "uni1E2F",
+    "uni1E2F",
+    "uni2071.ccmp",
+    "uni2071.ccmp",
+    "uni2C7C.ccmp",
+    "uni2C7C.ccmp",
+    "upsilon",
+    "upsilon",
+    "upsilonlatin",
+    "upsilonlatin",
+    "v",
+    "v",
+    "vscript",
+    "vscript",
+    "vturn",
+    "vturn",
+    "w",
+    "w",
+    "wturn",
+    "wturn",
+    "x",
+    "x",
+    "y",
+    "y",
+    "yturn",
+    "yturn",
+    "z",
+    "z",
+    "zbar",
+    "zbar",
+    "zcurl",
+    "zcurl",
+    "zrthook",
+    "zrthook"
+    # mkmk
+    "uni0351",
+    "uni0350",
+    "uni0357",
+    "uni035B",
+    "uni0343",
+    "uni0342",
+    "acuterightnosp",
+    "graveleftnosp",
+    "uni0346",
+    "diaeresistonosnosp",
+    "uni034A",
+    "overscoredblnosp",
+    "tildevertsupnosp",
+    "xsupnosp",
+    "anglesupnosp",
+    "uni030C_uni1ABB",
+    "dieresisnosp_uni1ABB",
+    "uni034C",
+    "tildecomb_uni1ABB",
+    "uni0352",
+    "uni034B",
+    "macroncomb_uni1ABB",
+    "tildecomb_uni1ABC",
+    "tildevertsupnosp",
+    "overscoredblnosp",
+    "xsupnosp",
+    "anglesupnosp",
+    "uni0357",
+    "uni0352",
+    "uni0350",
+    "uni0351",
+    "uni035B",
+    "uni0346",
+    "diaeresistonosnosp",
+    "acuterightnosp",
+    "uni034C",
+    "uni034B",
+    "tildecomb_uni1ABC",
+    "dieresisnosp_uni1ABB",
+    "tildecomb_uni1ABB",
+    "uni0342",
+    "uni0343",
+    "graveleftnosp",
+    "uni030C_uni1ABB",
+    "macroncomb_uni1ABB",
+    "uni034A"
+]
+
+
+def duplicate_anchor(glyph, src, dst):
+    outline = glyph.find('outline')
+    src_anc = glyph.xpath("//point[@name='{}']".format(src))[0]
+    dst_anc = glyph.xpath("//point[@name='{}']".format(dst))
+
+    if not dst_anc:
+        dst_anc = copy.deepcopy(src_anc.getparent())
+        dst_anc.getchildren()[0].attrib['name'] = dst
+        outline.append(dst_anc)
+
+
+# def rename_anchor(glyph, src, dst):
+#     anc = glyph.xpath("//point[@name='{}']".format(src))
+#     if anc:
+#         anc[0].attrib['name'] = dst
+
+def duplicate_anchor_v2(glyph, src, dst):
+    sourceAnchor = src
+    destAnchor = dst
+    gname = glyph.name
+    
+    
+    anchorList = [ g.anchors[anchor].name for anchor in range(len(g.anchors))]
+    anchorDict = { g.anchors[anchor].name : g.anchors[anchor].position for anchor in range(len(g.anchors))}
+    
+    #print anchorDict
+    
+
+    if not destAnchor in anchorDict.keys():
+        if sourceAnchor in anchorDict.keys():
+            anchorPos = anchorDict[sourceAnchor]
+            anchorName = destAnchor
+            g.appendAnchor(anchorName, anchorPos)
+            print ('-', gname, 'anchor added')
+                
+
+
+
+def rename_anchor_v2(glyph, src, dst):
+    #g = f[gname]
+    g = glyph
+    if g.anchors:
+        for a in g.anchors:
+            aname = a.name
+            if a.name == src:
+                oldName = a.name
+                newName = dst
+                a.name = newName
+                
+                print(g.name, ': ', oldName, '>', newName)
+
+
+# def delete_anchor(glyph, anc_name):
+#     anc = glyph.xpath("//point[@name='{}']".format(anc_name))
+#     if anc:
+#         anc = anc[0].getparent()
+#         anc.getparent().remove(anc)
+
+def delete_anchor_v2(glyph, anc_name):
+    #g = f[gname]
+    g = glyph
+    if g.anchors:
+        for a in g.anchors:
+            if a.name == anc_name:
+                g.removeAnchor(a)   
+                
+                print(g.name, ': ', a.name, 'removed')
+                 
+
+
+def _delete_design_anchors(glyph):
+    anchors_to_delete = [
+        "_ogonek",
+        "_rhalfring",
+        "_right",
+        "_tonos",
+        "_top",
+        "_bottom",
+        "_bottomu",
+        "_caron",
+        "_cross",
+        "_dot",
+        "_left",
+        "ogonek",
+        "rhalfring",
+        "right",
+        "tonos",
+        "bottomu",
+        "caron",
+        "cross",
+        "dot",
+        "left"
+    ]
+    for anchor in anchors_to_delete:
+        delete_anchor_v2(glyph, anchor)
+
+
+def _rename_anchors(glyph):
+    anchors = [
+        ("_marktop", "_top"),
+        ("_markbottom", "_bottom"),
+        ("_marktop_dd", "_top_dd"),
+        ("_markbottom_dd", "_bottom_dd"),
+        ("_markrhotichook", "_rhotichook"),
+        ("_marktop0315", "_top0315"),
+        ("_markparent_top", "_parent_top"),
+        ("_markparenthesses.w1", "_parenthesses.w1"),
+        ("_markparenthesses.w2", "_parenthesses.w2"),
+        ("_markparenthesses.w3", "_parenthesses.w3"),
+        ("mkmktop", "top"),
+        ("mkmkbottom_acc", "bottom"),
+    ]
+
+    for before_anchor, after_anchor in anchors:
+        rename_anchor_v2(glyph, before_anchor, after_anchor)
+
+
+
+
+
+
+
+
+fonts = AllFonts()
+
+for f in fonts:
+    for g in f:
+        glyph = g
+        glyph_name = g.name
+        
+        
+        _delete_design_anchors(glyph)
+        _rename_anchors(glyph)        
+
+        if glyph_name in ['cedilla', 'commaaccent', 'ogonek']:
+            delete_anchor_v2(glyph, 'bottom')
+
+        if glyph_name in ['uni1ABB', 'uni1ABC']:
+            delete_anchor_v2(glyph, '_top')
+
+        if glyph_name in DUPLICATE_ANCHOR_GLYPHS:
+            duplicate_anchor_v2(glyph, "top", "parent_top")
+            
+            
+

BIN
fonts/Roboto-VF.ttf


BIN
fonts/Roboto-min-VF.ttf


+ 9 - 9
master_ufo/Roboto-Black.ufo/features.fea

@@ -153,15 +153,15 @@ feature unic {
 } unic;
 
 
-feature mark {
-   ;
-} mark;
-
-
-feature mkmk {
-   ;
-} mkmk;
-
+## let fontmake build these automatically
+#feature mark {
+#   ;
+#} mark;
+#
+#
+#feature mkmk {
+#   ;
+#} mkmk;
 
 feature ccmp {
 

+ 1 - 1
master_ufo/Roboto-Black.ufo/fontinfo.plist

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
 <dict>
 	<key>ascender</key>

+ 3 - 9
master_ufo/Roboto-Black.ufo/glyphs/A_.glif

@@ -29,15 +29,6 @@
     <contour>
       <point x="702" y="9" type="move" name="bottom"/>
     </contour>
-    <contour>
-      <point x="1400" y="0" type="move" name="right"/>
-    </contour>
-    <contour>
-      <point x="319" y="1454" type="move" name="tonos"/>
-    </contour>
-    <contour>
-      <point x="1292" y="0" type="move" name="ogonek"/>
-    </contour>
     <contour>
       <point x="1395" y="1600" type="move" name="top_dd"/>
     </contour>
@@ -47,6 +38,9 @@
     <contour>
       <point x="1395" y="1600" type="move" name="top0315"/>
     </contour>
+    <contour>
+      <point x="699" y="1600" type="move" name="parent_top"/>
+    </contour>
   </outline>
   <lib>
     <dict>

+ 3 - 9
master_ufo/Roboto-Black.ufo/glyphs/A_.smcp.glif

@@ -28,15 +28,6 @@
     <contour>
       <point x="607" y="0" type="move" name="bottom"/>
     </contour>
-    <contour>
-      <point x="1075" y="0" type="move" name="right"/>
-    </contour>
-    <contour>
-      <point x="176" y="1163" type="move" name="tonos"/>
-    </contour>
-    <contour>
-      <point x="1148" y="0" type="move" name="ogonek"/>
-    </contour>
     <contour>
       <point x="1212" y="1600" type="move" name="top_dd"/>
     </contour>
@@ -46,6 +37,9 @@
     <contour>
       <point x="1212" y="1320" type="move" name="top0315"/>
     </contour>
+    <contour>
+      <point x="607" y="1320" type="move" name="parent_top"/>
+    </contour>
   </outline>
   <lib>
     <dict>

+ 3 - 3
master_ufo/Roboto-Black.ufo/glyphs/A_.unic.glif

@@ -57,9 +57,6 @@
     <contour>
       <point x="702" y="9" type="move" name="bottom"/>
     </contour>
-    <contour>
-      <point x="1204" y="0" type="move" name="ogonek"/>
-    </contour>
     <contour>
       <point x="1383" y="1600" type="move" name="top_dd"/>
     </contour>
@@ -69,6 +66,9 @@
     <contour>
       <point x="1383" y="1630" type="move" name="top0315"/>
     </contour>
+    <contour>
+      <point x="696" y="1630" type="move" name="parent_top"/>
+    </contour>
   </outline>
   <lib>
     <dict>

+ 3 - 0
master_ufo/Roboto-Black.ufo/glyphs/A_E_.glif

@@ -49,5 +49,8 @@
     <contour>
       <point x="1926" y="1612" type="move" name="top0315"/>
     </contour>
+    <contour>
+      <point x="934" y="1612" type="move" name="parent_top"/>
+    </contour>
   </outline>
 </glyph>

Some files were not shown because too many files changed in this diff