silly_templates 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. data/bin/silly +14 -0
  2. data/lib/silly.rb +105 -0
  3. metadata +48 -0
data/bin/silly ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'silly'
4
+
5
+ if ARGV.size < 2 then
6
+ puts "USAGE: #{__FILE__} input_dir output_dir"
7
+ exit 1
8
+ end
9
+
10
+ options = {
11
+ :template_dir => ARGV[0],
12
+ :output_dir => ARGV[1]
13
+ }
14
+ Silly.new.transform options
data/lib/silly.rb ADDED
@@ -0,0 +1,105 @@
1
+ # Generates silly and simplistic erlang module templates
2
+ # from a very small subset of the moustache templating language.
3
+ # In fact, the only thing that is supported, are the moustaches:
4
+ #
5
+ # {{ parameter_name }}
6
+ #
7
+ # Usage:
8
+ #
9
+ # Write your template files and save them as .tmpl in a folder
10
+ # of your choice.
11
+ #
12
+ # Run:
13
+ #
14
+ # Silly.new.transform
15
+ # :template_dir => "PATH_TO_TEMPLATES",
16
+ # :output_dir => "src"
17
+ #
18
+ # This will transform your tempaltes into Erlang files.
19
+ # Now why use this rather than, say, erlydtl or the erlang
20
+ # implementation of moustache?
21
+ # The only reason I can think of is if you want to use dialyzer.
22
+ # The template generators output beam files without debug_info,
23
+ # and since the source is not existant, you cannot do proper dialyzation!
24
+ #
25
+ # Happy templating!
26
+
27
+ class Silly
28
+ def transform options
29
+ templates = Dir.entries(options[:template_dir]).select {|r| r =~ /\.tmpl$/}
30
+ templates.each do |t|
31
+ t =~ /(.*)\.tmpl$/
32
+ name = $1
33
+ parsed = parse(read("#{options[:template_dir]}/#{t}"))
34
+ file =<<EOF
35
+ %% Warning! This is an automatically generated file.
36
+ %% Do not edit it, please! Instead edit #{t}.
37
+
38
+ -module(#{name}_silly).
39
+ -export([render/1]).
40
+ #{gen_types parsed}
41
+ #{gen_function parsed}
42
+ EOF
43
+ path = "#{options[:output_dir]}/#{name}_silly.erl"
44
+ File.open(path, "w") do |f|
45
+ f.write file
46
+ end
47
+ end
48
+ end
49
+
50
+ def read file
51
+ File.read(file)
52
+ end
53
+
54
+ def parse text
55
+ texts = []
56
+ params = []
57
+ while count = text =~ /(\{\{\s*([a-zA-Z0-9_-]*)\s*\}\})/ do
58
+ texts << text[0...count]
59
+ text = text[(count + $1.size)..-1]
60
+ params << $2.to_sym
61
+ end
62
+ texts << text
63
+
64
+ {
65
+ :params => params,
66
+ :texts => texts
67
+ }
68
+ end
69
+
70
+ def gen_types parsed
71
+ individual_types = (parsed[:params].map {|t| "-type #{t}() :: {#{t}, binary()}."}).join("\n")
72
+ input_type = "-type silly_input() :: #{(parsed[:params].map {|t| "#{t}()"}).join(" | ")}."
73
+ "#{individual_types}\n#{input_type}\n"
74
+ end
75
+
76
+ def escape text
77
+ text.gsub(/\n/, "\\n").gsub(/"/, "\\\"")
78
+ end
79
+
80
+ def gen_function parsed
81
+ params =<<EOF
82
+ -spec get_param(atom(), [silly_input()]) -> binary().
83
+ get_param(Param, Inputs) ->
84
+ case proplists:get_value(Param, Inputs, undefined) of
85
+ undefined -> throw(list_to_binary("SillyTemplates requires parameter " ++ atom_to_list(Param)));
86
+ P -> P
87
+ end.
88
+ EOF
89
+
90
+ output = []
91
+ parsed[:texts].zip(parsed[:params]).each do |text, param|
92
+ out = " <<\"#{escape(text)}\">>"
93
+ out += ",\n get_param(#{param.to_s}, Inputs)," if param
94
+ output << out
95
+ end
96
+ <<EOF
97
+ #{params}
98
+ -spec render([silly_input()]) -> binary().
99
+ render(Inputs) ->
100
+ list_to_binary([
101
+ #{output.join("\n")}
102
+ ]).
103
+ EOF
104
+ end
105
+ end
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: silly_templates
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Sebastian Probst Eide
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-10-31 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Converts a subset of the moustache templating language into Erlang template
15
+ modules. See https://github.com/Aircloak/silly-templates
16
+ email: sebastian@aircloak.com
17
+ executables:
18
+ - silly
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - lib/silly.rb
23
+ - bin/silly
24
+ homepage: https://github.com/Aircloak/silly-templates
25
+ licenses: []
26
+ post_install_message:
27
+ rdoc_options: []
28
+ require_paths:
29
+ - lib
30
+ required_ruby_version: !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ! '>='
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ required_rubygems_version: !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ! '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubyforge_project:
44
+ rubygems_version: 1.8.10
45
+ signing_key:
46
+ specification_version: 3
47
+ summary: Generates Erlang template modules.
48
+ test_files: []