class Oozby

Oozby class loads up files and evaluates them to a syntax tree, and renders to openscad source code

Constants

Version

Attributes

debug[RW]
filter_errors[RW]

Public Class Methods

new() click to toggle source
# File lib/oozby/base.rb, line 7
def initialize
  @code_tree = []
  @filter_errors = false
  @debug = false
end
version() click to toggle source
# File lib/oozby/version.rb, line 4
def self.version
  Oozby::Version
end

Public Instance Methods

abstract_tree() click to toggle source
# File lib/oozby/base.rb, line 58
def abstract_tree
  @code_tree
end
parse(code, filename: 'eval') click to toggle source

parse oozby code in to a syntax tree

# File lib/oozby/base.rb, line 14
def parse code, filename: 'eval'
  env = Oozby::Environment.new(ooz: self)
  if File.exists? filename
    current_dir = Dir.pwd
    Dir.chdir File.dirname(filename)
  end
  
  # rescue block to filter out junk oozby library stuff from backtraces
  begin
    compiled = eval("lambda {; #{code}\n }", nil, filename)
    env._execute_oozby(&compiled)
  rescue StandardError, NoMethodError => err
    backtrace = $!.backtrace
    #backtrace = backtrace.select { |item| !item.include? __dir__ } unless backtrace.first.include? __dir__
    
    if @filter_errors # and backtrace.index { |i| i.include? ".oozby:" } < 3
      execute_oozby_idx = backtrace.index { |i| i.include? "in `_execute_oozby'" }
      backtrace = backtrace[0...execute_oozby_idx] if execute_oozby_idx
      backtrace.delete_if do |item|
        filename = item.split(':').first
        filename = File.realpath(filename)
        filename.start_with? __dir__
      end
    end
    
    raise $!, $!.message, backtrace
  end
  @code_tree = env._abstract_tree
  
ensure
  Dir.chdir current_dir if current_dir
end
parse_file(filename) click to toggle source

parse a file containing oozby code in to a syntax tree

# File lib/oozby/base.rb, line 48
def parse_file filename
  parse File.read(filename), filename: filename
end
render() click to toggle source

render the last parsed oozby code in to openscad source code

# File lib/oozby/base.rb, line 53
def render
  renderer = Oozby::Render.new(ooz: self)
  renderer.render(@code_tree, clean: true).join("\n") + "\n"
end