Class: TaskJuggler::TextParser::MacroTable
- 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
-
#add(macro) ⇒ Object
Add a new macro definition to the table or replace an existing one.
-
#clear ⇒ Object
Remove all definitions from the table.
-
#include?(name) ⇒ Boolean
Returns true only if a macro named name is defined in the table.
-
#initialize ⇒ MacroTable
constructor
A new instance of MacroTable.
-
#resolve(args, sourceFileInfo) ⇒ Object
Returns the definition of the macro specified by name as first entry of args.
Constructor Details
#initialize ⇒ MacroTable
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 |
#clear ⇒ Object
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.
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 |