lib/ttfunk/table/name.rb in ttfunk-1.7.0 vs lib/ttfunk/table/name.rb in ttfunk-1.8.0

- old
+ new

@@ -3,107 +3,224 @@ require_relative '../table' require 'digest/sha1' module TTFunk class Table + # Naming (`name`) table class Name < Table + # Name Record. class NameString < ::String + # Platform ID. + # @return [Integer] attr_reader :platform_id + + # Platform-specific encoding ID. + # @return [Integer] attr_reader :encoding_id + + # Language ID. + # @return [Integer] attr_reader :language_id + # @param text [String] + # @param platform_id [Integer] + # @param encoding_id [Integer] + # @param language_id [Integer] def initialize(text, platform_id, encoding_id, language_id) super(text) @platform_id = platform_id @encoding_id = encoding_id @language_id = language_id end + # Removes chracter incompatible with PostScript. + # @return [String] PostScript-compatible version of this string. def strip_extended stripped = gsub(/[\x00-\x19\x80-\xff]/n, '') stripped = '[not-postscript]' if stripped.empty? stripped end end + # Name records. + # @return [Array<Hash>] attr_reader :entries + + # Name strings. + # @return [Hash{Integer => NameString}] attr_reader :strings + # Copyright notice. + # @return [Array<NameString>] attr_reader :copyright + + # Font Family names. + # @return [Array<NameString>] attr_reader :font_family + + # Font Subfamily names. + # @return [Array<NameString>] attr_reader :font_subfamily + + # Unique font identifiers. + # @return [Array<NameString>] attr_reader :unique_subfamily + + # Full font names. + # @return [Array<NameString>] attr_reader :font_name + + # Version strings. + # @return [Array<NameString>] attr_reader :version + + # Trademarks. + # @return [Array<NameString>] attr_reader :trademark + + # Manufacturer Names. + # @return [Array<NameString>] attr_reader :manufacturer + + # Designers. + # @return [Array<NameString>] attr_reader :designer + + # Descriptions. + # @return [Array<NameString>] attr_reader :description + + # Vendor URLs. + # @return [Array<NameString>] attr_reader :vendor_url + + # Designer URLs. + # @return [Array<NameString>] attr_reader :designer_url + + # License Descriptions. + # @return [Array<NameString>] attr_reader :license + + # License Info URLs. + # @return [Array<NameString>] attr_reader :license_url + + # Typographic Family names. + # @return [Array<NameString>] attr_reader :preferred_family + + # Typographic Subfamily names. + # @return [Array<NameString>] attr_reader :preferred_subfamily + + # Compatible Full Names. + # @return [Array<NameString>] attr_reader :compatible_full + + # Sample texts. + # @return [Array<NameString>] attr_reader :sample_text + # Copyright notice ID. COPYRIGHT_NAME_ID = 0 + + # Font Family name ID. FONT_FAMILY_NAME_ID = 1 + + # Font Subfamily name ID. FONT_SUBFAMILY_NAME_ID = 2 + + # Unique font identifier ID. UNIQUE_SUBFAMILY_NAME_ID = 3 + + # Full font name that reflects all family and relevant subfamily + # descriptors ID. FONT_NAME_NAME_ID = 4 + + # Version string ID. VERSION_NAME_ID = 5 + + # PostScript name for the font ID. POSTSCRIPT_NAME_NAME_ID = 6 + + # Trademark ID. TRADEMARK_NAME_ID = 7 + + # Manufacturer Name ID. MANUFACTURER_NAME_ID = 8 + + # Designer ID. DESIGNER_NAME_ID = 9 + + # Description ID. DESCRIPTION_NAME_ID = 10 + + # Vendor URL ID. VENDOR_URL_NAME_ID = 11 + + # Designer URL ID. DESIGNER_URL_NAME_ID = 12 + + # License Description ID. LICENSE_NAME_ID = 13 + + # License Info URL ID. LICENSE_URL_NAME_ID = 14 + + # Typographic Family name ID. PREFERRED_FAMILY_NAME_ID = 16 + + # Typographic Subfamily name ID. PREFERRED_SUBFAMILY_NAME_ID = 17 + + # Compatible Full ID. COMPATIBLE_FULL_NAME_ID = 18 + + # Sample text ID. SAMPLE_TEXT_NAME_ID = 19 + # Encode table. + # + # @param names [TTFunk::Table::Name] + # @param key [String] + # @return [String] def self.encode(names, key = '') tag = Digest::SHA1.hexdigest(key)[0, 6] - postscript_name = NameString.new( - "#{tag}+#{names.postscript_name}", 1, 0, 0 - ) + postscript_name = NameString.new("#{tag}+#{names.postscript_name}", 1, 0, 0) strings = names.strings.dup strings[6] = [postscript_name] str_count = strings.reduce(0) { |sum, (_, list)| sum + list.length } - table = [0, str_count, 6 + 12 * str_count].pack('n*') + table = [0, str_count, 6 + (12 * str_count)].pack('n*') strtable = +'' items = [] strings.each do |id, list| list.each do |string| items << [id, string] end end items = - items.sort_by do |id, string| + items.sort_by { |id, string| [string.platform_id, string.encoding_id, string.language_id, id] - end + } items.each do |id, string| table << [ string.platform_id, string.encoding_id, string.language_id, id, - string.length, strtable.length + string.length, strtable.length, ].pack('n*') strtable << string end table << strtable end + # PostScript name for the font. + # @return [String] def postscript_name return @postscript_name if @postscript_name font_family.first || 'unnamed' end @@ -122,11 +239,11 @@ encoding_id: encoding, language_id: language, name_id: id, length: length, offset: offset + string_offset + start_offset, - text: nil + text: nil, } end @strings = Hash.new { |h, k| h[k] = [] } @@ -135,10 +252,10 @@ @entries[i][:text] = io.read(@entries[i][:length]) @strings[@entries[i][:name_id]] << NameString.new( @entries[i][:text] || '', @entries[i][:platform_id], @entries[i][:encoding_id], - @entries[i][:language_id] + @entries[i][:language_id], ) end # should only be ONE postscript name