Class: TaskJuggler::TextParser::MacroTable

Inherits:
Object
  • Object
show all
Defined in:
lib/taskjuggler/TextParser/MacroTable.rb

Overview

The MacroTable is used by the TextScanner to store defined macros and resolve them on request later on. A macro is a text pattern that has a name. The pattern may contain variable parts that are replaced by arguments passed during the macro call.

Instance Method Summary collapse

Constructor Details

#initializeMacroTable

Returns a new instance of MacroTable.



34
35
36
# File 'lib/taskjuggler/TextParser/MacroTable.rb', line 34

def initialize
  @macros = {}
end

Instance Method Details

#add(macro) ⇒ Object

Add a new macro definition to the table or replace an existing one.



39
40
41
# File 'lib/taskjuggler/TextParser/MacroTable.rb', line 39

def add(macro)
  @macros[macro.name] = macro
end

#clearObject

Remove all definitions from the table.



44
45
46
# File 'lib/taskjuggler/TextParser/MacroTable.rb', line 44

def clear
  @macros = []
end

#include?(name) ⇒ Boolean

Returns true only if a macro named name is defined in the table.

Returns:

  • (Boolean)


49
50
51
# File 'lib/taskjuggler/TextParser/MacroTable.rb', line 49

def include?(name)
  @macros.include?(name)
end

#resolve(args, sourceFileInfo) ⇒ Object

Returns the definition of the macro specified by name as first entry of args. The other entries of args are parameters that are replacing the $n tokens in the macro definition. In case the macro call has less arguments than the macro definition uses, the $n tokens remain unchanged. No error is generated.



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/taskjuggler/TextParser/MacroTable.rb', line 58

def resolve(args, sourceFileInfo)
  name = args[0]
  # If the first character of the macro name is a '?', the macro may be
  # undefined and is silently ignored.
  if name[0] == ??
    # Remove the '?' from the name.
    name = name[1..-1]
    return [ nil, '' ] unless @macros[name]
  end
  return nil unless @macros[name]

  resolved = @macros[name].value.dup
  i = 0
  args.each do |arg|
    resolved.gsub!(Regexp.new("(([^$]|^))\\$\\{#{i}\\}"), "\\1#{arg}")
    i += 1
  end
  # Remove the escape character from all the escaped '${...}'.
  resolved.gsub!('$${', '${')
  [ @macros[name], resolved ]
end