[gentium-commits] [SCM] gentium updated: r50 - trunk/gentium/source/fonts/gentium-tug/type1

Pavel Far?? INVALID.NOREPLY at gnu.org.ua
Wed Mar 23 23:22:14 CET 2022


Author: pavel
Date: 2022-03-23 22:22:14 +0000 (Wed, 23 Mar 2022)
New Revision: 50

Modified:
   trunk/gentium/source/fonts/gentium-tug/type1/kerncorrection.py
Log:
fix duplicate extra kerning pairs

It was fixed in a quick and dirty way using 'Counter' object
from 'collections'. The script may get some light refactoring
in the near future to become less dirty or it may be completely
rewritten much later.


Modified: trunk/gentium/source/fonts/gentium-tug/type1/kerncorrection.py
===================================================================
--- trunk/gentium/source/fonts/gentium-tug/type1/kerncorrection.py	2022-03-23 17:59:05 UTC (rev 49)
+++ trunk/gentium/source/fonts/gentium-tug/type1/kerncorrection.py	2022-03-23 22:22:14 UTC (rev 50)
@@ -11,6 +11,21 @@
 # Example of such duplicate kerning pair is 'A cacute.sc'
 # It is generated is initialcap() for the first time and in
 # accentedinitialcapsmallcap() for the second time.
+#
+# FIXED
+#
+# The previous error was fixed, althought in a dirty way. Instead of
+# writing directly to a file, the lines with extra kerning are added
+# to 'Counter' object from 'collections'. This automatically eliminates
+# duplicates, but keep track of them (they have count of 2).
+# 
+# It was tested that just the duplicates are removed and nothing is lost.
+# When the duplicates were removed from the file generated by the old
+# script, the result is exactly the same as the file generated by this new
+# version of the script.
+#
+# This file will be cleaned up later (or completely rewritten). I know
+# this script is very dirty and it might be easier to rewrite it completely.
 
 
 # TODO: use variable for the small caps extension '.sc'
@@ -17,6 +32,7 @@
 
 import os, sys, re
 
+import collections
 
 class KernReader:
     def __init__(self, filename):
@@ -150,10 +166,11 @@
     ]
 
     def __init__(self, filename):
-        self.f = open(filename, "a")  # append
+        self.filename = filename  # the name of the file with extra kerning pairs
+        self.kern_lines = collections.Counter()  # contains lines with extra kerning pairs
 
-    def writetofile(self, s):
-        # This method writes one extra kerning pair to the output file.
+    def add_to_kern_lines(self, s):
+        # This method adds one extra kerning pair to kern_lines.
         # It also makes correction for small cap Tcommaaccent and Tcedilla.
         # Tcedilla is uni0162 and the small cap is uni0163.sc, not
         # uni0162.sc. Tcommaaccent is uni021A and the small cap is uni021B.sc,
@@ -160,13 +177,20 @@
         # not uni021a.sc (look also at the small "a"; there is problem not only
         # in the unicode value, but also in the case, because method lower() is
         # used).
-        self.f.write(s.replace("uni021a.sc", "uni021B.sc").replace("uni0162.sc", "uni0163.sc"))
+        extra_line = s.replace("uni021a.sc", "uni021B.sc").replace("uni0162.sc", "uni0163.sc")
+        self.kern_lines.update([extra_line])  # must use '[]', otherwise iterates over letters
 
+    def write_kern_lines_to_file(self):
+        with open(self.filename, "a") as extra_kern_file:  # append to file!
+            for line in self.kern_lines:
+                extra_kern_file.write(line)
+
+
     def smallcaps(self, fromreader, kernfactor):
         a = fromreader.getkerns("KPX [A-Z] [A-Z]")
         for s in a:
             parts = s.split()
-            self.writetofile("KPX " + parts[1].lower() + ".sc " + parts[2].lower() +
+            self.add_to_kern_lines("KPX " + parts[1].lower() + ".sc " + parts[2].lower() +
                              ".sc " + str(int(round(kernfactor * float(parts[3])))) +
                              '\n')
 
@@ -174,7 +198,7 @@
         a = fromreader.getkerns("KPX [A-Z] [A-Z]")
         for s in a:
             parts = s.split()
-            self.writetofile("KPX " + parts[1] + " " + parts[2].lower() + ".sc " +
+            self.add_to_kern_lines("KPX " + parts[1] + " " + parts[2].lower() + ".sc " +
                              str(int(round(kernfactor * float(parts[3])))) + '\n')
 
     def rightpunctuation(self, fromreader, kernfactor):
@@ -185,7 +209,7 @@
         a.extend(fromreader.getkerns("KPX [A-Z] quoteright"))
         for s in a:
             parts = s.split()
-            self.writetofile("KPX " + parts[1].lower() + ".sc " + parts[2] + " " +
+            self.add_to_kern_lines("KPX " + parts[1].lower() + ".sc " + parts[2] + " " +
                              str(int(round(kernfactor * float(parts[3])))) + '\n')
 
     def leftpunctuation(self, fromreader, kernfactor):
@@ -194,7 +218,7 @@
         a.extend(fromreader.getkerns("KPX quoteleft [A-Z]"))
         for s in a:
             parts = s.split()
-            self.writetofile("KPX " + parts[1] + " " + parts[2].lower() + ".sc " +
+            self.add_to_kern_lines("KPX " + parts[1] + " " + parts[2].lower() + ".sc " +
                              str(int(round(kernfactor * float(parts[3])))) + '\n')
 
     def accentedcapitalletters(self, fromreader):
@@ -205,7 +229,7 @@
             kernline = a[0]
             for b in derivedkerns:
                 newkernline = kernline.replace(basekern, b)
-                self.writetofile(newkernline)
+                self.add_to_kern_lines(newkernline)
 
     def accentedsmallletters(self, fromreader):
         for x in self.kernpairssmall:
@@ -215,7 +239,7 @@
             kernline = a[0]
             for b in derivedkerns:
                 newkernline = kernline.replace(basekern, b)
-                self.writetofile(newkernline)
+                self.add_to_kern_lines(newkernline)
 
     def accentedsmallcaps(self, fromreader, kernfactor):
         for x in self.kernpairscapital:
@@ -226,7 +250,7 @@
             for b in derivedkerns:
                 newkernline = kernline.replace(basekern, b)
                 parts = newkernline.split()
-                self.writetofile("KPX " + parts[1].lower() + ".sc " + parts[2].lower() +
+                self.add_to_kern_lines("KPX " + parts[1].lower() + ".sc " + parts[2].lower() +
                                  ".sc " + str(int(round(kernfactor * float(parts[3])))) +
                                  '\n')
 
@@ -238,7 +262,7 @@
             kernline = a[0]
             for b in derivedkerns:
                 newkernline = kernline.replace(basekern, b)
-                self.writetofile(newkernline)
+                self.add_to_kern_lines(newkernline)
 
     def accentedinitialcapsmallcap(self, fromreader, kernfactor):
         for x in self.kernpairscapital:
@@ -249,7 +273,7 @@
             for b in derivedkerns:
                 newkernline = kernline.replace(basekern, b)
                 parts = newkernline.split()
-                self.writetofile("KPX " + parts[1] + " " + parts[2].lower() + ".sc " +
+                self.add_to_kern_lines("KPX " + parts[1] + " " + parts[2].lower() + ".sc " +
                                  str(int(round(kernfactor * float(parts[3])))) + '\n')
 
     def accentedrightpunctuation(self, fromreader):
@@ -260,7 +284,7 @@
             kernline = a[0]
             for b in derivedkerns:
                 newkernline = kernline.replace(basekern, b)
-                self.writetofile(newkernline)
+                self.add_to_kern_lines(newkernline)
 
     def accentedleftpunctuation(self, fromreader):
         # nothing to be done
@@ -274,10 +298,8 @@
             kernline = a[0]
             for b in derivedkerns:
                 newkernline = kernline.replace(basekern, b)
-                self.writetofile(newkernline)
+                self.add_to_kern_lines(newkernline)
 
-    def close(self):
-        self.f.close()
 
 
 kernfactor = 0.94  # width of small caps / width of capital letters; tested for
@@ -285,19 +307,20 @@
 
 fin = KernReader(sys.argv[1])
 
-fout = KernWriter(sys.argv[2])
+# output_generator is not a file ane more! Rename!
+output_generator = KernWriter(sys.argv[2])
 # letters without accents
-fout.smallcaps(fin, kernfactor)
-fout.initialcap(fin, kernfactor)
-fout.rightpunctuation(fin, kernfactor)
-fout.leftpunctuation(fin, kernfactor)
+output_generator.smallcaps(fin, kernfactor)
+output_generator.initialcap(fin, kernfactor)
+output_generator.rightpunctuation(fin, kernfactor)
+output_generator.leftpunctuation(fin, kernfactor)
 # letters with accents
-fout.accentedcapitalletters(fin)
-fout.accentedsmallletters(fin)
-fout.accentedsmallcaps(fin, kernfactor)
-fout.accentedinitialcap(fin)
-fout.accentedinitialcapsmallcap(fin, kernfactor)
-fout.accentedrightpunctuation(fin)
-fout.accentedleftpunctuation(fin)
-fout.czechquotes(fin)
-fout.close()
+output_generator.accentedcapitalletters(fin)
+output_generator.accentedsmallletters(fin)
+output_generator.accentedsmallcaps(fin, kernfactor)
+output_generator.accentedinitialcap(fin)
+output_generator.accentedinitialcapsmallcap(fin, kernfactor)
+output_generator.accentedrightpunctuation(fin)
+output_generator.accentedleftpunctuation(fin)
+output_generator.czechquotes(fin)
+output_generator.write_kern_lines_to_file()



More information about the gentium-commits mailing list.