dashcode-converter 0.0.1 → 0.1.0

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.
@@ -11,14 +11,13 @@ module DashcodeConverter
11
11
  class Nib
12
12
 
13
13
  DECL_TEMPLATE= <<-EOF
14
- /*import coherent*/
14
+ /*jsl:import coherent*/
15
+
15
16
  NIB('<%=name%>', {
16
17
 
17
18
  <%=items_array.join(",\n\n").indent(INDENT)%>,
18
19
 
19
- 'owner': {
20
- view: REF('<%=name%>')
21
- }
20
+ <%=_owner_decl.indent(INDENT)%>
22
21
  });
23
22
  EOF
24
23
 
@@ -27,8 +26,10 @@ module DashcodeConverter
27
26
  def initialize(name, owner)
28
27
  @name= name
29
28
  @owner= owner
29
+ @owner_references= {}
30
30
  @items= {}
31
31
  @views= []
32
+ add_owner_reference('view', name)
32
33
  end
33
34
 
34
35
  def add_view(view)
@@ -36,18 +37,30 @@ module DashcodeConverter
36
37
  views << view
37
38
  end
38
39
 
40
+ def add_item(item)
41
+ items[item.name]= item
42
+ end
43
+
39
44
  def add_view_from_path(path, name=@name)
40
- view= View.new(name, parse(path), self)
45
+ view= View.new(name, self)
46
+ view.parse_spec(parse_parts(path))
41
47
  add_view(view)
42
48
  end
43
49
 
44
50
  def add_datasources_from_path(path)
45
- datasources= parse(path)
46
- datasources.each { |name, datasource|
47
- items[name]= NibItem.new(name, datasource, self)
51
+ datasources= parse_parts(path)
52
+ datasources.each { |name, spec|
53
+ datasource= NibItem.new(name, self)
54
+ datasource.parse_spec(spec)
55
+ items[name]= datasource
56
+ add_owner_reference(name, name)
48
57
  }
49
58
  end
50
-
59
+
60
+ def add_owner_reference(name, reference)
61
+ @owner_references[name]= JavascriptCode("REF('#{reference}')")
62
+ end
63
+
51
64
  def declaration
52
65
  return @declaration if @declaration
53
66
 
@@ -56,7 +69,7 @@ module DashcodeConverter
56
69
  @declaration= ERB.new(DECL_TEMPLATE.remove_indent).result binding
57
70
  end
58
71
 
59
- def parse(path)
72
+ def parse_parts(path)
60
73
  in_json= false
61
74
  json= "{\n"
62
75
  text= File.read(path)
@@ -82,6 +95,10 @@ module DashcodeConverter
82
95
  name
83
96
  end
84
97
 
98
+ def _owner_decl
99
+ "owner: #{@owner_references.to_json(JSON_PARAMS)}"
100
+ end
101
+
85
102
  end
86
103
 
87
104
  end
@@ -7,9 +7,24 @@ module DashcodeConverter
7
7
  def adjust_declaration_for_CollectionView(decl)
8
8
  if decl.include?("dataArrayBinding")
9
9
  decl.delete("dataArray")
10
- decl["contentBinding"]= decl.delete("dataArrayBinding")
11
- end
12
10
 
11
+ array_controller_name= nib.unique_name(name[1..-1])
12
+ array_controller= NibItem.new(array_controller_name, nib)
13
+ array_controller.classname="coherent.ArrayController"
14
+ array_controller.spec= {
15
+ "contentBinding" => decl.delete("dataArrayBinding")
16
+ }
17
+ nib.add_item(array_controller)
18
+ nib.add_owner_reference(array_controller_name,array_controller_name)
19
+
20
+ decl["contentBinding"]= {
21
+ :keypath => "#{array_controller_name}.arrangedObjects"
22
+ }
23
+ decl["selectionIndexesBinding"]= {
24
+ :keypath => "#{array_controller_name}.selectionIndexes"
25
+ }
26
+ end
27
+
13
28
  decl.delete("useDataSource")
14
29
  decl.delete("sampleRows")
15
30
  decl.delete("labelElementId")
@@ -22,7 +37,7 @@ module DashcodeConverter
22
37
  # version 3.0 used a whacky star notation for binding to values in the
23
38
  # list view.
24
39
  def fixup_html_for_CollectionView(html)
25
- template= View.new(nib.unique_name("ItemTemplate"), nil, nib)
40
+ template= View.new(nib.unique_name("#{name[1..-1]}Item"), nib)
26
41
  template.is_template= true
27
42
  nib.add_view(template)
28
43
  @spec["viewTemplate"]= JavascriptCode("REF('#{template.name}')")
@@ -4,13 +4,14 @@ module DashcodeConverter
4
4
  class NibItem
5
5
 
6
6
  attr_reader :name, :nib
7
- attr_accessor :view
7
+ attr_accessor :view, :classname, :spec
8
8
 
9
- def initialize(name, spec, nib)
9
+ def initialize(name, nib)
10
10
  @name= name
11
11
  @nib= nib
12
12
  @view= nil
13
- @spec= from_spec(spec)
13
+ base_classname= ""
14
+ @spec= {}
14
15
  end
15
16
 
16
17
  def declaration
@@ -20,6 +21,10 @@ module DashcodeConverter
20
21
  @declaration= "'#{name}': #{@classname}(#{values})"
21
22
  end
22
23
 
24
+ def base_classname
25
+ @base_classname ||= @classname.split(".")[-1]
26
+ end
27
+
23
28
  def fixup_html(html)
24
29
  if 'coherent.Button'==@classname
25
30
  html.name='button'
@@ -29,12 +34,12 @@ module DashcodeConverter
29
34
  end
30
35
 
31
36
  # allow class specific fixups
32
- if self.respond_to?("fixup_html_for_#{@fixupname}")
33
- self.send("fixup_html_for_#{@fixupname}", html)
37
+ if self.respond_to?("fixup_html_for_#{base_classname}")
38
+ self.send("fixup_html_for_#{base_classname}", html)
34
39
  end
35
40
  end
36
41
 
37
- def from_spec(spec)
42
+ def parse_spec(spec)
38
43
  nib_item= {}
39
44
  spec.each { |key, value|
40
45
  next if ["view", "Class", "propertyValues"].include?(key)
@@ -63,15 +68,14 @@ module DashcodeConverter
63
68
  parts[0]= "coherent" if parts[0]=="DC"
64
69
  parts[1]= CLASSNAME_LOOKUP[parts[1]] if CLASSNAME_LOOKUP.include?(parts[1])
65
70
  end
66
-
67
- @fixupname= parts[-1]
68
71
 
69
- if self.respond_to?("adjust_declaration_for_#{@fixupname}")
70
- nib_item= self.send("adjust_declaration_for_#{@fixupname}", nib_item)
72
+ @classname= parts.join(".")
73
+
74
+ if self.respond_to?("adjust_declaration_for_#{base_classname}")
75
+ nib_item= self.send("adjust_declaration_for_#{base_classname}", nib_item)
71
76
  end
72
77
 
73
- @classname= parts.join(".")
74
- nib_item
78
+ @spec= nib_item
75
79
  end
76
80
 
77
81
  end
@@ -12,12 +12,11 @@ module DashcodeConverter
12
12
  attr_reader :name, :nib, :items, :items_by_id
13
13
  attr_accessor :is_template
14
14
 
15
- def initialize(name, spec, nib)
15
+ def initialize(name, nib)
16
16
  @name= name
17
17
  @nib= nib
18
18
  @items= []
19
19
  @items_by_id= {}
20
- from_spec(spec) if spec
21
20
  end
22
21
 
23
22
  def remove_item(item)
@@ -31,9 +30,10 @@ module DashcodeConverter
31
30
  @items << item
32
31
  end
33
32
 
34
- def from_spec(spec)
33
+ def parse_spec(spec)
35
34
  spec.each { |id, part_spec|
36
- item= NibItem.new("##{id}", part_spec, nib)
35
+ item= NibItem.new("##{id}", nib)
36
+ item.parse_spec(part_spec)
37
37
  add_item(item)
38
38
  }
39
39
  end
@@ -5,18 +5,47 @@ module DashcodeConverter
5
5
 
6
6
  class Project
7
7
 
8
- attr_accessor :namespace
8
+ attr_accessor :namespace, :name
9
+
10
+ PROJECT_TEMPLATE= <<-EOF
11
+ name: <%=name%>
12
+ version: 1.0.0
13
+ notice: src/NOTICE
14
+ type: application
15
+ export: <%=name%>
16
+ output folder: build
17
+
18
+ external:
19
+ - name: coherent
20
+ path: ext/coherent
21
+ repository: https://github.com/jeffwatkins/coherent.git
22
+
23
+ include:
24
+ - coherent
25
+
26
+ source:
27
+ - src/index.html
28
+ - src/<%=name%>.jsnib
29
+ EOF
9
30
 
10
31
  def initialize(project_bundle, output_folder)
11
32
  @project_bundle= File.expand_path(project_bundle)
12
33
  @name= File.basename(@project_bundle, ".*")
13
34
  @namespace= @name
14
- @output_folder= File.expand_path(File.join(output_folder, "#{@name}.#{BUNDLE_EXTENSION}"))
35
+ @output_folder= File.expand_path(File.join(output_folder, @name))
36
+ @nib_folder= "#{@name}.#{BUNDLE_EXTENSION}"
37
+ @nib_output_folder= File.join(@output_folder, "src", @nib_folder)
38
+
39
+ @images_output_folder= File.join(@output_folder, "src", @nib_folder, "images")
40
+
15
41
  @parts_spec_path= File.join(@project_bundle, "project", "safari", "Parts", "setup.js")
16
42
  @datasources_spec_path= File.join(@project_bundle, "project", "Parts", "datasources.js")
17
43
  @css_path= File.join(@project_bundle, "project", "safari", "main.css")
18
44
  @markup_path= File.join(@project_bundle, "project", "index.html")
19
- @images_folder= File.join(@output_folder, "images")
45
+ @scripts= Scripts.new(File.join(@project_bundle, "project", "safari"))
46
+
47
+ @controller_name= "#{@name.capitalize}Controller"
48
+
20
49
  FileUtils.mkdir_p(@output_folder)
21
50
  end
22
51
 
@@ -39,7 +68,7 @@ module DashcodeConverter
39
68
  end
40
69
 
41
70
  def relative_path(path)
42
- path_relative_to_folder(path, @output_folder)
71
+ path_relative_to_folder(path, @nib_output_folder)
43
72
  end
44
73
 
45
74
  def doc
@@ -51,7 +80,7 @@ module DashcodeConverter
51
80
 
52
81
  def controller
53
82
  return @controller if @controller
54
- @controller= Controller.new(@name, @namespace)
83
+ @controller= Controller.new(@name, @namespace, @scripts)
55
84
  end
56
85
 
57
86
  def nib
@@ -72,7 +101,7 @@ module DashcodeConverter
72
101
  if (!File.exists?(image_file))
73
102
  match
74
103
  else
75
- new_image_file= File.join(@images_folder, File.basename(image_file))
104
+ new_image_file= File.join(@images_output_folder, File.basename(image_file))
76
105
  FileUtils.mkdir_p(File.dirname(new_image_file))
77
106
  FileUtils.cp image_file, new_image_file
78
107
  "url(\"#{relative_path(new_image_file)}\")"
@@ -100,7 +129,7 @@ module DashcodeConverter
100
129
 
101
130
  content.css("[src]").each { |node|
102
131
  image_file= File.join(dirname, node.attribute('src'))
103
- new_image_file= File.join(@images_folder, File.basename(image_file))
132
+ new_image_file= File.join(@images_output_folder, File.basename(image_file))
104
133
  FileUtils.mkdir_p(File.dirname(new_image_file))
105
134
  FileUtils.cp image_file, new_image_file
106
135
  node["src"]= relative_path(new_image_file)
@@ -120,11 +149,46 @@ module DashcodeConverter
120
149
  def convert
121
150
  fixup_html
122
151
 
152
+ FileUtils.mkdir_p(@nib_output_folder)
123
153
  FileUtils.mkdir_p(@output_folder)
124
- FileUtils.mkdir_p(@images_folder)
125
-
154
+ FileUtils.mkdir_p(@images_output_folder)
155
+
126
156
  Dir.chdir(@output_folder) do
127
- File.open("#{@name.capitalize}Controller.js", "w") { |controller_file|
157
+ File.open("#{@name}.jsproj", "w") { |project_file|
158
+ project_file << ERB.new(PROJECT_TEMPLATE.remove_indent).result(binding)
159
+ }
160
+ end
161
+
162
+ Dir.chdir(File.join(@output_folder, "src")) do
163
+ File.open("index.html", "w") { |html|
164
+ html <<%{
165
+ <!DOCTYPE HTML>
166
+ <html>
167
+ <head>
168
+ <link rel="stylesheet" href="#{@name}.css" type="text/css" media="screen" charset="utf-8">
169
+ <script src="#{@name}.js" type="text/javascript" charset="utf-8"></script>
170
+ </head>
171
+
172
+ <body>
173
+ </body>
174
+ <script type="text/javascript" charset="utf-8">
175
+ distil.onready(function(){
176
+
177
+ var controller= new #{@name}.#{@controller_name}({
178
+ nibName: '#{@name}'
179
+ });
180
+ controller.view();
181
+
182
+ });
183
+
184
+ </script>
185
+ </html>
186
+ }.remove_indent
187
+ }
188
+ end
189
+
190
+ Dir.chdir(@nib_output_folder) do
191
+ File.open("#{@controller_name}.js", "w") { |controller_file|
128
192
  controller_file << controller.declaration
129
193
  }
130
194
  File.open("#{@name}.js", "w") { |nib_file|
@@ -137,6 +201,11 @@ module DashcodeConverter
137
201
  html_file << doc.css("body > *:first-child")[0].serialize
138
202
  }
139
203
  end
204
+
205
+ Dir.chdir(@output_folder) do
206
+ system 'distil'
207
+ end
208
+
140
209
  end
141
210
 
142
211
  end
@@ -0,0 +1,19 @@
1
+ module DashcodeConverter
2
+
3
+ class Scripts
4
+
5
+ def initialize(folder)
6
+ @context= V8::Context.new
7
+ @context.load(File.join(File.dirname(__FILE__), "env.js"))
8
+ Dir.glob(File.join(folder, "**", "*.js")) { |file|
9
+ @context.load(file)
10
+ }
11
+ end
12
+
13
+ def [](name)
14
+ @context[name]
15
+ end
16
+
17
+ end
18
+
19
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dashcode-converter
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 0
9
8
  - 1
10
- version: 0.0.1
9
+ - 0
10
+ version: 0.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jeff Watkins
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-10-12 00:00:00 -07:00
18
+ date: 2010-11-15 00:00:00 -08:00
19
19
  default_executable: dashcode-converter
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -51,6 +51,38 @@ dependencies:
51
51
  version: 1.4.3.1
52
52
  type: :runtime
53
53
  version_requirements: *id002
54
+ - !ruby/object:Gem::Dependency
55
+ name: therubyracer
56
+ prerelease: false
57
+ requirement: &id003 !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ hash: 9
63
+ segments:
64
+ - 0
65
+ - 7
66
+ - 5
67
+ version: 0.7.5
68
+ type: :runtime
69
+ version_requirements: *id003
70
+ - !ruby/object:Gem::Dependency
71
+ name: distil
72
+ prerelease: false
73
+ requirement: &id004 !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ hash: 41
79
+ segments:
80
+ - 0
81
+ - 13
82
+ - 1
83
+ version: 0.13.1
84
+ type: :runtime
85
+ version_requirements: *id004
54
86
  description: ""
55
87
  email: jeff@metrocat.org
56
88
  executables:
@@ -68,11 +100,13 @@ files:
68
100
  - dashcode-converter.tmproj
69
101
  - lib/dashcode-converter.rb
70
102
  - lib/dashcode-converter/controller.rb
103
+ - lib/dashcode-converter/env.js
71
104
  - lib/dashcode-converter/nib.rb
72
105
  - lib/dashcode-converter/nib/collection-view.rb
73
106
  - lib/dashcode-converter/nib/nib-item.rb
74
107
  - lib/dashcode-converter/nib/view.rb
75
108
  - lib/dashcode-converter/project.rb
109
+ - lib/dashcode-converter/scripts.rb
76
110
  has_rdoc: true
77
111
  homepage: http://github.com/jeffwatkins/dashcode-converter
78
112
  licenses: []