Class: Processing::BaseExporter

Inherits:
Object
  • Object
show all
Includes:
FileUtils
Defined in:
lib/ruby-processing/exporters/base_exporter.rb

Overview

This base exporter implements some of the common code-munging needed to generate apps and applets.

Direct Known Subclasses

AppletExporter, ApplicationExporter, Creator

Constant Summary collapse

DEFAULT_DIMENSIONS =
{'width' => '100', 'height' => '100'}
DEFAULT_DESCRIPTION =
''

Instance Method Summary collapse

Instance Method Details

#extract_class_name(source) ⇒ Object

Searches the source for a class name.



38
39
40
41
# File 'lib/ruby-processing/exporters/base_exporter.rb', line 38

def extract_class_name(source)
  match = source.match(/(\w+)\s*<\s*Processing::App/)
  match ? match[1] : 'Sketch'
end

#extract_description(source) ⇒ Object

Searches the source for a description of the sketch.



59
60
61
62
# File 'lib/ruby-processing/exporters/base_exporter.rb', line 59

def extract_description(source)
  match = source.match(/\A((\s*#(.*?)\n)+)[^#]/m)
  match ? match[1].gsub(/\s*#\s*/, "\n") : DEFAULT_DESCRIPTION
end

#extract_dimension(source, dimension) ⇒ Object

Searches the source for the width and height of the sketch.



50
51
52
53
54
55
56
# File 'lib/ruby-processing/exporters/base_exporter.rb', line 50

def extract_dimension(source, dimension)
  match = source.match(/#{@info[:class_name]}\.new.*?:#{dimension}\s?=>\s?(\d+)/m)
  size_match = source.match(/^[^#]*size\(?\s*(\d+)\s*,\s*(\d+)\s*\)?/)
  return match[1] if match
  return (dimension == 'width' ? size_match[1] : size_match[2]) if size_match
  DEFAULT_DIMENSIONS[dimension]
end

#extract_informationObject

Centralized method to read the source of the sketch and extract all the juicy details.



22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/ruby-processing/exporters/base_exporter.rb', line 22

def extract_information
  # Extract information from main file
  @info = {}
  @info[:source_code]     = source = read_source_code
  @info[:class_name]      = extract_class_name(source)
  @info[:title]           = extract_title(source)
  @info[:width]           = extract_dimension(source, 'width')
  @info[:height]          = extract_dimension(source, 'height')
  @info[:description]     = extract_description(source)
  @info[:libraries]       = extract_libraries(source)
  @info[:real_requires]   = extract_real_requires(source)
  hash_to_ivars @info
  @info
end

#extract_libraries(source) ⇒ Object

Searches the source for any libraries that have been loaded.



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/ruby-processing/exporters/base_exporter.rb', line 65

def extract_libraries(source)
  libs = []
  code = source.dup
  loop do
    matchdata = code.match(/^[^#]*load_librar(y|ies)\s+(.+)\n/)
    break unless matchdata
    candidates = matchdata[2].gsub(/[:"'\s]/, '').split(/,/)
    candidates.each do |cand|
      @opengl = true if cand.match(/opengl/i)
      local_path = "#{local_dir}/library/#{cand}"
      rp5_path = "#{RP5_ROOT}/library/#{cand}"
      libs << rp5_path if File.exists?(rp5_path)
      libs << local_path if File.exists?(local_path)
    end
    code = matchdata.post_match
  end
  libs
end

#extract_real_requires(source) ⇒ Object

Looks for all of the codes require or load commands, checks to see if the file exists (that it’s not a gem, or a standard lib) and hands you back all the real ones.



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/ruby-processing/exporters/base_exporter.rb', line 87

def extract_real_requires(source)
  code = source.dup
  requirements = []
  partial_paths = []
  loop do
    matchdata = code.match(/^.*\b(require|load)\b.*$/)
    break unless matchdata
    line = matchdata[0].gsub('__FILE__', "'#{@main_file_path}'")
    line = line.gsub(/\b(require|load)\b/, 'partial_paths << ')
    eval(line)
    requirements += Dir["{#{local_dir}/,}{#{partial_paths.join(',')}}.{rb,jar}"]
    code = matchdata.post_match
  end
  return requirements
end

#extract_title(source) ⇒ Object

Searches the source for a title.



44
45
46
47
# File 'lib/ruby-processing/exporters/base_exporter.rb', line 44

def extract_title(source)
  match = source.match(/#{@info[:class_name]}\.new.*?:title\s=>\s["'](.+)["']/m)
  match ? match[1] : File.basename(@file, '.rb').titleize
end

#get_main_file(file) ⇒ Object

Returns the filepath, basename, and directory name of the sketch.



15
16
17
18
# File 'lib/ruby-processing/exporters/base_exporter.rb', line 15

def get_main_file(file)
  @file = file
  return file, File.basename(file), File.dirname(file)
end