- Create Economist SubmissionTracking package correctly: * mainArticle = full blog post content * coverLetter = 216-word SIR— letter * Links to blog post via blogPostId - Archive 'Letter to The Economist' from blog posts (it's the cover letter) - Fix date display on article cards (use published_at) - Target publication already displaying via blue badge Database changes: - Make blogPostId optional in SubmissionTracking model - Economist package ID: 68fa85ae49d4900e7f2ecd83 - Le Monde package ID: 68fa2abd2e6acd5691932150 Next: Enhanced modal with tabs, validation, export 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
64 lines
1.7 KiB
Python
64 lines
1.7 KiB
Python
# Since bitmap glyph metrics are shared between EBLC and EBDT
|
|
# this class gets its own python file.
|
|
from fontTools.misc import sstruct
|
|
from fontTools.misc.textTools import safeEval
|
|
import logging
|
|
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
bigGlyphMetricsFormat = """
|
|
> # big endian
|
|
height: B
|
|
width: B
|
|
horiBearingX: b
|
|
horiBearingY: b
|
|
horiAdvance: B
|
|
vertBearingX: b
|
|
vertBearingY: b
|
|
vertAdvance: B
|
|
"""
|
|
|
|
smallGlyphMetricsFormat = """
|
|
> # big endian
|
|
height: B
|
|
width: B
|
|
BearingX: b
|
|
BearingY: b
|
|
Advance: B
|
|
"""
|
|
|
|
|
|
class BitmapGlyphMetrics(object):
|
|
def toXML(self, writer, ttFont):
|
|
writer.begintag(self.__class__.__name__)
|
|
writer.newline()
|
|
for metricName in sstruct.getformat(self.__class__.binaryFormat)[1]:
|
|
writer.simpletag(metricName, value=getattr(self, metricName))
|
|
writer.newline()
|
|
writer.endtag(self.__class__.__name__)
|
|
writer.newline()
|
|
|
|
def fromXML(self, name, attrs, content, ttFont):
|
|
metricNames = set(sstruct.getformat(self.__class__.binaryFormat)[1])
|
|
for element in content:
|
|
if not isinstance(element, tuple):
|
|
continue
|
|
name, attrs, content = element
|
|
# Make sure this is a metric that is needed by GlyphMetrics.
|
|
if name in metricNames:
|
|
vars(self)[name] = safeEval(attrs["value"])
|
|
else:
|
|
log.warning(
|
|
"unknown name '%s' being ignored in %s.",
|
|
name,
|
|
self.__class__.__name__,
|
|
)
|
|
|
|
|
|
class BigGlyphMetrics(BitmapGlyphMetrics):
|
|
binaryFormat = bigGlyphMetricsFormat
|
|
|
|
|
|
class SmallGlyphMetrics(BitmapGlyphMetrics):
|
|
binaryFormat = smallGlyphMetricsFormat
|