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.



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.



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.



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

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.



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.



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*/).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.



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

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.



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