dashcode-converter 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []