# File lib/graphviz.rb, line 208
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:       #Modified by
237:       #Brandon Coleman 
238:       #verify value is NOT NULL
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:         ## Act: Save script and send it to dot
316:         t = Tempfile::open( File.basename($0) + "." )
317:         t.print( xDOTScript )
318:         t.close
319:         
320:         #cmd = find_executable( @prog )
321:         #cmd = find_executable0( @prog )
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