Class: Mjml::Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/mjml/parser.rb

Defined Under Namespace

Classes: ParseError

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(input) ⇒ Parser

Create new parser

Parameters:

  • input (String)

    The string to transform in html



12
13
14
15
16
# File 'lib/mjml/parser.rb', line 12

def initialize(input)
  raise Mjml.mjml_binary_error_string unless Mjml.valid_mjml_binary

  @input = input
end

Instance Attribute Details

#inputObject (readonly)

Returns the value of attribute input.



7
8
9
# File 'lib/mjml/parser.rb', line 7

def input
  @input
end

Instance Method Details

#build_command(in_file, out_file) ⇒ String

Build command string from config variables

Returns:

  • (String)

    Command string



56
57
58
59
60
61
62
63
# File 'lib/mjml/parser.rb', line 56

def build_command(in_file, out_file)
  command = "-r #{in_file} -o #{out_file.path} " \
            "--config.beautify #{Mjml.beautify} " \
            "--config.minify #{Mjml.minify} " \
            "--config.validationLevel #{Mjml.validation_level}"
  command += " --config.fonts '#{Mjml.fonts.to_json}'" unless Mjml.fonts.nil?
  command
end

#renderString

Render mjml template

Returns:

  • (String)


21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/mjml/parser.rb', line 21

def render
  in_tmp_file = Tempfile.open(['in', '.mjml']) do |file|
    file.write(input)
    file # return tempfile from block so #unlink works later
  end
  run(in_tmp_file.path)
rescue StandardError
  raise if Mjml.raise_render_exception

  ''
ensure
  in_tmp_file&.unlink
end

#run(in_tmp_file) ⇒ String

Exec mjml command

Returns:

  • (String)

    The result as string



38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/mjml/parser.rb', line 38

def run(in_tmp_file)
  Tempfile.create(['out', '.html']) do |out_tmp_file|
    _, stderr, status = Mjml.run_mjml(build_command(in_tmp_file, out_tmp_file))

    unless status.success?
      # The process status ist quite helpful in case of dying processes without STDERR output.
      # Node exit codes are documented here: https://node.readthedocs.io/en/latest/api/process/#exit-codes
      raise ParseError, "#{stderr.chomp}\n(process status: #{status})"
    end

    Mjml.logger.warn(stderr.chomp) if stderr.present?
    out_tmp_file.read
  end
end