Class: AnalyticsCharts::CustomModule

Inherits:
Object
  • Object
show all
Includes:
Magick
Defined in:
lib/analytics_charts/custom_module.rb

Instance Method Summary collapse

Constructor Details

#initialize(image_path, text, output_path) ⇒ CustomModule

Returns a new instance of CustomModule.



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/analytics_charts/custom_module.rb', line 5

def initialize(image_path, text, output_path)
  @d = Draw.new
  @d.fill = 'white'
  @d.font = 'Helvetica'
  @d.pointsize = 22
  @d.font_weight = 500
  @composite_image = Image.read(image_path)[0]
  @dummy_image = Image.new(1,1)
  @composite_columns = @composite_image.columns
  @composite_rows = @composite_image.rows
  begin
    @rows_of_text = (text)
  rescue
    puts "Had some error in CustomModule, probably a nil calling each"
    return
  end
  @height = @composite_rows + @rows_of_text.size * 22
  @base_image = Image.new(@composite_columns, @height) {
    self.background_color = "black"
  }
  @base_image.composite!(@composite_image,0,0,OverCompositeOp)
  @d = @d.stroke_color 'white'
  @d.stroke_width(1)
  @d = @d.line(0, @composite_rows, @composite_columns, @composite_rows)
  @d.draw(@base_image)
  y_offset = 22 + @composite_rows + @d.get_type_metrics(@dummy_image,"a").height / 2
  @rows_of_text.each do |text|
    if text.include? "@$$" # No paragraph break if we insert this uncommonly used word
      text.sub!("@$$", "")
      @d.annotate(@base_image, 0 ,0, 22, y_offset, text)
      next
    else
      @d.annotate(@base_image, 0 ,0, 22, y_offset, text)
      y_offset += 22
    end
  end
  @base_image.write(output_path)
end

Instance Method Details

#fits_in_a_line(text) ⇒ Object



70
71
72
# File 'lib/analytics_charts/custom_module.rb', line 70

def fits_in_a_line(text)
  return @d.get_type_metrics(@dummy_image,text).width < @composite_image.columns - 44
end

#line_wrap(text) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/analytics_charts/custom_module.rb', line 54

def line_wrap(text)
  tokens = text.split.reverse # Pop stuff off
  # Safety check, do not allow super long words.
  tokens.each {|token| return "" if not fits_in_a_line(token) }
  line_wrap_tokens = Array.new
  line_builder = ""
  while tokens.size != 0
    line_builder = tokens.pop # Pop the first word in a line
    while tokens.size != 0 and fits_in_a_line(line_builder + " " + tokens.last)
      line_builder += " " + tokens.pop
    end
    line_wrap_tokens.push(line_builder) # Add to list of lines
  end
  line_wrap_tokens
end

#tokenize_text_by_lines(text) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
# File 'lib/analytics_charts/custom_module.rb', line 43

def (text)
  # First split the text by the line carriage element
  carriage_split_lines = text.split("\r\n")
  line_tokens = Array.new
  carriage_split_lines.each do |carriage_split_line|
    line_wrap_lines = line_wrap(carriage_split_line)
    line_wrap_lines.each { |line| line_tokens.push(line) }
    line_tokens.push("\r\n")
  end
  line_tokens
end