Ignore:
Timestamp:
02/21/12 04:42:22 (15 months ago)
Author:
tal
Message:
Extract woff*.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • packages/extractor/branches/ufo3/Lib/extractor/formats/woff.py

    r1137 r1138  
     1from xml.sax.saxutils import quoteattr 
     2from extractor.tools import RelaxedInfo 
    13from opentype import extractOpenTypeInfo, extractOpenTypeGlyphs, extractOpenTypeKerning 
    24 
     
    3537 
    3638def extractWOFFInfo(source, destination): 
     39    info = RelaxedInfo(destination.info) 
     40    info.woffMajorVersion = source.majorVersion 
     41    info.woffMinorVersion = source.minorVersion 
     42    _extractWOFFMetadata(source, info) 
    3743    return extractOpenTypeInfo(source, destination) 
    3844 
     
    4248def extractWOFFKerning(source, destination): 
    4349    return extractOpenTypeKerning(source, destination) 
     50 
     51# -------- 
     52# Metadata 
     53# -------- 
     54 
     55def _extractWOFFMetadata(source, destination): 
     56    metadata = source.metadata 
     57    if metadata is None: 
     58        return 
     59    for element in metadata: 
     60        if element.tag == "uniqueid": 
     61            _extractWOFFMetadataUniqueID(element, destination) 
     62        elif element.tag == "vendor": 
     63            _extractWOFFMetadataVendor(element, destination) 
     64        elif element.tag == "credits": 
     65            _extractWOFFMetadataCredits(element, destination) 
     66        elif element.tag == "description": 
     67            _extractWOFFMetadataDescription(element, destination) 
     68        elif element.tag == "license": 
     69            _extractWOFFMetadataLicense(element, destination) 
     70        elif element.tag == "copyright": 
     71            _extractWOFFMetadataCopyright(element, destination) 
     72        elif element.tag == "trademark": 
     73            _extractWOFFMetadataTrademark(element, destination) 
     74        elif element.tag == "licensee": 
     75            _extractWOFFMetadataLicensee(element, destination) 
     76        elif element.tag == "extension": 
     77            _extractWOFFMetadataExtension(element, destination) 
     78 
     79def _extractWOFFMetadataUniqueID(element, destination): 
     80    destination.woffMetadataUniqueID = _extractWOFFMetadataDict(element, ("id",)) 
     81 
     82def _extractWOFFMetadataVendor(element, destination): 
     83    attributes = ("name", "url", "dir", "class") 
     84    record = _extractWOFFMetadataDict(element, attributes) 
     85    destination.woffMetadataVendor = record 
     86 
     87def _extractWOFFMetadataCredits(element, destination): 
     88    attributes = ("name", "url", "role", "dir", "class") 
     89    credits = [] 
     90    for subElement in element: 
     91        if subElement.tag == "credit": 
     92            record = _extractWOFFMetadataDict(subElement, attributes) 
     93            credits.append(record) 
     94    destination.woffMetadataCredits = dict(credits=credits) 
     95 
     96def _extractWOFFMetadataDescription(element, destination): 
     97    description = _extractWOFFMetadataDict(element, ("url",)) 
     98    textRecords = _extractWOFFMetadataText(element) 
     99    if textRecords: 
     100        description["text"] = textRecords 
     101    destination.woffMetadataDescription = description 
     102 
     103def _extractWOFFMetadataLicense(element, destination): 
     104    license = _extractWOFFMetadataDict(element, ("url", "id")) 
     105    textRecords = _extractWOFFMetadataText(element) 
     106    if textRecords: 
     107        license["text"] = textRecords 
     108    destination.woffMetadataLicense = license 
     109 
     110def _extractWOFFMetadataCopyright(element, destination): 
     111    copyright = {} 
     112    textRecords = _extractWOFFMetadataText(element) 
     113    if textRecords: 
     114        copyright["text"] = textRecords 
     115    destination.woffMetadataCopyright = copyright 
     116 
     117def _extractWOFFMetadataTrademark(element, destination): 
     118    trademark = {} 
     119    textRecords = _extractWOFFMetadataText(element) 
     120    if textRecords: 
     121        trademark["text"] = textRecords 
     122    destination.woffMetadataTrademark = trademark 
     123 
     124def _extractWOFFMetadataLicensee(element, destination): 
     125    destination.woffMetadataLicensee = _extractWOFFMetadataDict(element, ("name", "dir", "class")) 
     126 
     127def _extractWOFFMetadataExtension(element, destination): 
     128    extension = _extractWOFFMetadataDict(element, ("id",)) 
     129    for subElement in element: 
     130        if subElement.tag == "name": 
     131            if "names" not in extension: 
     132                extension["names"] = [] 
     133            name = _extractWOFFMetadataExtensionName(subElement) 
     134            extension["names"].append(name) 
     135        elif subElement.tag == "item": 
     136            if "items" not in extension: 
     137                extension["items"] = [] 
     138            item = _extractWOFFMetadataExtensionItem(subElement) 
     139            extension["items"].append(item) 
     140    extensions = [] 
     141    if destination.woffMetadataExtensions: 
     142        extensions.update(destination.woffMetadataExtensions) 
     143    e = extensions + [extension] 
     144    destination.woffMetadataExtensions = extensions + [extension] 
     145 
     146def _extractWOFFMetadataExtensionItem(element): 
     147    item = _extractWOFFMetadataDict(element, ("id",)) 
     148    for subElement in element: 
     149        if subElement.tag == "name": 
     150            if "names" not in item: 
     151                item["names"] = [] 
     152            name = _extractWOFFMetadataExtensionName(subElement) 
     153            item["names"].append(name) 
     154        elif subElement.tag == "value": 
     155            if "values" not in item: 
     156                item["values"] = [] 
     157            name = _extractWOFFMetadataExtensionValue(subElement) 
     158            item["values"].append(name) 
     159    return item 
     160 
     161def _extractWOFFMetadataExtensionName(element): 
     162    name = _extractWOFFMetadataDict(element, ("dir", "class")) 
     163    language = _extractWOFFMetadataLanguage(element) 
     164    if language is not None: 
     165        name["language"] = language 
     166    name["text"] = _flattenWOFFMetadataString(element) 
     167    return name 
     168 
     169def _extractWOFFMetadataExtensionValue(element): 
     170    return _extractWOFFMetadataExtensionName(element) 
     171 
     172# support 
     173 
     174def _extractWOFFMetadataDict(element, attributes): 
     175    record = {} 
     176    for attribute in attributes: 
     177        value = element.attrib.get(attribute) 
     178        if value is not None: 
     179            record[attribute] = value 
     180    return record 
     181 
     182def _extractWOFFMetadataText(element): 
     183    records = [] 
     184    attributes = ("dir", "class") 
     185    for subElement in element: 
     186        record = _extractWOFFMetadataDict(subElement, attributes) 
     187        # text 
     188        record["text"] = _flattenWOFFMetadataString(subElement) 
     189        # language 
     190        language = _extractWOFFMetadataLanguage(subElement) 
     191        if language is not None: 
     192            record["language"] = language 
     193        records.append(record) 
     194    return records 
     195 
     196def _extractWOFFMetadataLanguage(element): 
     197    language = element.attrib.get("{http://www.w3.org/XML/1998/namespace}lang") 
     198    if language is None: 
     199        language = element.attrib.get("lang") 
     200    return language 
     201 
     202def _flattenWOFFMetadataString(element, sub=False): 
     203    text = element.text.strip() 
     204    for subElement in element: 
     205        text += _flattenWOFFMetadataString(subElement, sub=True) 
     206    if element.tail: 
     207        text += element.tail.strip() 
     208    if sub: 
     209        attrib = ["%s=%s" % (key, quoteattr(value)) for key, value in element.attrib.items()] 
     210        attrib = " ".join(attrib) 
     211        start = "<%s %s>" % (element.tag, attrib) 
     212        end = "</%s>" % (element.tag) 
     213        text = start + text + end 
     214    return text 
Note: See TracChangeset for help on using the changeset viewer.