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.
- data/.gitignore +3 -1
- data/Rakefile +2 -0
- data/VERSION +1 -1
- data/bin/dashcode-converter +1 -0
- data/dashcode-converter.tmproj +130 -9
- data/lib/dashcode-converter.rb +6 -3
- data/lib/dashcode-converter/controller.rb +38 -4
- data/lib/dashcode-converter/env.js +13505 -0
- data/lib/dashcode-converter/nib.rb +27 -10
- data/lib/dashcode-converter/nib/collection-view.rb +18 -3
- data/lib/dashcode-converter/nib/nib-item.rb +16 -12
- data/lib/dashcode-converter/nib/view.rb +4 -4
- data/lib/dashcode-converter/project.rb +79 -10
- data/lib/dashcode-converter/scripts.rb +19 -0
- metadata +38 -4
@@ -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
|
-
|
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,
|
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=
|
46
|
-
datasources.each { |name,
|
47
|
-
|
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
|
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("
|
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,
|
9
|
+
def initialize(name, nib)
|
10
10
|
@name= name
|
11
11
|
@nib= nib
|
12
12
|
@view= nil
|
13
|
-
|
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_#{
|
33
|
-
self.send("fixup_html_for_#{
|
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
|
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
|
-
|
70
|
-
|
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
|
-
@
|
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,
|
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
|
33
|
+
def parse_spec(spec)
|
35
34
|
spec.each { |id, part_spec|
|
36
|
-
item= NibItem.new("##{id}",
|
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,
|
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
|
-
@
|
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, @
|
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(@
|
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(@
|
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(@
|
125
|
-
|
154
|
+
FileUtils.mkdir_p(@images_output_folder)
|
155
|
+
|
126
156
|
Dir.chdir(@output_folder) do
|
127
|
-
File.open("#{@name
|
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:
|
4
|
+
hash: 27
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
- 0
|
9
8
|
- 1
|
10
|
-
|
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-
|
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: []
|