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/ blank sketches.

Direct Known Subclasses

ApplicationExporter

Constant Summary collapse

DEFAULT_DIMENSIONS =
{ 'width' => '100', 'height' => '100' }
DEFAULT_DESCRIPTION =
''
NECESSARY_FOLDERS =
%w(data lib vendor)

Instance Method Summary collapse

Instance Method Details

#extract_class_name(source) ⇒ Object

Searches the source for a class name.


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

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.


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

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
60
61
# File 'lib/ruby-processing/exporters/base_exporter.rb', line 52

def extract_dimension(source, dimension)
  filter = /#{@info[:class_name]}\.new.*?:#{dimension}\s?=>\s?(\d+)/m
  match = source.match(filter)
  sz_match = source.match(/^[^#]*size\(?\s*(\d+)\s*,\s*(\d+)\s*\)?/)
  return match[1] if match
  return (dimension == 'width' ? sz_match[1] : sz_match[2]) if sz_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.


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

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.


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

def extract_libraries(source)
  lines = source.split("\n")
  libs = lines.grep(/^[^#]*load_(?:java_|ruby_)?librar(?:y|ies)\s+(.+)/) do
    Regexp.last_match(1).split(/\s*,\s*/).map 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.


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

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

#extract_title(source) ⇒ Object

Searches the source for a title.


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

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

#get_main_file(file) ⇒ Object

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


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

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