Class: Thot::Template

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

Overview

KISS template Engine

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(template_file: nil, list_token:, strict: true, template_content: nil) ⇒ Template

constructor : generate the pseudo accessor for template Class from token list



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/thot.rb', line 20

def initialize(template_file: nil, list_token: , strict: true, template_content: nil)
  
  @result = ""
  if template_file
    @template_file = template_file
    raise NoTemplateFile::new('No template file found') unless File::exist?(@template_file)
    begin
      @content = IO::readlines(@template_file).join.chomp
    rescue
      raise NoTemplateFile::new('Template file read error')
    end
  elsif template_content
    @content =  template_content
  else
    raise NoTemplateFile::new('No template file found or template content')
  end
    
  
  token_from_template = @content.scan(/%%(\w+)%%/).flatten.uniq.map{ |item| item.downcase.to_sym}
  begin
    @list_token = list_token
    @hash_token = Hash::new; @list_token.each{|_item| @hash_token[_item.to_s] = String::new('')}
  rescue
    raise InvalidTokenList::new("Token list malformation")
  end
  if strict
    raise InvalidTokenList::new("Token list doesn't match the template") unless token_from_template.sort == @list_token.sort
  else
    raise InvalidTokenList::new("Token list doesn't match the template") unless (token_from_template.sort & @list_token.sort) == token_from_template.sort
  end
  @list_token.each do |_token|
    self.instance_eval do
      define_singleton_method(:"#{_token}=") {|_value| raise ArgumentError::new('Not a String') unless _value.class == String; @hash_token[__callee__.to_s.chomp('=')] = _value }
      define_singleton_method(_token.to_sym) { return @hash_token[__callee__.to_s]  }
    end
  end
  
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(_name, *_args) ⇒ Object

collector for pseudo accessor to prevent bad mapping

Raises:

  • (NotAToken)

    if caling an accessor not mapped in token list



81
82
83
# File 'lib/thot.rb', line 81

def method_missing(_name,*_args)
  raise NotAToken
end

Instance Attribute Details

#contentObject (readonly)

getter of the flat content of the template



17
18
19
# File 'lib/thot.rb', line 17

def content
  @content
end

#list_tokenObject (readonly)

getter of the list of token



13
14
15
# File 'lib/thot.rb', line 13

def list_token
  @list_token
end

#template_fileObject (readonly)

getter of the template file



15
16
17
# File 'lib/thot.rb', line 15

def template_file
  @template_file
end

Instance Method Details

#map(_hash) ⇒ Object

map a hash against templates token_list

Parameters:

  • _hash (Hash)

    a hash data to map



70
71
72
73
74
75
76
77
# File 'lib/thot.rb', line 70

def map(_hash)
  _data = {}
  _hash.each { |item,val|
    raise ArgumentError::new("#{item} : Not a String") unless val.class == String
    _data[item.to_s.downcase] = val
  }
  @hash_token = _data
end

#outputString

the templater;proceed to templating

Returns:

  • (String)

    the template output



87
88
89
90
91
92
93
94
# File 'lib/thot.rb', line 87

def output
  @result = @content
  @list_token.each{|_token|
    self.filtering  @content.scan(/%%(#{_token.to_s.upcase}[\.\w+]+)%%/).flatten
    @result.gsub!(/%%#{_token.to_s.upcase}%%/,@hash_token[_token.to_s]) if @hash_token.include? _token.to_s
  }
  return @result
end

#token(_token, _value) ⇒ Object

generic accessor

Parameters:

  • _token (Symbol)

    in the token list

  • _value (String)

    a text value

Raises:

  • (ArgumentError)

    if _valu is not a String



63
64
65
66
# File 'lib/thot.rb', line 63

def token(_token,_value)
  raise ArgumentError::new('Not a String') unless _value.class == String
  @hash_token[_token.to_s] = _value
end