handlebarsjs 0.5.1 → 0.5.4

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 (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>