Class: Bade::Renderer

Inherits:
Object show all
Defined in:
lib/bade/renderer.rb

Defined Under Namespace

Classes: LoadError

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(clear_constants: Bade::Renderer.clear_constants) ⇒ Renderer

Returns a new instance of Renderer.

Parameters:

  • clear_constants (Boolean) (defaults to: Bade::Renderer.clear_constants)

    When set to true it will remove all constants that template created. Off by default.



44
45
46
47
# File 'lib/bade/renderer.rb', line 44

def initialize(clear_constants: Bade::Renderer.clear_constants)
  @optimize = false
  @clear_constants = clear_constants
end

Class Attribute Details

.clear_constantsBoolean

When set to true it will remove all constants that template created. Off by default.

Returns:

  • (Boolean)


40
41
42
# File 'lib/bade/renderer.rb', line 40

def clear_constants
  @clear_constants
end

Instance Attribute Details

#clear_constantsBoolean

Returns When set to true it will remove all constants that template created. Off by default.

Returns:

  • (Boolean)

    When set to true it will remove all constants that template created. Off by default.



75
76
77
# File 'lib/bade/renderer.rb', line 75

def clear_constants
  @clear_constants
end

#file_pathString

Returns:



55
56
57
# File 'lib/bade/renderer.rb', line 55

def file_path
  @file_path
end

#lambda_bindingBinding

Returns:

  • (Binding)


63
64
65
# File 'lib/bade/renderer.rb', line 63

def lambda_binding
  @lambda_binding
end

#localsHash

Returns:

  • (Hash)


59
60
61
# File 'lib/bade/renderer.rb', line 59

def locals
  @locals
end

#optimizeBool

Returns:

  • (Bool)


71
72
73
# File 'lib/bade/renderer.rb', line 71

def optimize
  @optimize
end

#precompiledPrecompiled

Returns:



178
179
180
181
# File 'lib/bade/renderer.rb', line 178

def precompiled
  @precompiled ||=
    Precompiled.new(Generator.document_to_lambda_string(root_document, optimize: @optimize), file_path)
end

#render_bindingRenderBinding

rubocop:disable Lint/DuplicateMethods

Returns:

  • (RenderBinding)


67
68
69
# File 'lib/bade/renderer.rb', line 67

def render_binding
  @render_binding
end

#source_textString

Returns:



51
52
53
# File 'lib/bade/renderer.rb', line 51

def source_text
  @source_text
end

Class Method Details

._globals_trackerObject



33
34
35
# File 'lib/bade/renderer.rb', line 33

def _globals_tracker
  @globals_tracker ||= Bade::Runtime::GlobalsTracker.new
end

.from_file(file, clear_constants: Bade::Renderer.clear_constants) ⇒ Renderer

Returns preconfigured instance of this class.

Parameters:

  • file (String, File)

    file path or file instance, file that should be loaded and parsed

Returns:

  • (Renderer)

    preconfigured instance of this class



106
107
108
109
110
111
112
113
114
# File 'lib/bade/renderer.rb', line 106

def self.from_file(file, clear_constants: Bade::Renderer.clear_constants)
  path = if file.is_a?(File)
           file.path
         else
           file
         end

  from_source(nil, path, clear_constants: clear_constants)
end

.from_precompiled(precompiled, clear_constants: Bade::Renderer.clear_constants) ⇒ Renderer

Method to create Renderer from Precompiled object, for example when you want to reuse precompiled object from disk

Parameters:

Returns:

  • (Renderer)

    preconfigured instance of this class



122
123
124
125
126
# File 'lib/bade/renderer.rb', line 122

def self.from_precompiled(precompiled, clear_constants: Bade::Renderer.clear_constants)
  inst = new(clear_constants: clear_constants)
  inst.precompiled = precompiled
  inst
end

.from_source(source, file_path = nil, clear_constants: Bade::Renderer.clear_constants) ⇒ Renderer

Returns preconfigured instance of this class.

Parameters:

  • source (String)

    source string that should be parsed

Returns:

  • (Renderer)

    preconfigured instance of this class



95
96
97
98
99
100
# File 'lib/bade/renderer.rb', line 95

def self.from_source(source, file_path = nil, clear_constants: Bade::Renderer.clear_constants)
  inst = new(clear_constants: clear_constants)
  inst.source_text = source
  inst.file_path = file_path
  inst
end

Instance Method Details

#lambda_instanceProc

Returns:

  • (Proc)


199
200
201
202
203
204
205
206
207
# File 'lib/bade/renderer.rb', line 199

def lambda_instance
  _catching_globals do
    if lambda_binding
      lambda_binding.eval(lambda_string, file_path || Bade::Runtime::TEMPLATE_FILE_NAME)
    else
      render_binding.instance_eval(lambda_string, file_path || Bade::Runtime::TEMPLATE_FILE_NAME)
    end
  end
end

#lambda_stringString

Returns:



185
186
187
# File 'lib/bade/renderer.rb', line 185

def lambda_string
  precompiled.code_string
end

#optimizedObject



157
158
159
160
# File 'lib/bade/renderer.rb', line 157

def optimized
  self.optimize = true
  self
end

#parsed_documentsHash<String, Document>

Returns absolute path => document.

Returns:

  • (Hash<String, Document>)

    absolute path => document



83
84
85
# File 'lib/bade/renderer.rb', line 83

def parsed_documents
  @parsed_documents ||= {}
end

#render(binding: nil, new_line: nil, indent: nil) ⇒ String

Returns rendered content of template.

Parameters:

  • binding (Binding) (defaults to: nil)

    custom binding for evaluating the template, but it is not recommended to use, use :locals and #with_locals instead

  • new_line (String) (defaults to: nil)

    newline string, default is n

  • indent (String) (defaults to: nil)

    indent string, default is two spaces

Returns:

  • (String)

    rendered content of template



219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
# File 'lib/bade/renderer.rb', line 219

def render(binding: nil, new_line: nil, indent: nil)
  self.lambda_binding = binding unless binding.nil? # backward compatibility

  run_vars = {
    Generator::NEW_LINE_NAME.to_sym => new_line,
    Generator::BASE_INDENT_NAME.to_sym => indent,
  }
  run_vars.compact! # remove nil values

  begin
    return _catching_globals do
      lambda_instance.call(**run_vars)
    end
  rescue Bade::Runtime::RuntimeError => e
    raise e
  rescue Exception => e
    msg = "Exception raised during execution of template: #{e}"
    raise Bade::Runtime::RuntimeError.wrap_existing_error(msg, e, render_binding.__location_stack)
  ensure
    self.class._globals_tracker.clear_constants if @clear_constants
  end
end

#root_documentBade::AST::Node

Returns:



168
169
170
# File 'lib/bade/renderer.rb', line 168

def root_document
  @root_document ||= _parsed_document(source_text, file_path)
end

#with_binding(binding) ⇒ self

Returns:

  • (self)


144
145
146
147
# File 'lib/bade/renderer.rb', line 144

def with_binding(binding)
  self.lambda_binding = binding
  self
end

#with_locals(locals = {}) ⇒ self

Parameters:

  • locals (Hash) (defaults to: {})

Returns:

  • (self)


136
137
138
139
140
141
# File 'lib/bade/renderer.rb', line 136

def with_locals(locals = {})
  self.render_binding = nil

  self.locals = locals
  self
end

#with_render_binding(binding) ⇒ self

Parameters:

  • binding (RenderBinding)

Returns:

  • (self)


151
152
153
154
155
# File 'lib/bade/renderer.rb', line 151

def with_render_binding(binding)
  self.lambda_binding = nil
  self.render_binding = binding
  self
end