ctioga2 0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. data/COPYING +339 -0
  2. data/Changelog +6 -0
  3. data/bin/ctioga2 +26 -0
  4. data/lib/ctioga2/commands/arguments.rb +58 -0
  5. data/lib/ctioga2/commands/commands.rb +258 -0
  6. data/lib/ctioga2/commands/doc/doc.rb +118 -0
  7. data/lib/ctioga2/commands/doc/documentation-commands.rb +119 -0
  8. data/lib/ctioga2/commands/doc/help.rb +95 -0
  9. data/lib/ctioga2/commands/doc/html.rb +230 -0
  10. data/lib/ctioga2/commands/doc/introspection.rb +211 -0
  11. data/lib/ctioga2/commands/doc/man.rb +279 -0
  12. data/lib/ctioga2/commands/doc/markup.rb +359 -0
  13. data/lib/ctioga2/commands/general-commands.rb +119 -0
  14. data/lib/ctioga2/commands/general-types.rb +118 -0
  15. data/lib/ctioga2/commands/groups.rb +73 -0
  16. data/lib/ctioga2/commands/interpreter.rb +257 -0
  17. data/lib/ctioga2/commands/parsers/command-line.rb +187 -0
  18. data/lib/ctioga2/commands/parsers/file.rb +186 -0
  19. data/lib/ctioga2/commands/strings.rb +303 -0
  20. data/lib/ctioga2/commands/type.rb +100 -0
  21. data/lib/ctioga2/commands/variables.rb +101 -0
  22. data/lib/ctioga2/data/backends/backend.rb +260 -0
  23. data/lib/ctioga2/data/backends/backends.rb +39 -0
  24. data/lib/ctioga2/data/backends/backends/gnuplot.rb +140 -0
  25. data/lib/ctioga2/data/backends/backends/math.rb +121 -0
  26. data/lib/ctioga2/data/backends/backends/text.rb +335 -0
  27. data/lib/ctioga2/data/backends/description.rb +405 -0
  28. data/lib/ctioga2/data/backends/factory.rb +73 -0
  29. data/lib/ctioga2/data/backends/parameter.rb +109 -0
  30. data/lib/ctioga2/data/datacolumn.rb +245 -0
  31. data/lib/ctioga2/data/dataset.rb +233 -0
  32. data/lib/ctioga2/data/filters.rb +131 -0
  33. data/lib/ctioga2/data/merge.rb +43 -0
  34. data/lib/ctioga2/data/point.rb +72 -0
  35. data/lib/ctioga2/data/stack.rb +294 -0
  36. data/lib/ctioga2/graphics/coordinates.rb +73 -0
  37. data/lib/ctioga2/graphics/elements.rb +111 -0
  38. data/lib/ctioga2/graphics/elements/containers.rb +111 -0
  39. data/lib/ctioga2/graphics/elements/curve2d.rb +155 -0
  40. data/lib/ctioga2/graphics/elements/element.rb +90 -0
  41. data/lib/ctioga2/graphics/elements/primitive.rb +256 -0
  42. data/lib/ctioga2/graphics/elements/subplot.rb +140 -0
  43. data/lib/ctioga2/graphics/generator.rb +68 -0
  44. data/lib/ctioga2/graphics/legends.rb +108 -0
  45. data/lib/ctioga2/graphics/legends/area.rb +199 -0
  46. data/lib/ctioga2/graphics/legends/items.rb +183 -0
  47. data/lib/ctioga2/graphics/legends/provider.rb +58 -0
  48. data/lib/ctioga2/graphics/legends/storage.rb +65 -0
  49. data/lib/ctioga2/graphics/root.rb +209 -0
  50. data/lib/ctioga2/graphics/styles.rb +30 -0
  51. data/lib/ctioga2/graphics/styles/axes.rb +247 -0
  52. data/lib/ctioga2/graphics/styles/background.rb +122 -0
  53. data/lib/ctioga2/graphics/styles/base.rb +115 -0
  54. data/lib/ctioga2/graphics/styles/carrays.rb +53 -0
  55. data/lib/ctioga2/graphics/styles/curve.rb +101 -0
  56. data/lib/ctioga2/graphics/styles/drawable.rb +87 -0
  57. data/lib/ctioga2/graphics/styles/factory.rb +351 -0
  58. data/lib/ctioga2/graphics/styles/legend.rb +63 -0
  59. data/lib/ctioga2/graphics/styles/plot.rb +410 -0
  60. data/lib/ctioga2/graphics/styles/sets.rb +64 -0
  61. data/lib/ctioga2/graphics/styles/texts.rb +277 -0
  62. data/lib/ctioga2/graphics/subplot-commands.rb +141 -0
  63. data/lib/ctioga2/graphics/types.rb +188 -0
  64. data/lib/ctioga2/graphics/types/bijection.rb +79 -0
  65. data/lib/ctioga2/graphics/types/boundaries.rb +170 -0
  66. data/lib/ctioga2/graphics/types/boxes.rb +157 -0
  67. data/lib/ctioga2/graphics/types/dimensions.rb +157 -0
  68. data/lib/ctioga2/graphics/types/point.rb +247 -0
  69. data/lib/ctioga2/log.rb +97 -0
  70. data/lib/ctioga2/metabuilder/type.rb +316 -0
  71. data/lib/ctioga2/metabuilder/types.rb +39 -0
  72. data/lib/ctioga2/metabuilder/types/coordinates.rb +124 -0
  73. data/lib/ctioga2/metabuilder/types/dates.rb +43 -0
  74. data/lib/ctioga2/metabuilder/types/lists.rb +188 -0
  75. data/lib/ctioga2/metabuilder/types/numbers.rb +97 -0
  76. data/lib/ctioga2/metabuilder/types/strings.rb +93 -0
  77. data/lib/ctioga2/metabuilder/types/styles.rb +178 -0
  78. data/lib/ctioga2/plotmaker.rb +677 -0
  79. data/lib/ctioga2/postprocess.rb +115 -0
  80. data/lib/ctioga2/utils.rb +120 -0
  81. data/setup.rb +1586 -0
  82. metadata +144 -0
@@ -0,0 +1,211 @@
1
+ # introspection.rb: get informations about what is known to ctioga2
2
+ # copyright (c) 2009 by 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 (in the COPYING file).
13
+
14
+ require 'ctioga2/utils'
15
+ require 'ctioga2/commands/commands'
16
+
17
+ module CTioga2
18
+
19
+ Version::register_svn_info('$Revision: 36 $', '$Date: 2009-05-04 21:23:15 +0200 (Mon, 04 May 2009) $')
20
+
21
+ module Commands
22
+
23
+ # The base of the 'self-documentation' of CTioga2
24
+ module Documentation
25
+
26
+ # This class provides facilities to display information
27
+ class Introspection
28
+
29
+ # Display all known commands, along with their definition place
30
+ def list_commands(raw = false)
31
+ puts "Known commands:" unless raw
32
+ cmds = Interpreter::commands
33
+ names = cmds.keys.sort
34
+ if raw
35
+ puts names
36
+ else
37
+ max = names.inject(0) {|m,x| [m,x.size].max}
38
+ max2 = names.inject(0) {|m,x| [m,cmds[x].long_option.size].max}
39
+ for n in names
40
+ f,l = cmds[n].context
41
+ puts "\t%-#{max}s\t--%-#{max2}s\t(#{f}: #{l})" %
42
+ [n, cmds[n].long_option ]
43
+ end
44
+ end
45
+ end
46
+
47
+ # List known groups
48
+ def list_groups(raw = false)
49
+ puts "Known groups:" unless raw
50
+ groups = Interpreter::groups
51
+ names = groups.keys.sort
52
+ if raw
53
+ puts names
54
+ else
55
+ for n in names
56
+ f,l = groups[n].context
57
+ puts "\t#{n}\t(#{f}: #{l})"
58
+ end
59
+ end
60
+ end
61
+
62
+ # List known types
63
+ def list_types(raw = false)
64
+ puts "Known types:" unless raw
65
+ types = Interpreter::types
66
+ names = types.keys.sort
67
+ if raw
68
+ puts names
69
+ else
70
+ for n in names
71
+ f,l = types[n].context
72
+ puts "\t#{n}\t(#{f}: #{l})"
73
+ end
74
+ end
75
+ end
76
+
77
+ # Lauches an editor to edit the given command:
78
+ def edit_command(cmd)
79
+ cmd = Interpreter::command(cmd)
80
+ if cmd
81
+ edit_file(*cmd.context)
82
+ end
83
+ end
84
+
85
+ # Lauches an editor to edit the given command:
86
+ def edit_group(group)
87
+ group = Interpreter::group(group)
88
+ if group
89
+ edit_file(*group.context)
90
+ end
91
+ end
92
+
93
+ # Lauches an editor to edit the given command:
94
+ def edit_type(type)
95
+ type = Interpreter::type(type)
96
+ if type
97
+ edit_file(*type.context)
98
+ end
99
+ end
100
+
101
+
102
+ protected
103
+
104
+ # Launches an editor to edit the given file at the given place.
105
+ def edit_file(file, line)
106
+ editor = ENV['EDITOR'] || 'emacs'
107
+ if ENV['CT2_DEV_HOME']
108
+ file = "#{ENV['CT2_DEV_HOME']}/#{file}"
109
+ end
110
+ system("#{editor} +#{line} #{file} &")
111
+ end
112
+
113
+ end
114
+
115
+ IntrospectionGroup =
116
+ CmdGroup.new('introspection', "Introspection",
117
+ "Displays information about the internals of ctioga2",
118
+ 100, true)
119
+
120
+ RawOption = {'raw' => CmdArg.new('boolean')}
121
+
122
+ ListCommandsCmd =
123
+ Cmd.new('list-commands', nil, '--list-commands',
124
+ [], RawOption) do |p, opts|
125
+ Introspection.new.list_commands(opts['raw'])
126
+ end
127
+
128
+ ListCommandsCmd.describe("List known commands",
129
+ <<EOH, IntrospectionGroup)
130
+ List all commands known to ctioga2
131
+ EOH
132
+
133
+ ListGroupsCmd =
134
+ Cmd.new('list-groups', nil, '--list-groups',
135
+ [], RawOption) do |p, opts|
136
+ Introspection.new.list_groups(opts['raw'])
137
+ end
138
+
139
+ ListGroupsCmd.describe("List known groups",
140
+ <<EOH, IntrospectionGroup)
141
+ List all command groups known to ctioga2
142
+ EOH
143
+
144
+ ListTypesCmd =
145
+ Cmd.new('list-types', nil, '--list-types',
146
+ [], RawOption) do |p, opts|
147
+ Introspection.new.list_types(opts['raw'])
148
+ end
149
+
150
+ ListTypesCmd.describe("List known types",
151
+ <<EOH, IntrospectionGroup)
152
+ List all types known to ctioga2
153
+ EOH
154
+
155
+ EditCommandCmd =
156
+ Cmd.new('edit-command', nil, '--edit-command',
157
+ [ CmdArg.new('text')]) do |plotmaker, cmd|
158
+ Introspection.new.edit_command(cmd)
159
+ end
160
+
161
+ EditCommandCmd.describe("Edit the command",
162
+ <<EOH, IntrospectionGroup)
163
+ Edit the given command in an editor. It will only work from the
164
+ top directory of a ctioga2 source tree.
165
+ EOH
166
+
167
+ EditGroupCmd =
168
+ Cmd.new('edit-group', nil, '--edit-group',
169
+ [ CmdArg.new('text')]) do |plotmaker, cmd|
170
+ Introspection.new.edit_group(cmd)
171
+ end
172
+
173
+ EditGroupCmd.describe("Edit the group",
174
+ <<EOH, IntrospectionGroup)
175
+ Edit the given group in an editor. It will only work from the
176
+ top directory of a ctioga2 source tree.
177
+ EOH
178
+
179
+ EditTypeCmd =
180
+ Cmd.new('edit-type', nil, '--edit-type',
181
+ [ CmdArg.new('text')]) do |plotmaker, cmd|
182
+ Introspection.new.edit_type(cmd)
183
+ end
184
+
185
+ EditTypeCmd.describe("Edit the type",
186
+ <<EOH, IntrospectionGroup)
187
+ Edit the given type in an editor. It will only work from the
188
+ top directory of a ctioga2 source tree.
189
+ EOH
190
+
191
+ VersionRawCmd =
192
+ Cmd.new('version-raw', nil, '--version-raw',
193
+ [ ]) do |plotmaker|
194
+ print Version::version
195
+ end
196
+
197
+ VersionRawCmd.describe("Raw version",
198
+ <<EOH, IntrospectionGroup)
199
+ Prints the raw version number, without any other decoration and
200
+ newline.
201
+ EOH
202
+
203
+
204
+
205
+ end
206
+
207
+ end
208
+
209
+
210
+ end
211
+
@@ -0,0 +1,279 @@
1
+ # man.rb: conversion of the internal help into a hand-modifiable manual page.
2
+ # copyright (c) 2009 by 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 (in the COPYING file).
13
+
14
+ require 'ctioga2/utils'
15
+ require 'ctioga2/log'
16
+ require 'ctioga2/commands/commands'
17
+ require 'ctioga2/commands/parsers/command-line'
18
+
19
+ module CTioga2
20
+
21
+ Version::register_svn_info('$Revision: 40 $', '$Date: 2009-05-08 00:45:47 +0200 (Fri, 08 May 2009) $')
22
+
23
+ module Commands
24
+
25
+ module Documentation
26
+
27
+ # Converts help texts found in the Command descriptions into a
28
+ # manual page that can be further edited and *updated* using this
29
+ # module.
30
+ class Man
31
+
32
+ include Log
33
+
34
+ # The Doc object Help2Man should be working on.
35
+ attr_accessor :doc
36
+
37
+ def initialize(doc)
38
+ @doc = doc
39
+ end
40
+
41
+ RoffCommentRE = /\.\s*\\"/
42
+
43
+ # Writes a manual page to the given _io_ stream, using _version_
44
+ # as the target version (the one ending up in the headers).
45
+ #
46
+ # NO... We should *input* a manual page, and spit out
47
+ # replacement texts.
48
+ def write_manual_page(version, input, out = STDOUT)
49
+ passed_header = false
50
+ if input.is_a? String
51
+ filename = input
52
+ input = File::open(input)
53
+ elsif input.respond_to? :path
54
+ filename = input.path
55
+ else
56
+ filename = "unkown"
57
+ end
58
+
59
+ @cmds, @groups = @doc.documented_commands
60
+ @cmd_exclude = {}
61
+ @group_exclude = {}
62
+
63
+ while line = input.gets
64
+ case line
65
+ when /^#{RoffCommentRE}\s*write-header\s*$/
66
+ out.puts header_string(version, filename)
67
+ passed_header = true
68
+ when /^#{RoffCommentRE}\s*write-commands\s*$/
69
+ write_commands(out)
70
+ when /^#{RoffCommentRE}\s*write-group:\s*(.*)\s*$/
71
+ id = $1
72
+ if @groups[id]
73
+ write_group(out, g)
74
+ else
75
+ warn "Unkown group: #{id}"
76
+ end
77
+ when /^#{RoffCommentRE}\s*write-types\s*$/
78
+ write_types(out)
79
+ else
80
+ if passed_header
81
+ out.puts line
82
+ end
83
+ end
84
+ end
85
+ out.close
86
+ input.close
87
+ end
88
+
89
+ protected
90
+
91
+ ItemizeLabel = '\fB*\fR'
92
+ ItemizeLabelSize = 2
93
+ ItemizeIndent = 2
94
+ ManIndent = 8
95
+
96
+ # Takes up an array of MarkupItem objects and returns its
97
+ # equivalent in roff format. Alternativelely, it can take a
98
+ # String and feed it to MarkedUpText.
99
+ #
100
+ # TODO: make sure things are escaped the way they should be.
101
+ #
102
+ # if _inside_cmds_ is true, additional indentation is added
103
+ # for the lists, so that is looks neat in the end.
104
+ #
105
+ # TODO: try to be more clever about spaces in the target
106
+ # file. (does not matter too much for the output of man)
107
+ def markup_to_man(items, inside_cmds = true)
108
+ if items.is_a? String
109
+ mup = MarkedUpText.new(@doc, items)
110
+ return markup_to_man(mup.elements, inside_cmds)
111
+ end
112
+ str = ""
113
+ for it in items
114
+ case it
115
+ when MarkedUpText::MarkupText
116
+ str << it.to_s
117
+ when MarkedUpText::MarkupLink
118
+ str << "\\fI#{it.to_s}\\fR"
119
+ when MarkedUpText::MarkupItemize
120
+ indent = ItemizeIndent
121
+ if inside_cmds
122
+ indent += ManIndent
123
+ end
124
+ str << "\n.RS #{indent}"
125
+ str << "\n.IP \"#{ItemizeLabel}\" #{ItemizeLabelSize}\n"
126
+ str << it.items.map {
127
+ |x| markup_to_man(x)
128
+ }.join("\n.IP \"#{ItemizeLabel}\" #{ItemizeLabelSize}\n")
129
+ str << "\n.RE\n\n"
130
+ # We restore the indentation afterwards.
131
+ if inside_cmds
132
+ str << ".IP \"\" #{ManIndent}\n"
133
+ end
134
+ when MarkedUpText::MarkupVerbatim
135
+ str << it.text.gsub(/^/, ' ')
136
+ when MarkedUpText::MarkupParagraph
137
+ str << "#{markup_to_man(it.elements)}\n\n"
138
+ else
139
+ raise "Markup #{it.class} isn't implemented yet for man"
140
+ end
141
+ end
142
+ return str
143
+ end
144
+
145
+ # Writes out all commands to _out_.
146
+ def write_commands(out)
147
+ for group in @groups
148
+ next if @group_exclude[group]
149
+ write_group(out, group)
150
+ end
151
+ end
152
+
153
+ # Writes out a single _group_
154
+ def write_group(out, group)
155
+ write_group_name(out, group)
156
+ write_group_description(out, group)
157
+ write_group_commands(out, group)
158
+ end
159
+
160
+ # Writes the name of a _group_
161
+ def write_group_name(out, group)
162
+ out.puts
163
+ out.puts ".SS #{group.name}"
164
+ out.puts
165
+ end
166
+
167
+ # Writes the description of a _group_.
168
+ def write_group_description(out, group)
169
+ out.puts
170
+ out.puts markup_to_man(group.description, false)
171
+ out.puts
172
+ end
173
+
174
+ # Writes the remaining commands of a group
175
+ def write_group_commands(out, group)
176
+ for cmd in @cmds[group].sort {|a,b|
177
+ a.long_option <=> b.long_option
178
+ }
179
+ next if @cmd_exclude[cmd]
180
+ out.puts
181
+ out.puts ".TP #{ManIndent}"
182
+ write_command(out, cmd)
183
+ end
184
+ # Now blacklist the group
185
+ @group_exclude[group] = true
186
+ end
187
+
188
+ def write_command(out, cmd)
189
+ write_command_signature(out, cmd)
190
+ write_command_description(out, cmd)
191
+ out.puts ".br"
192
+ write_command_options(out, cmd)
193
+ out.puts ".br"
194
+ write_corresponding_command(out, cmd)
195
+ end
196
+
197
+ # Writes a signature (ie the option specification) for the
198
+ # command
199
+ def write_command_signature(out, cmd)
200
+ short, long, dummy = cmd.option_strings
201
+ long, *args = long.split(/\s+/)
202
+ args = " \\fI#{args.join(' ')}\\fR"
203
+ out.puts ".B %s%s%s%s" % [ short, (short ? ", " : ""), long, args ]
204
+ # Blacklist commands whose signature we wrote.
205
+ @cmd_exclude[cmd] = true
206
+ end
207
+
208
+
209
+ # Returns the description for the command
210
+ def write_command_description(out, cmd)
211
+ mup = MarkedUpText.new(@doc, cmd.long_description)
212
+ out.puts markup_to_man(mup.elements)
213
+ end
214
+
215
+ # Displays the optional arguments for the given command
216
+ def write_command_options(out, cmd)
217
+ if cmd.has_options?
218
+ # .map {|x| "/#{x}="} ??? Does not seem to help much
219
+ options = cmd.optional_arguments.keys.sort.join(' ')
220
+ out.puts ".B Optional arguments:\n.I #{options}"
221
+ end
222
+ end
223
+
224
+ # Displays the corresponding 'file' command
225
+ def write_corresponding_command(out, cmd)
226
+ arguments = cmd.arguments.map {|a| a.displayed_name}.join(',')
227
+ if cmd.has_options?
228
+ arguments += ",option=..."
229
+ end
230
+ out.puts ".B Corresponding command:\n.I #{cmd.name}(#{arguments})"
231
+ end
232
+
233
+ # Writes documentation about all the types known to ctioga.
234
+ def write_types(out)
235
+ first = true
236
+ for n, t in @doc.types.sort
237
+ write_type(out,t, first ? "8" : "")
238
+ first = false
239
+ end
240
+ end
241
+
242
+ def write_type(out, type, indent = "")
243
+ out.puts ".TP #{indent}"
244
+ out.puts ".I #{type.name}"
245
+ out.puts "#{type.description}"
246
+ end
247
+
248
+ # Returns the header string
249
+ def header_string(version, file)
250
+ return ManualPageHeader % [ file,
251
+ CTioga2::Version::last_modified_date,
252
+ version ]
253
+ end
254
+
255
+ ManualPageHeader = <<'EOF'
256
+ .\" This is the manual page for ctioga2
257
+ .\"
258
+ .\" Copyright 2009 by Vincent Fourmond
259
+ .\"
260
+ .\" This file is generated from the ctioga2 code and from the file %s
261
+ .\"
262
+ .\" This program is free software; you can redistribute it and/or modify
263
+ .\" it under the terms of the GNU General Public License as published by
264
+ .\" the Free Software Foundation; either version 2 of the License, or
265
+ .\" (at your option) any later version.
266
+ .\"
267
+ .\" This program is distributed in the hope that it will be useful,
268
+ .\" but WITHOUT ANY WARRANTY; without even the implied warranty of
269
+ .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
270
+ .\" GNU General Public License for more details (in the COPYING file).
271
+ .\"
272
+ .TH CTIOGA2 1 "%s" "Version %s" "Command-line interface for Tioga"
273
+ EOF
274
+
275
+ end
276
+ end
277
+
278
+ end
279
+ end