Class: ReverseAdoc::Converters::Img

Inherits:
Base
  • Object
show all
Defined in:
lib/reverse_adoc/converters/img.rb

Instance Method Summary collapse

Methods inherited from Base

#constrained?, #escape_keychars, #extract_title, #node_has_ancestor?, #textnode_before_end_with?, #treat, #treat_children, #treat_children_coradoc, #treat_coradoc, #unconstrained_after?, #unconstrained_before?

Instance Method Details

#convert(node, state = {}) ⇒ Object



86
87
88
# File 'lib/reverse_adoc/converters/img.rb', line 86

def convert(node, state = {})
  Coradoc::Generator.gen_adoc(to_coradoc(node, state))
end

#copy_temp_file(imgdata) ⇒ Object



47
48
49
50
51
52
53
54
55
# File 'lib/reverse_adoc/converters/img.rb', line 47

def copy_temp_file(imgdata)
  Tempfile.open(["radoc", ".jpg"]) do |f|
    f.binmode
    f.write(Base64.strict_decode64(imgdata))
    f.rewind
    ext = Marcel::MimeType.for(f).sub(%r{^[^/]+/}, "")
    [ext, f.path]
  end
end

#datauri2file(src) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/reverse_adoc/converters/img.rb', line 21

def datauri2file(src)
  %r{^data:image/(?:[^;]+);base64,(?<imgdata>.+)$} =~ src

  dest_dir = Pathname.new(ReverseAdoc.config.destination).dirname
  images_dir = dest_dir.join("images")
  FileUtils.mkdir_p(images_dir)

  ext, image_src_path = determine_image_src_path(src, imgdata)
  image_dest_path = images_dir + "#{image_number}.#{ext}"

  # puts "image_dest_path: #{image_dest_path.to_s}"
  # puts "image_src_path: #{image_src_path.to_s}"

  FileUtils.cp(image_src_path, image_dest_path)
  image_number_increment

  image_dest_path.relative_path_from(dest_dir)
end

#determine_image_src_path(src, imgdata) ⇒ Object



40
41
42
43
44
45
# File 'lib/reverse_adoc/converters/img.rb', line 40

def determine_image_src_path(src, imgdata)
  return copy_temp_file(imgdata) if imgdata

  ext = File.extname(src).strip.downcase[1..-1]
  [ext, Pathname.new(ReverseAdoc.config.sourcedir).join(src)]
end

#image_numberObject



10
11
12
13
14
15
# File 'lib/reverse_adoc/converters/img.rb', line 10

def image_number
  sprintf(
    ReverseAdoc.config.image_counter_pattern,
    ReverseAdoc.config.image_counter,
  )
end

#image_number_incrementObject



17
18
19
# File 'lib/reverse_adoc/converters/img.rb', line 17

def image_number_increment
  ReverseAdoc.config.image_counter += 1
end

#to_coradoc(node, _state = {}) ⇒ Object



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/reverse_adoc/converters/img.rb', line 57

def to_coradoc(node, _state = {})
  id = node["id"]
  alt   = node["alt"]
  src   = node["src"]
  width = node["width"]
  height = node["height"]

  title = extract_title(node)

  if ReverseAdoc.config.external_images
    # puts "external image conversion #{id}, #{src}"
    src = datauri2file(src)
  end

  attributes = Coradoc::Element::AttributeList.new
  # attributes.add_named("id", id) if id
  if alt # && !alt.to_s.empty?
    attributes.add_positional(alt)
  elsif width || height
    attributes.add_positional("\"\"")
  end
  # attributes.add_named("title", title) if title
  attributes.add_positional(width) if width
  attributes.add_positional(height) if height

  Coradoc::Element::Image::BlockImage.new(title, id, src,
                                          attributes: attributes)
end