Class: Architect::Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/architect/parser.rb

Overview

Parses yUML files

Instance Method Summary collapse

Instance Method Details

#get_node(markup) ⇒ Object

markup

string containing content inside square brackets

Returns Note or Class



56
57
58
59
60
61
62
# File 'lib/architect/parser.rb', line 56

def get_node(markup)
  if /^note/i.match(markup) != nil
    return Note.new(markup)
  else
    return Class.new(markup)
  end
end

#get_statements(diagram) ⇒ Object

diagram

String containing yUML markup

Returns list of statments in diagram markup



24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/architect/parser.rb', line 24

def get_statements(diagram)
  statements = diagram.split(/\][,\s]*\[/) # split on "]*["
  
  #insert removed square brackets back
  statements = statements.each_with_index.map do |statement, i|
    statement = statement.strip
    statement = "[" + statement if statement[0] != "["
    statement = statement + "]" if statement[-1] != "]"
    statement
  end
  return statements
end

#parse(diagram) ⇒ Object

diagram

String containing yUML markup

Returns list of classes and list of associations in diagram



12
13
14
15
16
17
18
19
20
# File 'lib/architect/parser.rb', line 12

def parse(diagram)
  elements = []
  statements = get_statements(diagram)
  statements.each do |statement|
    new_elements = parse_statement(statement)
    elements = elements + new_elements
  end
  return elements
end

#parse_statement(statement) ⇒ Object

statement

String containing statement

Returns a list of classes markup and association markup in the statement



39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/architect/parser.rb', line 39

def parse_statement(statement)
  pattern = /\[(?<node1>.+?)\](?<association>.+?)\[(?<node2>.+)\]/ 
  tokens = pattern.match(statement)
  if tokens
    node1 = get_node(tokens[:node1])
    node2 = get_node(tokens[:node2])
    association = Association.new(node1, node2, tokens[:association])
    return [node1, node2, association]
  else
    tokens = /\[(?<node1>.*)\]/.match(statement)
    node1 = get_node(tokens[:node1])
    return [node1]
  end
end