ctioga2 0.0
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/COPYING +339 -0
- data/Changelog +6 -0
- data/bin/ctioga2 +26 -0
- data/lib/ctioga2/commands/arguments.rb +58 -0
- data/lib/ctioga2/commands/commands.rb +258 -0
- data/lib/ctioga2/commands/doc/doc.rb +118 -0
- data/lib/ctioga2/commands/doc/documentation-commands.rb +119 -0
- data/lib/ctioga2/commands/doc/help.rb +95 -0
- data/lib/ctioga2/commands/doc/html.rb +230 -0
- data/lib/ctioga2/commands/doc/introspection.rb +211 -0
- data/lib/ctioga2/commands/doc/man.rb +279 -0
- data/lib/ctioga2/commands/doc/markup.rb +359 -0
- data/lib/ctioga2/commands/general-commands.rb +119 -0
- data/lib/ctioga2/commands/general-types.rb +118 -0
- data/lib/ctioga2/commands/groups.rb +73 -0
- data/lib/ctioga2/commands/interpreter.rb +257 -0
- data/lib/ctioga2/commands/parsers/command-line.rb +187 -0
- data/lib/ctioga2/commands/parsers/file.rb +186 -0
- data/lib/ctioga2/commands/strings.rb +303 -0
- data/lib/ctioga2/commands/type.rb +100 -0
- data/lib/ctioga2/commands/variables.rb +101 -0
- data/lib/ctioga2/data/backends/backend.rb +260 -0
- data/lib/ctioga2/data/backends/backends.rb +39 -0
- data/lib/ctioga2/data/backends/backends/gnuplot.rb +140 -0
- data/lib/ctioga2/data/backends/backends/math.rb +121 -0
- data/lib/ctioga2/data/backends/backends/text.rb +335 -0
- data/lib/ctioga2/data/backends/description.rb +405 -0
- data/lib/ctioga2/data/backends/factory.rb +73 -0
- data/lib/ctioga2/data/backends/parameter.rb +109 -0
- data/lib/ctioga2/data/datacolumn.rb +245 -0
- data/lib/ctioga2/data/dataset.rb +233 -0
- data/lib/ctioga2/data/filters.rb +131 -0
- data/lib/ctioga2/data/merge.rb +43 -0
- data/lib/ctioga2/data/point.rb +72 -0
- data/lib/ctioga2/data/stack.rb +294 -0
- data/lib/ctioga2/graphics/coordinates.rb +73 -0
- data/lib/ctioga2/graphics/elements.rb +111 -0
- data/lib/ctioga2/graphics/elements/containers.rb +111 -0
- data/lib/ctioga2/graphics/elements/curve2d.rb +155 -0
- data/lib/ctioga2/graphics/elements/element.rb +90 -0
- data/lib/ctioga2/graphics/elements/primitive.rb +256 -0
- data/lib/ctioga2/graphics/elements/subplot.rb +140 -0
- data/lib/ctioga2/graphics/generator.rb +68 -0
- data/lib/ctioga2/graphics/legends.rb +108 -0
- data/lib/ctioga2/graphics/legends/area.rb +199 -0
- data/lib/ctioga2/graphics/legends/items.rb +183 -0
- data/lib/ctioga2/graphics/legends/provider.rb +58 -0
- data/lib/ctioga2/graphics/legends/storage.rb +65 -0
- data/lib/ctioga2/graphics/root.rb +209 -0
- data/lib/ctioga2/graphics/styles.rb +30 -0
- data/lib/ctioga2/graphics/styles/axes.rb +247 -0
- data/lib/ctioga2/graphics/styles/background.rb +122 -0
- data/lib/ctioga2/graphics/styles/base.rb +115 -0
- data/lib/ctioga2/graphics/styles/carrays.rb +53 -0
- data/lib/ctioga2/graphics/styles/curve.rb +101 -0
- data/lib/ctioga2/graphics/styles/drawable.rb +87 -0
- data/lib/ctioga2/graphics/styles/factory.rb +351 -0
- data/lib/ctioga2/graphics/styles/legend.rb +63 -0
- data/lib/ctioga2/graphics/styles/plot.rb +410 -0
- data/lib/ctioga2/graphics/styles/sets.rb +64 -0
- data/lib/ctioga2/graphics/styles/texts.rb +277 -0
- data/lib/ctioga2/graphics/subplot-commands.rb +141 -0
- data/lib/ctioga2/graphics/types.rb +188 -0
- data/lib/ctioga2/graphics/types/bijection.rb +79 -0
- data/lib/ctioga2/graphics/types/boundaries.rb +170 -0
- data/lib/ctioga2/graphics/types/boxes.rb +157 -0
- data/lib/ctioga2/graphics/types/dimensions.rb +157 -0
- data/lib/ctioga2/graphics/types/point.rb +247 -0
- data/lib/ctioga2/log.rb +97 -0
- data/lib/ctioga2/metabuilder/type.rb +316 -0
- data/lib/ctioga2/metabuilder/types.rb +39 -0
- data/lib/ctioga2/metabuilder/types/coordinates.rb +124 -0
- data/lib/ctioga2/metabuilder/types/dates.rb +43 -0
- data/lib/ctioga2/metabuilder/types/lists.rb +188 -0
- data/lib/ctioga2/metabuilder/types/numbers.rb +97 -0
- data/lib/ctioga2/metabuilder/types/strings.rb +93 -0
- data/lib/ctioga2/metabuilder/types/styles.rb +178 -0
- data/lib/ctioga2/plotmaker.rb +677 -0
- data/lib/ctioga2/postprocess.rb +115 -0
- data/lib/ctioga2/utils.rb +120 -0
- data/setup.rb +1586 -0
- metadata +144 -0
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
# type.rb : a framework for type-to-string-to-type conversion
|
|
2
|
+
# Copyright (C) 2006-2009 Vincent Fourmond
|
|
3
|
+
|
|
4
|
+
# This program is free software; you can redistribute it and/or modify
|
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
|
6
|
+
# the Free Software Foundation; either version 2 of the License, or
|
|
7
|
+
# (at your option) any later version.
|
|
8
|
+
#
|
|
9
|
+
# This program is distributed in the hope that it will be useful, but
|
|
10
|
+
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
12
|
+
# General Public License for more details.
|
|
13
|
+
#
|
|
14
|
+
# You should have received a copy of the GNU General Public License
|
|
15
|
+
# along with this program; if not, write to the Free Software
|
|
16
|
+
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
|
|
17
|
+
# USA
|
|
18
|
+
|
|
19
|
+
require 'ctioga2/utils'
|
|
20
|
+
|
|
21
|
+
module CTioga2
|
|
22
|
+
|
|
23
|
+
Version::register_svn_info('$Revision: 18 $', '$Date: 2009-04-28 23:43:54 +0200 (Tue, 28 Apr 2009) $')
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
# The MetaBuilder module contains a framework to perform
|
|
27
|
+
# string-to-type conversion and other stuff that can be useful for backends.
|
|
28
|
+
module MetaBuilder
|
|
29
|
+
|
|
30
|
+
# An exception that must be raised when
|
|
31
|
+
# Type#string_to_type is given incorrect input.
|
|
32
|
+
class IncorrectInput < Exception
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# An exception raised when an invalid type is given to the
|
|
36
|
+
class InvalidType < Exception
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# A class that handles a parameter type. It has to be subclassed to
|
|
41
|
+
# actually provide a parameter. The subclasses must provide the
|
|
42
|
+
# following:
|
|
43
|
+
#
|
|
44
|
+
# * a #string_to_type function to convert from string to the type;
|
|
45
|
+
# * a #type_to_string to convert back from type to string
|
|
46
|
+
# * an instance #type_name that returns a really small description
|
|
47
|
+
# of the type, to be used for instance to name command-line parameters.
|
|
48
|
+
# * a #type_name statement that registers the current class to the
|
|
49
|
+
# Type system.
|
|
50
|
+
#
|
|
51
|
+
# Moerover, it is a good idea to reimplement the
|
|
52
|
+
# #qt4_create_input_widget method; the default implementation works,
|
|
53
|
+
# but you probably wish it would look better.
|
|
54
|
+
#
|
|
55
|
+
# Types are implemented using hashes: this way, additionnal
|
|
56
|
+
# parameters can easily be added. The hash *must* have a :type key
|
|
57
|
+
# that will be interpreted by the children of Type. Examples:
|
|
58
|
+
#
|
|
59
|
+
# { :type => :integer}
|
|
60
|
+
# { :type => :file, :filter => "Text Files (*.txt)}
|
|
61
|
+
#
|
|
62
|
+
# And so on. You definitely should document your type and it's
|
|
63
|
+
# attributes properly, if you ever want that someone uses it.
|
|
64
|
+
#
|
|
65
|
+
# The list of currently recognised types is here:
|
|
66
|
+
#
|
|
67
|
+
# <tt>:integer</tt> :: Types::IntegerParameter
|
|
68
|
+
# <tt>:float</tt> :: Types::FloatParameter
|
|
69
|
+
# <tt>:string</tt> :: Types::StringParameter
|
|
70
|
+
# <tt>:file</tt> :: Types::FileParameter
|
|
71
|
+
# <tt>:boolean</tt> :: Types::BooleanParameter
|
|
72
|
+
# <tt>:list</tt> :: Types::ListParameter
|
|
73
|
+
#
|
|
74
|
+
# Additionally to the parameters the given type is requiring, you can
|
|
75
|
+
# pass some other kind of information using this hash, such as option
|
|
76
|
+
# parser short argument, aliases, and so on. This has nothing to do
|
|
77
|
+
# with type conversion, but it is the best place where to put this kind
|
|
78
|
+
# of things, in my humble opinion. The currently recognized such additional
|
|
79
|
+
# parameters are:
|
|
80
|
+
# * :option_parser_short: a short option name for option_parser.
|
|
81
|
+
# * :namespace: a ruby module that will be searched by #string_to_type
|
|
82
|
+
# for a constant. If one of the given name is found, its value is
|
|
83
|
+
# returned.
|
|
84
|
+
# * :shortctus: a hash specifiying strings shortcuts for given values.
|
|
85
|
+
# Elements of this hash that are regular expressions are taken
|
|
86
|
+
class Type
|
|
87
|
+
|
|
88
|
+
# A hash that makes the :type value of the _type_ argument correspond
|
|
89
|
+
# to a Type child
|
|
90
|
+
@@types = { }
|
|
91
|
+
|
|
92
|
+
# The initial type specification that was given to the Type
|
|
93
|
+
attr_accessor :type
|
|
94
|
+
|
|
95
|
+
# A hash shortcut -> value. Can be _nil_
|
|
96
|
+
attr_accessor :shortcuts
|
|
97
|
+
|
|
98
|
+
# A hash Regexp -> value. All elements will be looked for
|
|
99
|
+
# matches for every single string conversion, so don't dump too
|
|
100
|
+
# many of them here.
|
|
101
|
+
attr_accessor :re_shortcuts
|
|
102
|
+
|
|
103
|
+
# A default constructor. It should be safe to use it directly for
|
|
104
|
+
# children, unless something more specific is needed. Any descendent
|
|
105
|
+
# should *always* register _type_ as @type - or, even better, call
|
|
106
|
+
# super.
|
|
107
|
+
def initialize(type)
|
|
108
|
+
if type.is_a?(Symbol)
|
|
109
|
+
type = {:type => type}
|
|
110
|
+
end
|
|
111
|
+
@type = type
|
|
112
|
+
if @type[:shortcuts]
|
|
113
|
+
@shortcuts = @type[:shortcuts]
|
|
114
|
+
@re_shortcuts = {}
|
|
115
|
+
for k,v in @shortcuts
|
|
116
|
+
if k.is_a? Regexp
|
|
117
|
+
@re_shortcuts[k] = v
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# This class function actually registers the current type
|
|
124
|
+
# to the Type ancestor. _name_ should be a symbol.
|
|
125
|
+
# Moreover, if the second argument is provided, it automatically
|
|
126
|
+
# creates a #type_name instance method returning this value.
|
|
127
|
+
def self.type_name(name, public_name = nil, default_value = nil)
|
|
128
|
+
if @@types.has_key?(name)
|
|
129
|
+
warn "Redefining type #{name} " +
|
|
130
|
+
"from #{@@types[name]} to #{self}"
|
|
131
|
+
end
|
|
132
|
+
@@types[name] = self
|
|
133
|
+
self.send(:define_method,:type_name) do
|
|
134
|
+
public_name
|
|
135
|
+
end
|
|
136
|
+
self.send(:define_method,:default_value) do
|
|
137
|
+
default_value
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# This function converts a 'description' (see the Type) of the
|
|
142
|
+
# type wanted into a Type child. As a special treat, a lone
|
|
143
|
+
# symbol is converted into {:type => :symbol}
|
|
144
|
+
def self.get_param_type(type)
|
|
145
|
+
if type.is_a?(Symbol)
|
|
146
|
+
type = {:type => type}
|
|
147
|
+
end
|
|
148
|
+
raise InvalidType,"The type argument must be a Hash" unless
|
|
149
|
+
type.is_a?(Hash)
|
|
150
|
+
begin
|
|
151
|
+
return @@types.fetch(type[:type])
|
|
152
|
+
rescue
|
|
153
|
+
raise InvalidType, "Type #{type[:type]} unknown to the type system"
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# Shortcut to convert directly a string to the given type specification.
|
|
158
|
+
# Handy shortcut.
|
|
159
|
+
def self.from_string(type, string)
|
|
160
|
+
return get_type(type).string_to_type(string)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
# Returns a Type child instance suitable for conversion
|
|
164
|
+
# of the given type specification
|
|
165
|
+
def self.get_type(type)
|
|
166
|
+
if type.is_a? Type
|
|
167
|
+
return type
|
|
168
|
+
end
|
|
169
|
+
return get_param_type(type).new(type)
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
# This function converts the given string to the appropriate
|
|
175
|
+
# type. It is a wrapper around the #string_to_type_internal
|
|
176
|
+
# function that can take advantage of a few general features. It
|
|
177
|
+
# is recommanded to define a #string_to_type_internal function
|
|
178
|
+
# rather to redefine #string_to_type
|
|
179
|
+
def string_to_type(string)
|
|
180
|
+
# First, shortcuts:
|
|
181
|
+
if @shortcuts and @shortcuts.key? string
|
|
182
|
+
return stt_run_hook(@shortcuts[string])
|
|
183
|
+
end
|
|
184
|
+
if @re_shortcuts
|
|
185
|
+
for k, v in @re_shortcuts
|
|
186
|
+
if string =~ k
|
|
187
|
+
return stt_run_hook(v)
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
# Then, constants lookup.
|
|
192
|
+
if @type.key?(:namespace)
|
|
193
|
+
begin
|
|
194
|
+
return stt_run_hook(lookup_const(string))
|
|
195
|
+
rescue Exception
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
return stt_run_hook(string_to_type_internal(string))
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
# This function does the exact opposite of the #string_to_type
|
|
202
|
+
# one. It defaults to using the to_s methods of the
|
|
203
|
+
# parameter. Be careful: it is absolutely important that for any
|
|
204
|
+
# valid type,
|
|
205
|
+
#
|
|
206
|
+
# string_to_type(type_to_string(type)) == type
|
|
207
|
+
def type_to_string(type)
|
|
208
|
+
return type_to_string_internal(type)
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
# Returns a default value for the given type. This is
|
|
213
|
+
# reimplemented systematically from children, with the
|
|
214
|
+
# Type::type_name statement.
|
|
215
|
+
def default_value
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
# Returns a type name suitable for displaying, for instance, in
|
|
220
|
+
# an option parser, or inside a dialog box, and so on. Has to be
|
|
221
|
+
# one word (not to confuse the option parser, for instance); it
|
|
222
|
+
# is better if it is lowercase.
|
|
223
|
+
def type_name
|
|
224
|
+
return 'notype'
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
# Creates an option for the OptionParser _parser_. The block is
|
|
229
|
+
# fed with the converted value. The default implementation
|
|
230
|
+
# should be fine for most classes, but this still leaves the
|
|
231
|
+
# room for reimplementation if necessary. The parameters are:
|
|
232
|
+
#
|
|
233
|
+
# * _parser_: the OptionParser;
|
|
234
|
+
# * _name_: the name of the option;
|
|
235
|
+
# * _desc_: it description,
|
|
236
|
+
# * _block_: the block used to set the data.
|
|
237
|
+
def option_parser_option(parser, name, desc, &block)
|
|
238
|
+
args = [option_parser_long_option(name), desc]
|
|
239
|
+
if @type.has_key?(:option_parser_short)
|
|
240
|
+
args.unshift(@type[:option_parser_short])
|
|
241
|
+
end
|
|
242
|
+
option_parser_raw(parser, *args, &block)
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
# Returns a value to be fed to OptionParser#on as a 'long'
|
|
246
|
+
# option. It is separated from the rest to allow easy
|
|
247
|
+
# redefinition (in special cases). _name_ is the name of the
|
|
248
|
+
# option.
|
|
249
|
+
def option_parser_long_option(name, param = nil)
|
|
250
|
+
param ||= type_name
|
|
251
|
+
param = param.gsub(/\s+/, '_')
|
|
252
|
+
return "--#{name} #{param.upcase}"
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
# Whether the type is a boolean. Booleans are special cased for
|
|
256
|
+
# their use in the command-line.
|
|
257
|
+
def boolean?
|
|
258
|
+
return false
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
############################################################
|
|
262
|
+
# Part of the internal implementation of Types. This should be
|
|
263
|
+
# used/redefined in children
|
|
264
|
+
|
|
265
|
+
protected
|
|
266
|
+
|
|
267
|
+
# Looks for the value as a constant specified in the :namespace
|
|
268
|
+
# modules. Raises IncorrectInput if not found.
|
|
269
|
+
def lookup_const(str)
|
|
270
|
+
for mod in [@type[:namespace]].flatten
|
|
271
|
+
begin
|
|
272
|
+
return mod.const_get(str)
|
|
273
|
+
rescue
|
|
274
|
+
# Nothing, we still look up
|
|
275
|
+
end
|
|
276
|
+
end
|
|
277
|
+
raise IncorrectInput, "Constant #{str} not found"
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
# The internal function for converting type to a string. Used by
|
|
281
|
+
# #type_to_string, children should only reimplement this
|
|
282
|
+
# function and leave #type_to_string
|
|
283
|
+
def type_to_string_internal(type)
|
|
284
|
+
return type.to_s
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
# Runs the string_to_type conversion hook
|
|
289
|
+
def stt_run_hook(val)
|
|
290
|
+
if @type.key?(:stt_hook)
|
|
291
|
+
return @type[:stt_hook].call(val)
|
|
292
|
+
else
|
|
293
|
+
val
|
|
294
|
+
end
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
# Does the actual conversion from a _string_ to the
|
|
298
|
+
# type. Redefine this in children.
|
|
299
|
+
def string_to_type_internal(string)
|
|
300
|
+
raise "The class #{self.class} should not be used by itself for conversion"
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
# Creates on option for the OptionParser _parser_. The _args_
|
|
304
|
+
# will be fed directly to OptionParser#on. The _block_ is called
|
|
305
|
+
# with the value in the target type.
|
|
306
|
+
def option_parser_raw(parser, *args, &block)
|
|
307
|
+
b = block # For safe-keeping.
|
|
308
|
+
c = proc do |str|
|
|
309
|
+
b.call(string_to_type(str))
|
|
310
|
+
end
|
|
311
|
+
parser.on(*args, &c)
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
end
|
|
315
|
+
end
|
|
316
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# types.rb: the whole type framework
|
|
2
|
+
|
|
3
|
+
# This program is free software; you can redistribute it and/or modify
|
|
4
|
+
# it under the terms of the GNU General Public License as published by
|
|
5
|
+
# the Free Software Foundation; either version 2 of the License, or
|
|
6
|
+
# (at your option) any later version.
|
|
7
|
+
#
|
|
8
|
+
# This program is distributed in the hope that it will be useful, but
|
|
9
|
+
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
11
|
+
# General Public License for more details.
|
|
12
|
+
#
|
|
13
|
+
# You should have received a copy of the GNU General Public License
|
|
14
|
+
# along with this program; if not, write to the Free Software
|
|
15
|
+
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
|
|
16
|
+
# USA
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
require 'ctioga2/metabuilder/type'
|
|
20
|
+
|
|
21
|
+
# We try to look for all files under a ctioga2/metabuilder/types
|
|
22
|
+
# directory anywhere on the $: path
|
|
23
|
+
|
|
24
|
+
files = []
|
|
25
|
+
for dir in $:
|
|
26
|
+
Dir[dir + '/ctioga2/metabuilder/types/**/*'].each do |f|
|
|
27
|
+
f =~ /ctioga2\/metabuilder\/types\/(.*)\.[^.]+$/
|
|
28
|
+
files << $1
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
for file in files.uniq
|
|
33
|
+
begin
|
|
34
|
+
require "ctioga2/metabuilder/types/#{file}"
|
|
35
|
+
rescue Exception => e
|
|
36
|
+
warn "There was a problem trying to load 'ctioga2/metabuilder/types/#{file}'"
|
|
37
|
+
warn "#{e.inspect}"
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# coordinates.rb : input of coordinates and dimensions in general
|
|
2
|
+
# Copyright (C) 2006, 2009 Vincent Fourmond
|
|
3
|
+
#
|
|
4
|
+
# This program is free software; you can redistribute it and/or modify
|
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
|
6
|
+
# the Free Software Foundation; either version 2 of the License, or
|
|
7
|
+
# (at your option) any later version.
|
|
8
|
+
#
|
|
9
|
+
# This program is distributed in the hope that it will be useful,
|
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
12
|
+
# GNU General Public License for more details.
|
|
13
|
+
#
|
|
14
|
+
# You should have received a copy of the GNU General Public License
|
|
15
|
+
# along with this program; if not, write to the Free Software
|
|
16
|
+
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
require 'ctioga2/utils'
|
|
20
|
+
|
|
21
|
+
module CTioga2
|
|
22
|
+
|
|
23
|
+
Version::register_svn_info('$Revision: 67 $', '$Date: 2009-05-30 23:38:00 +0200 (Sat, 30 May 2009) $')
|
|
24
|
+
|
|
25
|
+
module MetaBuilder
|
|
26
|
+
module Types
|
|
27
|
+
|
|
28
|
+
# Handles a dimension, either relative or absolute
|
|
29
|
+
class DimensionType < Type
|
|
30
|
+
|
|
31
|
+
type_name :dimension, 'dimension'
|
|
32
|
+
|
|
33
|
+
def string_to_type_internal(str)
|
|
34
|
+
default = @type[:default] || :dy
|
|
35
|
+
orient = @type[:orient] || :x
|
|
36
|
+
return Graphics::Types::Dimension::from_text(str, orient, default)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
# A class that produces a Graphics::Types::MarginsBox. It takes
|
|
43
|
+
# one optional argument : a :default (:frame, :figure or :page),
|
|
44
|
+
# see Graphics::Types::Dimensions::from_text for more information.
|
|
45
|
+
class MarginsType < Type
|
|
46
|
+
|
|
47
|
+
type_name :frame_margins, 'frame_margins'
|
|
48
|
+
|
|
49
|
+
def string_to_type_internal(str)
|
|
50
|
+
default = @type[:default] || :frame
|
|
51
|
+
specs = str.split(/\s*,\s*/)
|
|
52
|
+
if specs.size == 1
|
|
53
|
+
specs = specs * 4
|
|
54
|
+
elsif specs.size == 2
|
|
55
|
+
specs = [specs[0], specs[0], specs[1], specs[1]]
|
|
56
|
+
end
|
|
57
|
+
if specs.size != 4
|
|
58
|
+
raise IncorrectInput, "You need either 1, 2 or 4 elements to make up a margin specification"
|
|
59
|
+
end
|
|
60
|
+
return Graphics::Types::MarginsBox.new(*specs.map {|x|
|
|
61
|
+
Graphics::Types::Dimension::from_text(x, :x, default )})
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# A class that produces a Graphics::Types::Point. It takes one
|
|
66
|
+
# optional argument: a :default (:frame, :figure or :page), see
|
|
67
|
+
# Graphics::Types::Dimensions::from_text for more information.
|
|
68
|
+
class PointType < Type
|
|
69
|
+
|
|
70
|
+
type_name :point, 'point'
|
|
71
|
+
|
|
72
|
+
def string_to_type_internal(str)
|
|
73
|
+
default = @type[:default] || :figure
|
|
74
|
+
return Graphics::Types::Point::from_text(str, default)
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
# A class that produces a Graphics::Types::AlignedPoint. It
|
|
80
|
+
# takes one optional argument : a :default (:frame, :figure or
|
|
81
|
+
# :page), see Graphics::Types::Dimensions::from_text for more
|
|
82
|
+
# information.
|
|
83
|
+
class AlignedPointType < Type
|
|
84
|
+
|
|
85
|
+
type_name :aligned_point, 'aligned_point'
|
|
86
|
+
|
|
87
|
+
def string_to_type_internal(str)
|
|
88
|
+
default = @type[:default] || :frame
|
|
89
|
+
return Graphics::Types::AlignedPoint::from_text(str, default)
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
# A generic class that interfaces known types of boxes. Much fun
|
|
95
|
+
# in perspective.
|
|
96
|
+
class BoxType < Type
|
|
97
|
+
|
|
98
|
+
type_name :box, 'box'
|
|
99
|
+
|
|
100
|
+
def string_to_type_internal(str)
|
|
101
|
+
default = @type[:default] || :frame
|
|
102
|
+
case str
|
|
103
|
+
when Graphics::Types::PointBasedBox::PointBasedBoxRE
|
|
104
|
+
return Graphics::Types::PointBasedBox::from_text(str, default)
|
|
105
|
+
else
|
|
106
|
+
raise "Unknown box specification: '#{str}'"
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# A general bidirectional coordinate transformation.
|
|
112
|
+
class BijectionType < Type
|
|
113
|
+
|
|
114
|
+
type_name :bijection, 'bijection'
|
|
115
|
+
|
|
116
|
+
def string_to_type_internal(str)
|
|
117
|
+
return Graphics::Types::Bijection.from_text(str)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|