friendsoftheweb/woff-rb

View on GitHub
lib/woff/builder.rb

Summary

Maintainability
B
6 hrs
Test Coverage
module WOFF
  # Used in generation of WOFF files with modified metadata for licensee and
  # license id information.
  #
  #   woff = WOFF::Builder.new("/Users/Josh/Desktop/sample.woff")
  #   woff.font_with_licensee_and_id("The Friends", "L012356093901")
  #
  class Builder
    def initialize(file)
      @location = file
    end

    def font_with_licensee_and_id(name, id)
      font_with_metadata(licensee: name, license_id: id)
    end

    def font_with_metadata(licensee: nil, license_id: nil, license_text: nil, description: nil)
      metadata_xml = data.metadata.length > 0 ? compressor.inflate(data.metadata) : default_metadata
      metadata_doc = REXML::Document.new(metadata_xml)

      if licensee
        if metadata_doc.root.elements["licensee"]
          metadata_doc.root.elements["licensee"].attributes["name"] = licensee
        else
          metadata_doc.root.add_element "licensee", { "name" => licensee }
        end
      end

      if license_id
        if metadata_doc.root.elements["license"]
          metadata_doc.root.elements["license"].attributes["id"] = license_id
        else
          metadata_doc.root.add_element "license", { "id" => license_id }
        end
      end

      if license_text
        license_el = metadata_doc.root.elements["license"]
        unless license_el
          license_el = metadata_doc.root.add_element "license"
        end

        license_text_el = license_el.elements["text"]
        unless license_text_el
          license_text_el = license_el.add_element("text", { "lang" => "en "})
        end

        license_text_el.text = license_text
      end

      if description
        description_el = metadata_doc.root.elements["description"]
        unless description_el
          description_el = metadata_doc.root.add_element "description"
        end

        description_text_el = description_el.elements["text"]
        unless description_text_el
          description_text_el = description_el.add_element("text", { "lang" => "en "})
        end

        description_text_el.text = description
      end

      compressed_metadata = compressor.deflate(metadata_doc.to_s)

      data.meta_orig_length = metadata_doc.to_s.bytesize
      data.metadata = compressed_metadata
      data.meta_length = compressed_metadata.bytesize
      data.meta_offset = data.metadata.abs_offset # "Offset to metadata block, from beginning of WOFF file."

      data.data_length = data.num_bytes

      data.to_binary_s
    end


    private
    attr_reader :location

    def data
      @data ||= WOFF::File.read(::File.open(location))
    end

    def compressor
      case data
      when WOFF::File::V1
        ::Zlib
      when WOFF::File::V2
        ::Brotli
      end
    end

    def default_metadata
      %Q{<?xml version="1.0" encoding="UTF-8"?><metadata version="1.0"></metadata>}
    end
  end
end