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 =
''
NECESSARY_FOLDERS =
['data', 'lib', 'vendor']

Instance Method Summary collapse

Instance Method Details

#extract_class_name(source) ⇒ Object

Searches the source for a class name.



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

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.



62
63
64
65
# File 'lib/ruby-processing/exporters/base_exporter.rb', line 62

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.



52
53
54
55
56
57
58
59
# File 'lib/ruby-processing/exporters/base_exporter.rb', line 52

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
  warn "using default dimensions for export, please use constants integer values in size() call instead of computed ones"
  DEFAULT_DIMENSIONS[dimension]
end

#extract_informationObject

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



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

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.



68
69
70
71
72
73
74
75
76
77
# File 'lib/ruby-processing/exporters/base_exporter.rb', line 68

def extract_libraries(source)
  lines = source.split("\n")
  libs = lines.grep(/^[^#]*load_(?:java_|ruby_)?librar(?:y|ies)\s+(.+)/) do
    $1.split(/\s*,\s*/).collect do |raw_library_name| 
      raw_library_name.tr("\"':\r\n", '') 
    end
  end.flatten
  lib_loader = LibraryLoader.new
  libs.map { |lib| lib_loader.get_library_paths(lib) }.flatten.compact
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.



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

def extract_real_requires(source)
  code = source.dup
  requirements = []
  partial_paths = []
  loop do
    matchdata = code.match(/^.*[^::\.\w](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)
    where = "{#{local_dir}/,}{#{partial_paths.join(',')}}"
    unless line =~ /\.[^.]+$/
      where += ".{rb,jar}"
    end
    requirements += Dir[where]
    code = matchdata.post_match
  end
  requirements
end

#extract_title(source) ⇒ Object

Searches the source for a title.



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

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.



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

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