#-- # fontcollection.rb # Last Change: Tue May 16 19:02:11 2006 #++ require 'rfil/rfi' require 'rfil/font' require 'rfil/helper' module RFIL # :nodoc: class RFI # A set of fonts (regular,bold,italic). Used to write an fd-file for # LaTeX or a typescript for ConTeXt. Register different fonts and set # encodings, so you dont't have to specify them in each font. class FontCollection include Helper def self.documented_as_accessor(*args) # :nodoc: end def self.documented_as_reader(*args) # :nodoc: end attr_accessor :vendor # attr_accessor :fontname # Name of the font (collection) attr_accessor :name # One object or one or more objects in an array that describe the # encoding of the postscript font. Object can either be a string # that represents the filename of the encoding ("8r.enc", "8r") or # an ENC object that already contains the encoding documented_as_accessor :mapenc # One object or one ore more objects in an array that describe the # encoding of the font TeX expects. Object can either be a string # that represents the filename of the encoding ("8r.enc", "8r") or # an ENC object that already contains the encoding documented_as_accessor :texenc # hash of directories for writing files. Default to current working # directory. The setting in the Font object overrides the setting here. attr_accessor :dirs attr_accessor :fonts # sans, roman, typewriter attr_accessor :style attr_accessor :write_vf attr_accessor :options # list of temps documented_as_reader :plugins def initialize() @kpse=Kpathsea.new @basedir=nil @name=nil @texenc=nil @mapenc=nil @write_vf=true @fonts=[] @options={:verbose=>false,:dryrun=>false} @style=nil @dirs={} @vendor=nil @fontname=nil set_dirs(Dir.getwd) @plugins={} # find temps-plugins $:.each{ |d| a=Dir.glob(d+"/rfil/rfi_plugin_*.rb") a.each{ |f| require f } } ObjectSpace.each_object(Class){ |x| if Plugin > x t = x.new(self) n = t.name if @plugins.has_key?(n) raise "Name already registered" end @plugins[n]=t end } # done initializing plugins end # Add a font to the collection. Return the number of the font. def register_font (font) unless font.respond_to?(:maplines) raise ArgumentError, "parameter does not look like a font" end fontnumber=@fonts.size @fonts << font return fontnumber end def run_plugin(name) raise "don't know plugin #{name}" unless @plugins.has_key?(name) # doc for run_plugin # Return the contents of the file that should be used by the TeX # macro package, i.e a typescript for ConTeXt or an fd-file for # Context. Return value is an Array of Hashes. The Hash has three # different keys: # [:type] The type of the file, should be either :fd or :typescript. # [:filename] the filename (without a path) of the file # [:contents] the contents of the file. files=@plugins[name].run_plugin if files.respond_to?(:each) files.each { |fh| dir=get_dir(fh[:type]) filename=File.join(dir,fh[:filename]) puts "writing file #{filename}" if @options[:verbose] unless @options[:dryrun] ensure_dir(dir) File.open(filename,"w") { |f| f << fh[:contents] } end } end end def plugins #:nodoc: @plugins.keys end def mapfile mapfile=[] @fonts.each {|font| mapfile << font.maplines } mapfile.flatten end def mapenc # :nodoc: return nil if @mapenc==:none @mapenc end def mapenc= (enc) # :nodoc: set_mapenc(enc) end def texenc # :nodoc: if @texenc @texenc else # @texenc not set ret=nil @kpse.open_file("8a.enc","enc") { |f| ret = [ENC.new(f)] } return ret end end def texenc= (enc) # :nodoc: @texenc=[] set_encarray(enc,@texenc) end def get_dir(type) @dirs[type] end def write_files(options={}) mapdir=get_dir(:map); ensure_dir(mapdir) @fonts.each {|font| font.write_files(:mapfile => false) mapfile << font.maplines } mapfilename=File.join(mapdir,@name+".map") unless options[:dryrun]==true File.open(mapfilename, "w") {|file| file << mapfile.to_s } end end end end # class RFI end # module RFIL