handlebarsjs 0.5.1 → 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.builders/.templates/helper.rb +31 -0
  3. data/.builders/.templates/helper_spec.rb +38 -0
  4. data/.builders/_.rb +3 -1
  5. data/.builders/boot.rb +2 -2
  6. data/.builders/director/handlebars_helper_builder.rb +67 -0
  7. data/.builders/director/handlebars_helper_child.rb +67 -0
  8. data/.builders/director/handlebars_helper_director.rb +24 -0
  9. data/.builders/generators/helpers/comparison_helpers.rb +44 -0
  10. data/CHANGELOG.md +23 -0
  11. data/Gemfile +8 -0
  12. data/docs/domain_model.drawio +32 -32
  13. data/docs/domain_model.json +57 -57
  14. data/docs/project-plan/project.drawio +16 -16
  15. data/lib/_.rb +33 -0
  16. data/lib/handlebarsjs/base_helper.rb +18 -5
  17. data/lib/handlebarsjs/handlebars_snapshot.rb +4 -6
  18. data/lib/handlebarsjs/helpers/array/join.rb +17 -0
  19. data/lib/handlebarsjs/helpers/array/join_post.rb +17 -0
  20. data/lib/handlebarsjs/helpers/array/join_pre.rb +17 -0
  21. data/lib/handlebarsjs/helpers/case/back_slash.rb +17 -0
  22. data/lib/handlebarsjs/helpers/case/camel.rb +17 -0
  23. data/lib/handlebarsjs/helpers/case/constant.rb +17 -0
  24. data/lib/handlebarsjs/helpers/case/dash.rb +17 -0
  25. data/lib/handlebarsjs/helpers/case/dot.rb +17 -0
  26. data/lib/handlebarsjs/helpers/case/double_colon.rb +17 -0
  27. data/lib/handlebarsjs/helpers/case/human.rb +17 -0
  28. data/lib/handlebarsjs/helpers/case/lamel.rb +17 -0
  29. data/lib/handlebarsjs/helpers/case/lower.rb +17 -0
  30. data/lib/handlebarsjs/helpers/case/slash.rb +17 -0
  31. data/lib/handlebarsjs/helpers/case/snake.rb +17 -0
  32. data/lib/handlebarsjs/helpers/case/title.rb +17 -0
  33. data/lib/handlebarsjs/helpers/case/upper.rb +17 -0
  34. data/lib/handlebarsjs/helpers/comparison/and.rb +17 -0
  35. data/lib/handlebarsjs/helpers/comparison/default.rb +17 -0
  36. data/lib/handlebarsjs/helpers/comparison/eq.rb +17 -0
  37. data/lib/handlebarsjs/helpers/comparison/gt.rb +17 -0
  38. data/lib/handlebarsjs/helpers/comparison/gte.rb +17 -0
  39. data/lib/handlebarsjs/helpers/comparison/lt.rb +17 -0
  40. data/lib/handlebarsjs/helpers/comparison/lte.rb +17 -0
  41. data/lib/handlebarsjs/helpers/comparison/ne.rb +17 -0
  42. data/lib/handlebarsjs/helpers/comparison/or.rb +17 -0
  43. data/lib/handlebarsjs/helpers/inflection/ordinal.rb +17 -0
  44. data/lib/handlebarsjs/helpers/inflection/ordinalize.rb +17 -0
  45. data/lib/handlebarsjs/helpers/inflection/pluralize.rb +17 -0
  46. data/lib/handlebarsjs/helpers/inflection/pluralize_number.rb +17 -0
  47. data/lib/handlebarsjs/helpers/inflection/pluralize_number_word.rb +17 -0
  48. data/lib/handlebarsjs/helpers/inflection/singularize.rb +17 -0
  49. data/lib/handlebarsjs/version.rb +1 -1
  50. data/lib/handlebarsjs.rb +2 -0
  51. data/package-lock.json +2 -2
  52. data/package.json +1 -1
  53. metadata +57 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6264c529d68086fcf2d2abc20838e7c46ff5a2cb176ebf211d5f44f32b15c5bd
4
- data.tar.gz: 05726eb4303fc7b54e5fe8a07afd5392f1f48c2efadedcbb12d99dc3a88b11a2
3
+ metadata.gz: 1ae80a08fb0257c2b9f0ad6f48cd7c907bc15388b8a68d02ddd1b05ac69bff96
4
+ data.tar.gz: 84a1eb1d565250f52346f7454e3122759e795d7801a0c1d4cd106af71b7dae8b
5
5
  SHA512:
6
- metadata.gz: 4d28aa4b1af80536b8a9e26390a5e0e926568bc4fb82bc9d08d5d1509dfc00ba6a017e25b9d52d219fd4baf70b17de5d8d4a7426feef5248d1246f04e45e03e9
7
- data.tar.gz: 61ab8b27c8a27326d91ae3726d348aa987825db3a1638e5807949055819e073073a564cf6fcb042ea44d603bc3f38332c3557797c340f48859fa46320af83633
6
+ metadata.gz: f308dce020f6a57b9d6c2b21997abb5add4b9ad040b8217ab033b7f1ac990a94ca2c74e2ad1ebde394a16ffce031dc40341333d50705d83b91fc62ac570cdf47
7
+ data.tar.gz: 2a6253654fcbd9c3ca30a2b4c071667bfe16814d72fa1a465edc2845fc658b88d23482b3521e9520d0585301d6a757ee4c69a8088deb49454cb869e12ef3c8e9
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Handlebarsjs
4
+ module Helpers
5
+ # {{helper.category_description}}
6
+ module {{camel helper.category}}
7
+ # {{helper.description}}
8
+ class And < Handlebarsjs::BaseHelper
9
+ # Parse
10
+ #
11
+ {{#each helper.examples}}
12
+ # @example
13
+ #
14
+ {{.}}
15
+ {{/each}}
16
+ #
17
+ {{#each helper.parameters}}
18
+ # @param {{./name}} {{./description}}
19
+ {{/each}}
20
+ # @return [String] {{helper.result}}
21
+ def parse({{#each helper.parameters}}{{#if @first }}{{^}}, {{/if}}{{#if splat}}*{{/if}}{{./name}}{{/each}})
22
+ values.all? { |value| value }
23
+ end
24
+
25
+ def to_proc
26
+ ->(*values, _opts) { wrapper(parse(values[0..-2])) }
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+ # xxxxxxx spec
3
+ module Handlebarsjs
4
+ module Helpers
5
+ # Comparison helpers, eg. or, and, equal, not equal, less than, greater than etc.
6
+ module Comparison
7
+ # And: Block helper that renders a block if **all of** the given values are truthy. If an inverse block is specified it will be rendered when falsy.
8
+ class And < Handlebarsjs::BaseHelper
9
+ # Parse will And: Block helper that renders a block if **all of** the given values are truthy. If an inverse block is specified it will be rendered when falsy.
10
+ #
11
+ # @example
12
+ #
13
+ # {{#if (and p1 p2 p3 p4 p5)}}
14
+ # found
15
+ # {{/if}}
16
+ #
17
+ # @example
18
+ #
19
+ # @example
20
+ # {{#if (and name age)}}
21
+ # {{name}}-{{age}}
22
+ # {{else}}
23
+ # no name or age
24
+ # {{/if}}
25
+ #
26
+ # @param values list of values (via *splat) to be checked via AND condition
27
+ # @return [String] return block when every value is truthy
28
+ def parse(values)
29
+ values.all? { |value| value }
30
+ end
31
+
32
+ def to_proc
33
+ ->(*values, _opts) { wrapper(parse(values[0..-2])) }
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
data/.builders/_.rb CHANGED
@@ -1 +1,3 @@
1
- # require_relative './path/here'
1
+ require_relative './director/handlebars_helper_builder'
2
+ require_relative './director/handlebars_helper_director'
3
+ require_relative './director/handlebars_helper_child'
data/.builders/boot.rb CHANGED
@@ -49,8 +49,8 @@ KConfig.configure(CONFIG_KEY) do |config|
49
49
  config.template_folders.add(:template , File.expand_path('.templates', Dir.pwd))
50
50
 
51
51
  config.target_folders.add(:app , base_folder)
52
- config.target_folders.add(:lib , :app, 'lib', 'drawio_dsl')
53
- config.target_folders.add(:spec , :app, 'spec', 'drawio_dsl')
52
+ config.target_folders.add(:lib , :app, 'lib', 'handlebarsjs')
53
+ config.target_folders.add(:spec , :app, 'spec', 'handlebarsjs')
54
54
  config.target_folders.add(:docs , :app, 'docs')
55
55
  config.target_folders.add(:builder , builder_folder)
56
56
  end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ puts 'xxxxxxx'
4
+ class HandlebarsHelperBuilder < KDirector::Builders::ActionsBuilder
5
+ attr_reader :current_helper
6
+ # attr_accessor :actions
7
+ # attr_accessor :last_action
8
+
9
+ def initialize
10
+ super
11
+
12
+ dom[:helpers] = []
13
+ # @actions = []
14
+ # @last_action = {}
15
+ end
16
+
17
+ def helpers
18
+ dom[:helpers]
19
+ end
20
+
21
+ def add_helper
22
+ @current_helper = new_helper
23
+ dom[:helpers] << current_helper
24
+ end
25
+
26
+ def helper_setting(name, value)
27
+ @current_helper[name] = value
28
+ end
29
+
30
+ def add_helper_parameter(name, description, splat: false)
31
+ parameter = {
32
+ name: name,
33
+ description: description,
34
+ splat: splat
35
+ }
36
+
37
+ @current_helper[:parameters] << parameter
38
+ end
39
+
40
+ def add_helper_example(value)
41
+ lines = value.split("\n")
42
+ value = lines.map { |line| " # #{line.strip}" }.join("\n")
43
+
44
+ @current_helper[:examples] << value
45
+ end
46
+
47
+
48
+ private
49
+
50
+ def new_helper
51
+ {
52
+ name: nil,
53
+ description: nil,
54
+ result: nil,
55
+ category: nil,
56
+ category_description: nil,
57
+ base_class_require: nil,
58
+ base_class: nil,
59
+ example_input_value: nil,
60
+ example_output_value: nil,
61
+ test_input_value: nil,
62
+ test_output_value: nil,
63
+ parameters: [],
64
+ examples: []
65
+ }
66
+ end
67
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ class HandlebarsHelperChild < KDirector::Directors::ChildDirector
4
+ def initialize(parent, **opts)
5
+ super(parent, **opts)
6
+
7
+ builder.add_helper
8
+
9
+ # defaults = {
10
+ # repo_name: opts[:repo_name], # || parent.builder.dom&[:github]&[:repo_name]
11
+ # username: opts[:username] || default_github_username, # || parent.builder.dom&[:github]&[:username]
12
+ # organization: opts[:organization] # || parent.builder.dom&[:github]&[:organization]
13
+ # }
14
+ end
15
+
16
+ def name(value)
17
+ builder.helper_setting(:name, value)
18
+ end
19
+
20
+ def description(value)
21
+ builder.helper_setting(:description, value)
22
+ end
23
+
24
+ def result(value)
25
+ builder.helper_setting(:result, value)
26
+ end
27
+
28
+ def category(value)
29
+ builder.helper_setting(:category, value)
30
+ end
31
+
32
+ def category_description(value)
33
+ builder.helper_setting(:category_description, value)
34
+ end
35
+
36
+ # def base_class_require(value)
37
+ # builder.helper_setting(:base_class_require, value)
38
+ # end
39
+
40
+ # def base_class(value)
41
+ # builder.helper_setting(:base_class, value)
42
+ # end
43
+
44
+ # def example_input_value(value)
45
+ # builder.helper_setting(:example_input_value, value)
46
+ # end
47
+
48
+ # def example_output_value(value)
49
+ # builder.helper_setting(:example_output_value, value)
50
+ # end
51
+
52
+ # def test_input_value(value)
53
+ # builder.helper_setting(:test_input_value, value)
54
+ # end
55
+
56
+ # def test_output_value(value)
57
+ # builder.helper_setting(:test_output_value, value)
58
+ # end
59
+
60
+ def parameter(name, description, splat: false)
61
+ builder.add_helper_parameter(name, description, splat: splat)
62
+ end
63
+
64
+ def example(value)
65
+ builder.add_helper_example(value)
66
+ end
67
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ class HandlebarsHelperDirector < KDirector::Directors::BaseDirector
4
+ default_builder_type(HandlebarsHelperBuilder)
5
+
6
+ def helper(**opts, &block)
7
+ helper = HandlebarsHelperChild.new(self, **opts)
8
+ helper.instance_eval(&block) if block_given?
9
+
10
+ self
11
+ end
12
+
13
+ def build_helpers
14
+ builder.helpers.each do |helper|
15
+ cd(:lib)
16
+ add("helpers/#{helper[:category]}/#{helper[:name]}.rb", template_file: 'helper.rb', helper: helper)
17
+
18
+ cd(:spec)
19
+ add("helpers/#{helper[:category]}/#{helper[:name]}_spec.rb", template_file: 'helper_spec.rb', helper: helper)
20
+ end
21
+
22
+ self
23
+ end
24
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ # base_class_require 'handlebars/helpers/comparison/base_helper'
4
+ # base_class 'Handlebars::Helpers::Comparison::BaseHelper'
5
+ # example_input_value 'var1 and var2'
6
+ # example_output_value 'truthy block'
7
+ # test_input_value 'var1 and var2'
8
+ # test_output_value 'truthy block'
9
+
10
+ KManager.action :comparison_helpers do
11
+ action do
12
+ common = OpenStruct.new(
13
+ category_name: 'comparison',
14
+ category_description: 'Comparison helpers, eg. or, and, equal, not equal, less than, greater than etc.'
15
+ )
16
+
17
+ HandlebarsHelperDirector
18
+ .init(k_builder, on_exist: :write, on_action: :execute)
19
+ .helper do
20
+ category common.category_name
21
+ category_description common.category_description
22
+ name 'and'
23
+ description 'And: Block helper that renders a block if **all of** the given values are truthy. If an inverse block is specified it will be rendered when falsy.'
24
+ result "return block when every value is truthy"
25
+ parameter('values', 'list of values (via *splat) to be checked via AND condition', splat: true)
26
+
27
+ example <<-TEXT
28
+ {{#if (and p1 p2 p3 p4 p5)}}
29
+ found
30
+ {{/if}}
31
+ TEXT
32
+
33
+ example <<-TEXT
34
+ {{#if (and name age)}}
35
+ {{name}}-{{age}}
36
+ {{else}}
37
+ no name or age
38
+ {{/if}}
39
+ TEXT
40
+ end
41
+ .build_helpers
42
+ .debug
43
+ end
44
+ end
data/CHANGELOG.md CHANGED
@@ -1,3 +1,26 @@
1
+ ## [0.5.3](https://github.com/klueless-io/handlebarsjs/compare/v0.5.2...v0.5.3) (2022-07-12)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * add inflection: pluralize_number and pluralize_number_word ([2f5d6e1](https://github.com/klueless-io/handlebarsjs/commit/2f5d6e11b8cc6cd052496ec3f648423fbacececf))
7
+ * add inflection: pluralize_number and pluralize_number_word ([6590859](https://github.com/klueless-io/handlebarsjs/commit/6590859ddfb3d3402677939d887e70e611d18a97))
8
+
9
+ ## [0.5.2](https://github.com/klueless-io/handlebarsjs/compare/v0.5.1...v0.5.2) (2022-07-12)
10
+
11
+
12
+ ### Bug Fixes
13
+
14
+ * add helper - case: * ([08dcad2](https://github.com/klueless-io/handlebarsjs/commit/08dcad20601bf578a17ae703d273a7081486df8e))
15
+
16
+ ## [0.5.1](https://github.com/klueless-io/handlebarsjs/compare/v0.5.0...v0.5.1) (2022-07-06)
17
+
18
+
19
+ ### Bug Fixes
20
+
21
+ * add tests for base_helper ([2734326](https://github.com/klueless-io/handlebarsjs/commit/27343261d0189440a3f10f98a0a29b12f05c56e7))
22
+ * add tests for base_helper ([0c8355e](https://github.com/klueless-io/handlebarsjs/commit/0c8355e056b6d447aaffa87718240a8542958e5d))
23
+
1
24
  # [0.5.0](https://github.com/klueless-io/handlebarsjs/compare/v0.4.0...v0.5.0) (2022-07-06)
2
25
 
3
26
 
data/Gemfile CHANGED
@@ -19,3 +19,11 @@ end
19
19
  group :test do
20
20
  gem 'simplecov', require: false
21
21
  end
22
+
23
+ # If local dependency
24
+ if ENV['KLUE_LOCAL_GEMS']&.to_s&.downcase == 'true'
25
+ group :development, :test do
26
+ puts 'Using Local GEMs'
27
+ gem 'cmdlet' , path: '../cmdlet'
28
+ end
29
+ end
@@ -1,91 +1,91 @@
1
- <mxfile host="BiS">
2
- <diagram id="j0L" name="Domain Modal">
1
+ <mxfile host="jWj">
2
+ <diagram id="rZL" name="Domain Modal">
3
3
  <mxGraphModel dx="0" dy="0" background="#fafafa" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0">
4
4
  <root>
5
- <mxCell id="page_root_j0L" parent="j0L"/>
6
- <mxCell id="node_root_j0L" parent="page_root_j0L"/>
7
- <mxCell id="j0L-2" value="&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px;text-align:center&quot;&gt;&lt;b&gt;Flow&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;attach handlebars-4.7.7.js&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;attach handlebars-custom.js&lt;/p&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#dae8fc;strokeColor=#6c8ebf;fontColor=#333333;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica" vertex="1" parent="node_root_j0L">
5
+ <mxCell id="page_root_rZL" parent="rZL"/>
6
+ <mxCell id="node_root_rZL" parent="page_root_rZL"/>
7
+ <mxCell id="rZL-2" value="&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px;text-align:center&quot;&gt;&lt;b&gt;Flow&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;attach handlebars-4.7.7.js&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;attach handlebars-custom.js&lt;/p&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#dae8fc;strokeColor=#6c8ebf;fontColor=#333333;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica" vertex="1" parent="node_root_rZL">
8
8
  <mxGeometry x="10" y="10" width="160" height="160" as="geometry"/>
9
9
  </mxCell>
10
- <mxCell id="j0L-3" value="&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px;text-align:center&quot;&gt;&lt;b&gt;Configuration&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;javascript&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;javascript_file&lt;/p&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica" vertex="1" parent="node_root_j0L">
10
+ <mxCell id="rZL-3" value="&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px;text-align:center&quot;&gt;&lt;b&gt;Configuration&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;javascript&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;javascript_file&lt;/p&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica" vertex="1" parent="node_root_rZL">
11
11
  <mxGeometry x="190" y="10" width="160" height="160" as="geometry"/>
12
12
  </mxCell>
13
- <mxCell id="j0L-4" value="&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px;text-align:center&quot;&gt;&lt;b&gt;Manager&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;snapshot: MR::Snapshot&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;load_javascript()&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;register_helper()&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;register_partial()&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;compile_template()&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;execute_template()&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;execute_javascript()&lt;/p&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica" vertex="1" parent="node_root_j0L">
13
+ <mxCell id="rZL-4" value="&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px;text-align:center&quot;&gt;&lt;b&gt;Manager&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;snapshot: MR::Snapshot&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;load_javascript()&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;register_helper()&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;register_partial()&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;compile_template()&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;execute_template()&lt;/p&gt;&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px&quot;&gt;execute_javascript()&lt;/p&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica" vertex="1" parent="node_root_rZL">
14
14
  <mxGeometry x="370" y="10" width="160" height="160" as="geometry"/>
15
15
  </mxCell>
16
- <mxCell id="j0L-5" value="&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px;text-align:center&quot;&gt;&lt;b&gt;Context&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica" vertex="1" parent="node_root_j0L">
16
+ <mxCell id="rZL-5" value="&lt;p style=&quot;margin:0px;margin-left:4px;margin-bottom:4px;text-align:center&quot;&gt;&lt;b&gt;Context&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica" vertex="1" parent="node_root_rZL">
17
17
  <mxGeometry x="550" y="10" width="160" height="160" as="geometry"/>
18
18
  </mxCell>
19
- <mxCell id="j0L-6" value="" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fafafa;strokeColor=#fafafa;fontColor=#fafafa" vertex="1" parent="node_root_j0L">
19
+ <mxCell id="rZL-6" value="" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fafafa;strokeColor=#fafafa;fontColor=#fafafa" vertex="1" parent="node_root_rZL">
20
20
  <mxGeometry x="805" y="85" width="10" height="10" as="geometry"/>
21
21
  </mxCell>
22
- <mxCell id="j0L-7" value="" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fafafa;strokeColor=#fafafa;fontColor=#fafafa" vertex="1" parent="node_root_j0L">
22
+ <mxCell id="rZL-7" value="" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fafafa;strokeColor=#fafafa;fontColor=#fafafa" vertex="1" parent="node_root_rZL">
23
23
  <mxGeometry x="985" y="85" width="10" height="10" as="geometry"/>
24
24
  </mxCell>
25
- <mxCell id="a1" value="KManager -&gt; KBuilder" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333" vertex="1" parent="node_root_j0L">
25
+ <mxCell id="a1" value="KManager -&gt; KBuilder" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333" vertex="1" parent="node_root_rZL">
26
26
  <mxGeometry x="10" y="190" width="80" height="80" as="geometry"/>
27
27
  </mxCell>
28
- <mxCell id="a2" value="Handlebars-Helpers (ruby)" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333" vertex="1" parent="node_root_j0L">
28
+ <mxCell id="a2" value="Handlebars-Helpers (ruby)" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333" vertex="1" parent="node_root_rZL">
29
29
  <mxGeometry x="110" y="190" width="80" height="80" as="geometry"/>
30
30
  </mxCell>
31
- <mxCell id="a3" value="HandlebarsJS (ruby)" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333" vertex="1" parent="node_root_j0L">
31
+ <mxCell id="a3" value="HandlebarsJS (ruby)" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333" vertex="1" parent="node_root_rZL">
32
32
  <mxGeometry x="210" y="190" width="80" height="80" as="geometry"/>
33
33
  </mxCell>
34
- <mxCell id="a4" value="Mini Racer" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333" vertex="1" parent="node_root_j0L">
34
+ <mxCell id="a4" value="Mini Racer" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#d5e8d4;strokeColor=#82b366;fontColor=#333333" vertex="1" parent="node_root_rZL">
35
35
  <mxGeometry x="310" y="190" width="80" height="80" as="geometry"/>
36
36
  </mxCell>
37
- <mxCell id="a5" value="Handlebars (ruby)" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_j0L">
37
+ <mxCell id="a5" value="Handlebars (ruby)" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_rZL">
38
38
  <mxGeometry x="410" y="190" width="80" height="80" as="geometry"/>
39
39
  </mxCell>
40
- <mxCell id="a6" value="The Ruby Racer" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_j0L">
40
+ <mxCell id="a6" value="The Ruby Racer" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;fontColor=#333333" vertex="1" parent="node_root_rZL">
41
41
  <mxGeometry x="510" y="190" width="80" height="80" as="geometry"/>
42
42
  </mxCell>
43
- <mxCell id="a7" value="Node V8 engine" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#1ba1e2;strokeColor=#006EAF;fontColor=#ffffff" vertex="1" parent="node_root_j0L">
43
+ <mxCell id="a7" value="Node V8 engine" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#1ba1e2;strokeColor=#006EAF;fontColor=#ffffff" vertex="1" parent="node_root_rZL">
44
44
  <mxGeometry x="10" y="290" width="80" height="80" as="geometry"/>
45
45
  </mxCell>
46
- <mxCell id="a8" value="Handlebars.js (javascript)" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333" vertex="1" parent="node_root_j0L">
46
+ <mxCell id="a8" value="Handlebars.js (javascript)" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;fontColor=#333333" vertex="1" parent="node_root_rZL">
47
47
  <mxGeometry x="110" y="290" width="80" height="80" as="geometry"/>
48
48
  </mxCell>
49
- <mxCell id="j0L-17" value="" style="edgeStyle=orthogonalEdgeStyle;curved=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=none;startFill=1;endArrow=open;endFill=1;whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00" parent="node_root_j0L" source="a1" target="a2" edge="1">
49
+ <mxCell id="rZL-17" value="" style="edgeStyle=orthogonalEdgeStyle;curved=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=none;startFill=1;endArrow=open;endFill=1;whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00" parent="node_root_rZL" source="a1" target="a2" edge="1">
50
50
  <mxGeometry relative="1" as="geometry"/>
51
51
  </mxCell>
52
- <mxCell id="j0L-18" value="" style="edgeStyle=orthogonalEdgeStyle;curved=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=none;startFill=1;endArrow=open;endFill=1;whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00" parent="node_root_j0L" source="a2" target="a3" edge="1">
52
+ <mxCell id="rZL-18" value="" style="edgeStyle=orthogonalEdgeStyle;curved=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=none;startFill=1;endArrow=open;endFill=1;whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00" parent="node_root_rZL" source="a2" target="a3" edge="1">
53
53
  <mxGeometry relative="1" as="geometry"/>
54
54
  </mxCell>
55
- <mxCell id="j0L-19" value="" style="edgeStyle=orthogonalEdgeStyle;curved=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=none;startFill=1;endArrow=open;endFill=1;whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00" parent="node_root_j0L" source="a3" target="a4" edge="1">
55
+ <mxCell id="rZL-19" value="" style="edgeStyle=orthogonalEdgeStyle;curved=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=none;startFill=1;endArrow=open;endFill=1;whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00" parent="node_root_rZL" source="a3" target="a4" edge="1">
56
56
  <mxGeometry relative="1" as="geometry"/>
57
57
  </mxCell>
58
- <mxCell id="j0L-20" value="" style="edgeStyle=orthogonalEdgeStyle;curved=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=none;startFill=1;endArrow=open;endFill=1;whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00" parent="node_root_j0L" source="a2" target="a5" edge="1">
58
+ <mxCell id="rZL-20" value="" style="edgeStyle=orthogonalEdgeStyle;curved=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=none;startFill=1;endArrow=open;endFill=1;whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00" parent="node_root_rZL" source="a2" target="a5" edge="1">
59
59
  <mxGeometry relative="1" as="geometry"/>
60
60
  </mxCell>
61
- <mxCell id="j0L-21" value="" style="edgeStyle=orthogonalEdgeStyle;curved=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=none;startFill=1;endArrow=open;endFill=1;whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00" parent="node_root_j0L" source="a5" target="a6" edge="1">
61
+ <mxCell id="rZL-21" value="" style="edgeStyle=orthogonalEdgeStyle;curved=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=none;startFill=1;endArrow=open;endFill=1;whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00" parent="node_root_rZL" source="a5" target="a6" edge="1">
62
62
  <mxGeometry relative="1" as="geometry"/>
63
63
  </mxCell>
64
- <mxCell id="j0L-22" value="" style="edgeStyle=orthogonalEdgeStyle;curved=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=none;startFill=1;endArrow=open;endFill=1;whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00" parent="node_root_j0L" source="a4" target="a7" edge="1">
64
+ <mxCell id="rZL-22" value="" style="edgeStyle=orthogonalEdgeStyle;curved=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=none;startFill=1;endArrow=open;endFill=1;whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00" parent="node_root_rZL" source="a4" target="a7" edge="1">
65
65
  <mxGeometry relative="1" as="geometry"/>
66
66
  </mxCell>
67
- <mxCell id="j0L-23" value="" style="edgeStyle=orthogonalEdgeStyle;curved=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=none;startFill=1;endArrow=open;endFill=1;whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00" parent="node_root_j0L" source="a6" target="a7" edge="1">
67
+ <mxCell id="rZL-23" value="" style="edgeStyle=orthogonalEdgeStyle;curved=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=none;startFill=1;endArrow=open;endFill=1;whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00" parent="node_root_rZL" source="a6" target="a7" edge="1">
68
68
  <mxGeometry relative="1" as="geometry"/>
69
69
  </mxCell>
70
- <mxCell id="j0L-24" value="" style="edgeStyle=orthogonalEdgeStyle;curved=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=none;startFill=1;endArrow=open;endFill=1;whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00" parent="node_root_j0L" source="a7" target="a8" edge="1">
70
+ <mxCell id="rZL-24" value="" style="edgeStyle=orthogonalEdgeStyle;curved=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;startArrow=none;startFill=1;endArrow=open;endFill=1;whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00" parent="node_root_rZL" source="a7" target="a8" edge="1">
71
71
  <mxGeometry relative="1" as="geometry"/>
72
72
  </mxCell>
73
- <mxCell id="j0L-25" value="" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fafafa;strokeColor=#fafafa;fontColor=#fafafa" vertex="1" parent="node_root_j0L">
73
+ <mxCell id="rZL-25" value="" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fafafa;strokeColor=#fafafa;fontColor=#fafafa" vertex="1" parent="node_root_rZL">
74
74
  <mxGeometry x="245" y="325" width="10" height="10" as="geometry"/>
75
75
  </mxCell>
76
- <mxCell id="j0L-26" value="" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fafafa;strokeColor=#fafafa;fontColor=#fafafa" vertex="1" parent="node_root_j0L">
76
+ <mxCell id="rZL-26" value="" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fafafa;strokeColor=#fafafa;fontColor=#fafafa" vertex="1" parent="node_root_rZL">
77
77
  <mxGeometry x="345" y="325" width="10" height="10" as="geometry"/>
78
78
  </mxCell>
79
- <mxCell id="j0L-27" value="" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fafafa;strokeColor=#fafafa;fontColor=#fafafa" vertex="1" parent="node_root_j0L">
79
+ <mxCell id="rZL-27" value="" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fafafa;strokeColor=#fafafa;fontColor=#fafafa" vertex="1" parent="node_root_rZL">
80
80
  <mxGeometry x="445" y="325" width="10" height="10" as="geometry"/>
81
81
  </mxCell>
82
- <mxCell id="j0L-28" value="" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fafafa;strokeColor=#fafafa;fontColor=#fafafa" vertex="1" parent="node_root_j0L">
82
+ <mxCell id="rZL-28" value="" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#fafafa;strokeColor=#fafafa;fontColor=#fafafa" vertex="1" parent="node_root_rZL">
83
83
  <mxGeometry x="545" y="325" width="10" height="10" as="geometry"/>
84
84
  </mxCell>
85
- <mxCell id="j0L-30" value="Domain Model" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333;fontSize=20;verticalAlign=top" vertex="1" parent="node_root_j0L">
85
+ <mxCell id="rZL-30" value="Domain Model" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333;fontSize=20;verticalAlign=top" vertex="1" parent="node_root_rZL">
86
86
  <mxGeometry x="25" y="405" width="50" height="50" as="geometry"/>
87
87
  </mxCell>
88
- <mxCell id="j0L-31" value="GEM Architecture Flow" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333;fontSize=20;verticalAlign=top" vertex="1" parent="node_root_j0L">
88
+ <mxCell id="rZL-31" value="GEM Architecture Flow" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333;fontSize=20;verticalAlign=top" vertex="1" parent="node_root_rZL">
89
89
  <mxGeometry x="25" y="505" width="50" height="50" as="geometry"/>
90
90
  </mxCell>
91
91
  </root>