208: def output( *hOpt )
209: xDOTScript = ""
210: xLastType = nil
211: xSeparator = ""
212: xData = ""
213:
214: @elements_order.each { |kElement|
215: if xLastType.nil? == true or xLastType != kElement["type"]
216:
217: if xData.length > 0
218: case xLastType
219: when "graph_attr"
220: xDOTScript << " " + xData + ";\n"
221:
222: when "node_attr"
223: xDOTScript << " node [" + xData + "];\n"
224:
225: when "edge_attr"
226: xDOTScript << " edge [" + xData + "];\n"
227: end
228: end
229:
230: xSeparator = ""
231: xData = ""
232: end
233:
234: xLastType = kElement["type"]
235:
236:
237:
238:
239: if kElement["value"] == nil then
240: raise ArgumentError, "#{kElement["name"]} has a nil value!"
241: end
242:
243: case kElement["type"]
244: when "graph_attr"
245: xData << xSeparator + kElement["name"] + " = \"" + kElement["value"] + "\""
246: xSeparator = "; "
247:
248: when "node_attr"
249: xData << xSeparator + kElement["name"] + " = \"" + kElement["value"] + "\""
250: xSeparator = ", "
251:
252: when "edge_attr"
253: xData << xSeparator + kElement["name"] + " = \"" + kElement["value"] + "\""
254: xSeparator = ", "
255:
256: when "node"
257: xDOTScript << " " + kElement["value"].output() + "\n"
258:
259: when "edge"
260: xDOTScript << " " + kElement["value"].output( @oGraphType ) + "\n"
261:
262: when "graph"
263: xDOTScript << kElement["value"].output() + "\n"
264:
265: else
266: raise ArgumentError, "Don't know what to do with element type '#{kElement['type']}'"
267: end
268: }
269:
270: if xData.length > 0
271: case xLastType
272: when "graph_attr"
273: xDOTScript << " " + xData + ";\n"
274:
275: when "node_attr"
276: xDOTScript << " node [" + xData + "];\n"
277:
278: when "edge_attr"
279: xDOTScript << " edge [" + xData + "];\n"
280: end
281: end
282: xDOTScript << "}"
283:
284: if @oParentGraph.nil? == false
285: xDOTScript = "subgraph #{@name} {\n" << xDOTScript
286:
287: return( xDOTScript )
288: else
289: if hOpt.nil? == false and hOpt[0].nil? == false
290: hOpt[0].each do |xKey, xValue|
291: case xKey.to_s
292: when "output"
293: if FORMATS.index( xValue ).nil? == true
294: raise ArgumentError, "output format '#{xValue}' invalid"
295: end
296: @format = xValue
297: when "file"
298: @filename = xValue
299: when "use"
300: if PROGRAMS.index( xValue ).nil? == true
301: raise ArgumentError, "can't use '#{xValue}'"
302: end
303: @prog = xValue
304: when "path"
305: @path = xValue
306: else
307: raise ArgumentError, "option #{xKey.to_s} unknown"
308: end
309: end
310: end
311:
312: xDOTScript = "#{@oGraphType} #{@name} {\n" << xDOTScript
313:
314: if @format != "none"
315:
316: t = Tempfile::open( File.basename($0) + "." )
317: t.print( xDOTScript )
318: t.close
319:
320:
321:
322: cmd = find_executable( )
323: if cmd == nil
324: raise StandardError, "GraphViz not installed or #{@prog} not in PATH. Install GraphViz or use the 'path' option"
325: end
326:
327: xFile = ""
328: xFile = "-o #{@filename}" if @filename.nil? == false
329: xCmd = "#{cmd} -T#{@format} #{xFile} #{t.path}"
330:
331: f = IO.popen( xCmd )
332: print f.readlines
333: f.close
334: else
335: puts xDOTScript
336: end
337: end
338: end