rfil 0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/examples/plinfo ADDED
@@ -0,0 +1,108 @@
1
+ #!/usr/bin/env ruby
2
+ #--
3
+ # Last Change: Tue May 16 18:14:38 2006
4
+ #++
5
+ =begin rdoc
6
+ == plinfo -- output information about a pl file.
7
+
8
+ Usage: plinfo [options] tfmfile.pl [file...]
9
+ -e, --encoding enc set the encoding for the file
10
+ -l, --list-chars list all available characters
11
+ -h, --help Show this help
12
+
13
+
14
+ ---
15
+ Author:: Patrick Gundlach <patrick@gundla.ch>
16
+ License:: Copyright (c) 2005 Patrick Gundlach.
17
+ Released under the terms of the GNU General Public License
18
+ =end
19
+
20
+
21
+ # :enddoc:
22
+
23
+ require 'optparse'
24
+ require 'ostruct'
25
+
26
+ require 'tex/tfm'
27
+ require 'tex/kpathsea'
28
+ require 'tex/enc'
29
+
30
+ include TeX
31
+
32
+ kpse=Kpathsea.new
33
+
34
+ @options=OpenStruct.new
35
+
36
+ ARGV.options { |opt|
37
+ opt.banner = "Usage: #{File.basename($0)} [options] tfmfile.pl [file...]"
38
+ opt.on("--encoding enc", "-e", "set the encoding for the file") { |e|
39
+ kpse.open_file(e,"enc") { |f|
40
+ @options.encoding = ENC.new(f)
41
+ }
42
+ }
43
+ opt.on("--list-chars", "-l", "list all available characters") {
44
+ @options.listchars=true }
45
+ opt.on("--help", "-h", "Show this help") { puts opt; exit 0 }
46
+ opt.separator ""
47
+ opt.parse!
48
+ }
49
+
50
+ if ARGV.size < 1
51
+ puts "#{File.basename($0)}: Need at least one file argument."
52
+ puts "Try `#{File.basename($0)} --help' for more information."
53
+ exit 0
54
+ end
55
+
56
+
57
+ def dump_maininfo(filename)
58
+ puts "General font information:"
59
+ puts "========================="
60
+ print "filename=#{File.basename(filename)} "
61
+ # puts @isvpl ? "(vpl)" : "(pl)"
62
+ puts "Family: #{@tfm.fontfamily}"
63
+ puts "Designsize: #{@tfm.designsize}"
64
+ puts "Codingscheme: #{@tfm.codingscheme}"
65
+ puts "Fontdimen:"
66
+ paramname=%w( SLANT SPACE STRETCH SHRINK XHEIGHT QUAD EXTRASPACE )
67
+ if @tfm.codingscheme=="TeX math symbols"
68
+ paramname += %w(NUM1 NUM2 NUM3 DENOM1 DENOM2 SUP1 SUP2 SUP3
69
+ SUB1 SUB2 SUPDROP)
70
+ elsif @tfm.codingscheme=="TeX math extension"
71
+ paramname += %w(DEFAULT_RULE_THICKNESS BIG_OP_SPACING1
72
+ BIG_OP_SPACING2 BIG_OP_SPACING3 BIG_OP_SPACING4 BIG_OP_SPACING5)
73
+ end
74
+
75
+ (1..@tfm.params.size-1).each {|i|
76
+ puts " #{paramname[i-1]} = #{@tfm.params[i]}"
77
+ }
78
+ end
79
+
80
+ def dump_charsinfo
81
+ stdformat="%9s|"
82
+ count=0
83
+ 0.upto(255) { |i|
84
+ if c=@tfm.chars[i]
85
+ if count % 32 == 0
86
+ puts "\n slot| width | height | depth | ic |lig/kern?| extra | char"
87
+ puts "-----|---------|---------|---------|---------|---------|---------|-------"
88
+ end
89
+
90
+ has_krn= c[:lig_kern] ? "yes" : ""
91
+ extra = ""
92
+ char = @options.encoding ? @options.encoding[i] : ""
93
+ puts sprintf("%5s|"+stdformat*6+" %s", "#{i}","#{c[:charwd]}","#{c[:charht]}","#{c[:chardp]}","#{c[:charic]}", has_krn,"",char)
94
+ count += 1
95
+
96
+ end
97
+
98
+ }
99
+ end
100
+
101
+ ARGV.each { |plfilename|
102
+ @tfm=TFM.new()
103
+ @tfm.read_pl(plfilename)
104
+ dump_maininfo(plfilename)
105
+ if @options.listchars
106
+ dump_charsinfo
107
+ end
108
+ }
data/examples/rfii ADDED
@@ -0,0 +1,257 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # :enddoc:
4
+
5
+ require 'pp'
6
+ require 'ostruct'
7
+ require 'fileutils'
8
+
9
+
10
+ require 'rfil/fontcollection'
11
+ require 'tex/kpathsea'
12
+
13
+ $:.unshift File.dirname($0)
14
+ require 'rfii.tab'
15
+
16
+
17
+ class RFII # :nodoc:
18
+ include RFIL
19
+ include TeX
20
+
21
+ def initialize
22
+ @instructions=[]
23
+ @known_encodings=Hash.new
24
+ @fontset=nil
25
+ @kpse=Kpathsea.new
26
+ @known_outputfiles=[:vf,:sty,:tfm,:typescript,:fd,:map]
27
+ @fontfiles_copied=nil
28
+ @vendor=nil
29
+ @texencodings=[]
30
+ @psencoding=[]
31
+ @fontroot=File.expand_path(Dir.pwd)
32
+ @options=OpenStruct.new
33
+ @options.verbose=false
34
+ @options.dryrun=false
35
+ @options.tds=true
36
+ @fc=nil
37
+ end
38
+
39
+ def parse_file(filename)
40
+ f=File.open(filename)
41
+ @s=StringScanner.new(f.read)
42
+ f.close
43
+ @mode=:normal
44
+ @line=1
45
+ yyparse(self,:scan)
46
+ end
47
+
48
+ def on_error(error_token_id,error_value,value_stack)
49
+ # puts "error"
50
+ error=token_to_str(error_token_id)
51
+ p error_value,value_stack
52
+ puts "parse error near line #@line, exiting, next string: '#{error_value}#{@s.rest[0..20]}...'"
53
+ exit 1
54
+ # the default action would be:
55
+ # raise ParseError
56
+ end
57
+
58
+ def ensure_encoding(enc)
59
+ unless @known_encodings.has_key?(enc)
60
+ puts "Unknown encoding #{enc} in line #{@line}"
61
+ exit 1
62
+ end
63
+ end
64
+
65
+ def get_encodings(symbols)
66
+ symbols.collect { |encoding|
67
+ ensure_encoding(encoding)
68
+ @known_encodings[encoding]
69
+ }
70
+ end
71
+ def get_encoding(symbol)
72
+ return :none if symbol==:none or symbol==:same_as_texencoding
73
+ ensure_encoding(symbol)
74
+ @known_encodings[symbol]
75
+ end
76
+
77
+ def get_fonts(ident)
78
+ towrite=[]
79
+ case ident
80
+ when [:all],nil
81
+ towrite=@fontset.keys
82
+ else
83
+ towrite=ident
84
+ end
85
+ fontlist=[]
86
+ towrite.each{ |font|
87
+ if @fontset.has_key?(font)
88
+ fontlist << @fontset[font]
89
+ else
90
+ puts "Font for #{ident} in line #{@line} unknown, ignoring"
91
+ end
92
+ }
93
+ fontlist
94
+ end
95
+ def run_instructions
96
+ @instructions.each { |line,i|
97
+ @line=line
98
+ instr,*rest=i
99
+ case instr
100
+ when :useencoding
101
+ # this should be in parser:
102
+ if rest[1]==:none or rest[1]==:same_as_texencoding
103
+ puts "invalid encoding name"
104
+ exit 1
105
+ end
106
+ @kpse.open_file(rest[0],"enc") { |encfile|
107
+ @known_encodings[rest[1]]=ENC.new(encfile)
108
+ }
109
+ when :psencoding
110
+ @psencoding=get_encoding(rest[0])
111
+ when :texencoding
112
+ @texencodings=get_encodings(rest[0])
113
+ when :fontroot
114
+ @fontroot=File.expand_path(rest[0])
115
+ unless File.exists?(@fontroot) and File.directory?(@fontroot)
116
+ puts "fontroot (#{@fontroot})is not a valid directory"
117
+ exit 1
118
+ end
119
+ when :fontsource
120
+ @fontsource=File.expand_path(rest[0])
121
+ unless File.exists?(@fontsource) and File.directory?(@fontsource)
122
+ puts "fontsource (#{@fontsource})is not a valid directory"
123
+ exit 1
124
+ end
125
+ when :newfont
126
+ @fontset={}
127
+ @fontfiles_copied={}
128
+ @fc=RFI::FontCollection.new
129
+ @fc.options[:dryrun]=@options.dryrun
130
+ @fc.options[:verbose]=@options.verbose
131
+ @fc.vendor=@vendor
132
+ @fc.name=rest[0]
133
+ @fc.set_dirs({:base=>@fontroot, :tds=>@options.tds})
134
+ @fc.mapenc=@psencoding
135
+ @fc.texenc=@texencodings
136
+ @fc.style=rest[1]
137
+ when :useafm
138
+ fontfilename=rest[0]
139
+ ident=rest[1]
140
+ srcpath=File.join(@fontsource,fontfilename)
141
+ unless @fontfiles_copied.has_key?(fontfilename) and @options.copyfonts
142
+ @fontfiles_copied[fontfilename]=true # dummy value, used as Set
143
+
144
+ if @options.verbose
145
+ puts "copy #{srcpath} to #{@fc.dirs[:afm]}"
146
+ end
147
+ unless @options.dryrun
148
+ @fc.ensure_dir(@fc.dirs[:afm])
149
+ FileUtils.cp(srcpath,@fc.dirs[:afm])
150
+ end
151
+ if @options.verbose
152
+ puts "copy #{srcpath.chomp(".afm")}.pfb to #{@fc.dirs[:type1]}"
153
+ end
154
+ unless @options.dryrun
155
+ @fc.ensure_dir(@fc.dirs[:type1])
156
+ FileUtils.cp(srcpath.chomp(".afm")+".pfb",@fc.dirs[:type1])
157
+ end
158
+ end
159
+ f=RFI::Font.new(@fc)
160
+ i=f.load_variant(File.join(@fontsource,fontfilename))
161
+ @fontset[ident]=f
162
+ case ident
163
+ when :italic
164
+ f.variant=:italic
165
+ when :slanted
166
+ f.variant=:slanted
167
+ when :bold
168
+ f.weight=:bold
169
+ when :bolditalic
170
+ f.variant=:italic
171
+ f.weight=:bold
172
+ when :boldslanted
173
+ f.variant=:slanted
174
+ f.weight=:bold
175
+ when :smallcaps
176
+ f.variant=:smallcaps
177
+ end
178
+ when :write
179
+ # p rest
180
+ texencodings = if rest[2]
181
+ get_encodings(rest[2])
182
+ else
183
+ @texencodings
184
+ end
185
+
186
+ psencoding = rest[3] ? get_encoding(rest[3]) : @psencoding
187
+ rest[0].each { |filetype|
188
+ case filetype
189
+ when :vf
190
+ get_fonts(rest[1]).each { |font|
191
+ font.texenc=texencodings
192
+ font.mapenc=psencoding
193
+ font.write_files({:mapfile=>false})
194
+ }
195
+ when :map
196
+ m = get_fonts(rest[1]).collect { |font|
197
+ font.texenc=texencodings
198
+ font.mapenc=psencoding
199
+ font.maplines
200
+ }
201
+ mapdir=@fc.get_dir(:map); @fc.ensure_dir(mapdir)
202
+ mapfilename=File.join(mapdir,@fc.name+".map")
203
+ if @options.verbose
204
+ puts "writing mapfile to #{mapfilename}"
205
+ end
206
+ unless @options.dryrun
207
+ File.open(mapfilename, "w") {|file|
208
+ file.puts m
209
+ }
210
+ end
211
+ when :fd
212
+ @fc.run_temps(:latex)
213
+ when :typescript
214
+ @fc.run_temps(:context)
215
+ else
216
+ puts "unknown filetype: #{filetype}, ignoring"
217
+ end
218
+ }
219
+ when :vendor
220
+ @vendor=rest[0]
221
+ if @fc and @fc.respond_to?(:vendor=)
222
+ @fc.vendor=@vendor
223
+ end
224
+ when :set
225
+ kw,values=rest
226
+ case kw
227
+ when :verbose,:dryrun,:tds,:copyfonts
228
+ if [:true,:false].member?(values)
229
+ @options.send(kw.to_s+"=",values==:true)
230
+ else
231
+ puts "Warning: unkown value for '#{kw}' in line #{@line}, must be one of 'true' or 'false'"
232
+ end
233
+ end
234
+ when :apply
235
+ instr=rest[0]
236
+ case instr
237
+ when :slant
238
+ font=rest[1]
239
+ # p @fontset.has_key?(font)
240
+ @fontset[font].slant=0.167
241
+ else
242
+ puts "Unknown instruction (#{instr}) for apply in line #{@line}. Exiting."
243
+ end
244
+ else
245
+ puts "Unknown instruction (#{instr}) in line #{@line}. Exiting."
246
+ exit 1
247
+ end
248
+ }
249
+ # p @psencoding
250
+ # p @texencodings
251
+ # pp @fc
252
+ end
253
+ end
254
+
255
+ parser = RFII.new
256
+ parser.parse_file("test/inputfile")
257
+ parser.run_instructions
data/examples/rfont ADDED
@@ -0,0 +1,188 @@
1
+ #!/usr/bin/env ruby
2
+ #--
3
+ # Last Change: Tue May 23 20:32:20 2006
4
+ #++
5
+ =begin rdoc
6
+ = rfont -- An example font installer
7
+
8
+ rfont uses the RFI Library for installing a family of fonts.
9
+
10
+ == Command line parameters
11
+ Usage: rfont [options] vendor/fontname FILE1 FILE2 ...
12
+ -c, --copy-fonts Also copy the font outlines
13
+ -d, --directory DIR Set base directory to DIR
14
+ --dry-run dry run, don't create any files
15
+ -m, --list-plugin list available macro support methods
16
+ -p ENCFILE read/download ENCFILE for the PostScript encoding
17
+ -s, --style STYLE Style of the font, eg. sans, roman, typewriter
18
+ --tds Put files in a TDS compliant directory hierarchy
19
+ -t ENCFILE read ENCFILE for the encoding of the vf file
20
+ multiple encodings can be given (seperated by ',')
21
+ -T ENCFILE equivalent to -p ENCFILE -t ENCFILE
22
+ -u, --use-plugin PLUGIN use plugin files PLUGIN, multiple files seperated by ','
23
+ -v, --no-vf Do not create virtual fonts for reencoding
24
+ --verbose Print more then needed on stdout
25
+ --help print this message and exit.
26
+ --version print version number and exit.
27
+
28
+ == Example usage
29
+ This is the command line I used to install the Bitstream variant of the font 'Syntax' (from the Corel Draw CD)
30
+
31
+ ./rfont bitstream/syntax ../corel/hum531*afm -t ec,ts1 -p 8r -d ~/rfitexmf/ -u latex -s sans --verbose --tds -c
32
+
33
+ It works, but the <tt>.fd</tt>-file is not perfect yet.
34
+ ---
35
+ Author:: Patrick Gundlach <patrick@gundla.ch>
36
+ License:: Copyright (c) 2005 Patrick Gundlach.
37
+ Released under the terms of the GNU General Public License
38
+
39
+ =end
40
+
41
+ # :enddoc:
42
+
43
+ require 'optparse'
44
+ require 'ostruct'
45
+ require 'fileutils'
46
+
47
+ require 'rfil/fontcollection'
48
+
49
+ include RFIL
50
+
51
+ options=OpenStruct.new
52
+ optionswritevf=true
53
+ fc=RFI::FontCollection.new
54
+
55
+ ret= ARGV.options { |opts|
56
+ opts.banner = "Usage: #{File.basename($0)} [options] vendor/fontname FILE1 FILE2 ..."
57
+ opts.on("-c", "--copy-fonts", "Also copy the font outlines") {
58
+ options.copyfonts=true
59
+ }
60
+
61
+ opts.on("-d DIR", "--directory", "Set base directory to DIR") { |d|
62
+ fc.set_dirs(d)
63
+ }
64
+ opts.on("--dry-run", "dry run, don't create any files") {
65
+ fc.options[:dryrun]=true
66
+ options.dryrun=true
67
+ }
68
+ opts.on("-m", "--list-plugin", "list available plugins") {
69
+ puts "The following plugins are known:"
70
+ puts fc.plugins
71
+ exit 0;
72
+ }
73
+ opts.on("-p ENCFILE", String,
74
+ "read/download ENCFILE for the PostScript encoding") {|e|
75
+ fc.mapenc = e
76
+ }
77
+ opts.on("-s STYLE", "--style", String, "Style of the font, eg. sans, roman, typewriter") { |s|
78
+ fc.style=s.to_sym
79
+ }
80
+ opts.on("--tds", "Put files in a TDS compliant directory hierarchy") {
81
+ options.tds=true
82
+ }
83
+ opts.on("-t ENCFILE",Array, "read ENCFILE for the encoding of the vf file",
84
+ "multiple encodings can be given (seperated by ',')") {|e|
85
+ fc.texenc = e
86
+ }
87
+ opts.on("-T ENCFILE",String,"equivalent to -p ENCFILE -t ENCFILE") {|e|
88
+ fc.mapenc = e
89
+ fc.texenc = e
90
+ }
91
+ opts.on("-u PLUGIN","--use-plugin",Array, "use plugin PLUGIN, multiple files seperated by ','") { |m|
92
+ options.plugin=m
93
+ }
94
+ opts.on("-v", "--no-vf", "Do not create virtual fonts for reencoding") {
95
+ fc.write_vf=false
96
+ }
97
+ opts.on("--verbose","Print more then needed on stdout") {
98
+ options.verbose=true
99
+ fc.options[:verbose]=true
100
+ }
101
+ opts.on_tail("--help","print this message and exit.") { puts opts; exit 0 }
102
+ opts.on_tail("--version","print version number and exit.") {
103
+ puts "#{File.basename($0)}: Version 0.1"
104
+ exit 0
105
+ }
106
+ opts.parse!
107
+ }
108
+ unless ret
109
+ puts "See --help for usage information"
110
+ exit(-1)
111
+ end
112
+
113
+
114
+ vendor_fontname=ARGV.shift
115
+
116
+ if vendor_fontname
117
+ options.vendor,options.fontname=vendor_fontname.split('/')
118
+ end
119
+ if options.vendor==nil or options.fontname==nil
120
+ puts "You must name vendor and fontname this way: vendor/fontname"
121
+ puts "See --help for usage information"
122
+ exit(-1)
123
+ end
124
+
125
+
126
+
127
+ fc.name=options.fontname
128
+ fc.vendor=options.vendor
129
+
130
+ fc.set_dirs(:tds=>true) if options.tds
131
+
132
+ fonts=[]
133
+ maplines=""
134
+
135
+ if ARGV.empty?
136
+ puts "No fonts given.\nSee --help for usage information"
137
+ exit -1
138
+ end
139
+ fontoutlinedir=File.dirname(ARGV[0])
140
+
141
+ ARGV.each { |fontname|
142
+ # puts "reading font #{File.basename(fontname)}"
143
+ f=RFI::Font.new(fc)
144
+ f.load_variant(fontname)
145
+ fonts.push f
146
+ }
147
+
148
+ fc.fonts.each { |font|
149
+ puts "Processing font #{font.defaultfm.fontname}"
150
+ font.guess_weight_variant
151
+ font.apply_ligkern_instructions(RFI::STDLIGKERN)
152
+ font.write_files(:dryrun=>options.dryrun==true,
153
+ :verbose=>false, :mapfile=>false
154
+ )
155
+ maplines << font.maplines.to_s
156
+ }
157
+
158
+
159
+ if options.copyfonts
160
+ fc.fonts.each { |font|
161
+ font.find_used_fonts.each {|varnumber|
162
+ fontmetric=font.variants[varnumber]
163
+ destdir=font.get_dir(fontmetric.outlinetype)
164
+ sourcefile=File.join(fontoutlinedir,fontmetric.fontfilename)
165
+ destfile=File.join(destdir,fontmetric.fontfilename)
166
+ puts "Copying #{sourcefile} to #{destfile}" if options.verbose
167
+ fc.ensure_dir(destdir)
168
+ unless options.dryrun
169
+ FileUtils.cp(sourcefile,destfile)
170
+ end
171
+ }
172
+ }
173
+ end
174
+
175
+ mapdir=fc.get_dir(:map)
176
+ mapfile=File.join(mapdir,options.fontname)
177
+ puts "Writing mapfile #{mapfile}" if options.verbose
178
+ unless fc.options[:dryrun]
179
+ fc.ensure_dir(mapdir)
180
+ File.open(mapfile + ".map", "w") { |f|
181
+ f << maplines
182
+ }
183
+ end
184
+
185
+ if options.plugin
186
+ options.plugin.each { |m| fc.run_plugin(m.to_sym) }
187
+ end
188
+