#!/usr/bin/env ruby #-- # Last Change: Tue May 16 21:01:40 2006 #++ =begin rdoc = rfont -- An example font installer rfont uses the RFI Library for installing a family of fonts. == Command line parameters Usage: rfont [options] vendor/fontname FILE1 FILE2 ... -c, --copy-fonts Also copy the font outlines -d, --directory DIR Set base directory to DIR --dry-run dry run, don't create any files -m, --list-plugin list available macro support methods -p ENCFILE read/download ENCFILE for the PostScript encoding -s, --style STYLE Style of the font, eg. sans, roman, typewriter --tds Put files in a TDS compliant directory hierarchy -t ENCFILE read ENCFILE for the encoding of the vf file multiple encodings can be given (seperated by ',') -T ENCFILE equivalent to -p ENCFILE -t ENCFILE -u, --use-plugin PLUGIN use plugin files PLUGIN, multiple files seperated by ',' -v, --no-vf Do not create virtual fonts for reencoding --verbose Print more then needed on stdout --help print this message and exit. --version print version number and exit. == Example usage This is the command line I used to install the Bitstream variant of the font 'Syntax' (from the Corel Draw CD) ./rfont bitstream/syntax ../corel/hum531*afm -t ec,ts1 -p 8r -d ~/rfitexmf/ -u latex -s sans --verbose --tds -c It works, but the .fd-file is not perfect yet. --- Author:: Patrick Gundlach License:: Copyright (c) 2005 Patrick Gundlach. Released under the terms of the GNU General Public License =end # :enddoc: require 'optparse' require 'ostruct' require 'fileutils' require 'rfil/fontcollection' include RFIL options=OpenStruct.new optionswritevf=true fc=RFI::FontCollection.new ret= ARGV.options { |opts| opts.banner = "Usage: #{File.basename($0)} [options] vendor/fontname FILE1 FILE2 ..." opts.on("-c", "--copy-fonts", "Also copy the font outlines") { options.copyfonts=true } opts.on("-d DIR", "--directory", "Set base directory to DIR") { |d| fc.set_dirs(d) } opts.on("--dry-run", "dry run, don't create any files") { fc.options[:dryrun]=true options.dryrun=true } opts.on("-m", "--list-plugin", "list available plugins") { puts "The following plugins are known:" puts fc.plugins exit 0; } opts.on("-p ENCFILE", String, "read/download ENCFILE for the PostScript encoding") {|e| fc.mapenc = e } opts.on("-s STYLE", "--style", String, "Style of the font, eg. sans, roman, typewriter") { |s| fc.style=s.to_sym } opts.on("--tds", "Put files in a TDS compliant directory hierarchy") { options.tds=true } opts.on("-t ENCFILE",Array, "read ENCFILE for the encoding of the vf file", "multiple encodings can be given (seperated by ',')") {|e| fc.texenc = e } opts.on("-T ENCFILE",String,"equivalent to -p ENCFILE -t ENCFILE") {|e| fc.mapenc = e fc.texenc = e } opts.on("-u PLUGIN","--use-plugin",Array, "use plugin PLUGIN, multiple files seperated by ','") { |m| options.plugin=m } opts.on("-v", "--no-vf", "Do not create virtual fonts for reencoding") { fc.write_vf=false } opts.on("--verbose","Print more then needed on stdout") { options.verbose=true fc.options[:verbose]=true } opts.on_tail("--help","print this message and exit.") { puts opts; exit 0 } opts.on_tail("--version","print version number and exit.") { puts "#{File.basename($0)}: Version 0.1" exit 0 } opts.parse! } unless ret puts "See --help for usage information" exit(-1) end vendor_fontname=ARGV.shift if vendor_fontname options.vendor,options.fontname=vendor_fontname.split('/') end if options.vendor==nil or options.fontname==nil puts "You must name vendor and fontname this way: vendor/fontname" puts "See --help for usage information" exit(-1) end fc.name=options.fontname fc.vendor=options.vendor fc.set_dirs(:tds=>true) if options.tds fonts=[] maplines="" fontoutlinedir=File.dirname(ARGV[0]) ARGV.each { |fontname| # puts "reading font #{File.basename(fontname)}" f=RFI::Font.new(fc) f.load_variant(fontname) fonts.push f } fc.fonts.each { |font| puts "Processing font #{font.defaultfm.fontname}" font.guess_weight_variant font.apply_ligkern_instructions(RFI::STDLIGKERN) font.write_files(:dryrun=>options.dryrun==true, :verbose=>false, :mapfile=>false ) maplines << font.maplines.to_s } if options.copyfonts fc.fonts.each { |font| font.find_used_fonts.each {|varnumber| fontmetric=font.variants[varnumber] destdir=font.get_dir(fontmetric.outlinetype) sourcefile=File.join(fontoutlinedir,fontmetric.fontfilename) destfile=File.join(destdir,fontmetric.fontfilename) puts "Copying #{sourcefile} to #{destfile}" if options.verbose fc.ensure_dir(destdir) unless options.dryrun FileUtils.cp(sourcefile,destfile) end } } end mapdir=fc.get_dir(:map) mapfile=File.join(mapdir,options.fontname) puts "Writing mapfile #{mapfile}" if options.verbose unless fc.options[:dryrun] fc.ensure_dir(mapdir) File.open(mapfile + ".map", "w") { |f| f << maplines } end if options.plugin options.plugin.each { |m| fc.run_plugin(m.to_sym) } end