rsence 2.2.0 → 2.2.1
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/VERSION +1 -1
- data/js/comm/queue/queue.js +17 -8
- data/js/comm/transporter/transporter.js +11 -10
- data/js/controls/button/themes/bright/button_parts1.png +0 -0
- data/js/controls/button/themes/default/button_parts1.png +0 -0
- data/js/controls/checkbox/themes/default/checkbox_parts1.png +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_bg.png +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_dim.png +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_parts1.png +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_parts2.png +0 -0
- data/js/controls/dialogs/sheet/themes/default/sheet_warning.png +0 -0
- data/js/controls/radiobutton/themes/default/radiobutton_parts1.png +0 -0
- data/js/controls/searchfield/themes/default/searchfield_parts1.png +0 -0
- data/js/controls/sliders/slider/themes/default/hslider_tracks.png +0 -0
- data/js/controls/sliders/slider/themes/default/slider_thumbs.png +0 -0
- data/js/controls/sliders/vslider/themes/default/vslider_tracks.png +0 -0
- data/js/controls/tab/tab.js +4 -3
- data/js/controls/tab/themes/bright/tab_bg_color.png +0 -0
- data/js/controls/tab/themes/bright/tab_border_pattern.png +0 -0
- data/js/controls/tab/themes/bright/tab_parts1.png +0 -0
- data/js/controls/tab/themes/default/tab_bg_color.png +0 -0
- data/js/controls/tab/themes/default/tab_border_pattern.png +0 -0
- data/js/controls/tab/themes/default/tab_parts1.png +0 -0
- data/js/controls/textcontrol/textcontrol.js +3 -1
- data/js/controls/textcontrol/themes/default/textcontrol_parts1.png +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts2.png +0 -0
- data/js/controls/textcontrol/themes/default/textcontrol_parts3.png +0 -0
- data/js/controls/validatorview/themes/default/validator.png +0 -0
- data/js/controls/window/themes/default/window.css +66 -54
- data/js/controls/window/themes/default/window.html +6 -2
- data/js/controls/window/themes/default/window_bg_active.png +0 -0
- data/js/controls/window/themes/default/window_bg_inactive.png +0 -0
- data/js/controls/window/themes/default/window_buttons.png +0 -0
- data/js/controls/window/themes/default/window_parts1.png +0 -0
- data/js/controls/window/themes/default/window_parts2.png +0 -0
- data/js/controls/window/window.js +167 -40
- data/js/core/class/class.js +3 -0
- data/js/core/elem/elem.coffee +36 -16
- data/js/datetime/calendar/calendar.coffee +24 -8
- data/js/datetime/calendar/themes/default/calendar.html +2 -2
- data/js/datetime/calendar/themes/default/calendar_arrows.png +0 -0
- data/js/datetime/calendar/themes/default/calendar_bg.png +0 -0
- data/js/datetime/calendar/themes/default/calendar_parts1.png +0 -0
- data/js/datetime/calendar/themes/default/calendar_parts2.png +0 -0
- data/js/datetime/timesheet_item/themes/default/timesheet_item_icons.png +0 -0
- data/js/datetime/timesheet_item/timesheet_item.js +1 -1
- data/js/foundation/geom/rect/rect.js +83 -47
- data/js/foundation/thememanager/thememanager.js +3 -0
- data/js/foundation/view/markupview/markupview.js +1 -1
- data/js/foundation/view/view.js +136 -37
- data/js/lists/propertylist/propertylist.js +33 -31
- data/js/menus/minimenu/minimenu.js +4 -2
- data/js/menus/minimenu/themes/default/minimenu.png +0 -0
- data/js/menus/minimenuitem/themes/default/minimenuitem_checkmark.png +0 -0
- data/js/menus/popupmenu/themes/default/popupmenu.png +0 -0
- data/js/util/reloadapp/themes/default/reloadapp_warning.png +0 -0
- data/lib/rsence/argv/startup_argv.rb +1 -1
- data/lib/rsence/default_config.rb +2 -2
- data/lib/rsence/plugins/plugin.rb +0 -1
- data/plugins/client_pkg/client_pkg.rb +7 -9
- data/plugins/client_pkg/lib/client_pkg_build.rb +214 -99
- data/plugins/main/main.rb +5 -1
- metadata +4 -4
@@ -69,7 +69,7 @@ HPropertyList = HControl.extend({
|
|
69
69
|
drawSubviews: function(){
|
70
70
|
|
71
71
|
var borderAndBg = ELEM.make(this.elemId);
|
72
|
-
ELEM.setCSS(borderAndBg,'position:absolute;left:0;top:0;right:0;bottom:0;background-color:#e6e6e6;border:1px solid #
|
72
|
+
ELEM.setCSS(borderAndBg,'position:absolute;left:0;top:0;right:0;bottom:0;background-color:#e6e6e6;border:1px solid #999999;');
|
73
73
|
|
74
74
|
this.markupElemIds = {
|
75
75
|
bg: borderAndBg
|
@@ -131,7 +131,9 @@ HPropertyList = HControl.extend({
|
|
131
131
|
this.keyColumn = HView.nu(
|
132
132
|
[ 0, 0, this.keyColumnRight(), 24 ],
|
133
133
|
this.contentView, {
|
134
|
-
style:
|
134
|
+
style: {
|
135
|
+
borderRight: '1px solid #999'
|
136
|
+
}
|
135
137
|
}
|
136
138
|
);
|
137
139
|
|
@@ -140,7 +142,9 @@ HPropertyList = HControl.extend({
|
|
140
142
|
this.typeColumn = HView.nu(
|
141
143
|
[ this.typeColumnLeft(), 0, 60, 24 ],
|
142
144
|
this.contentView, {
|
143
|
-
style:
|
145
|
+
style: {
|
146
|
+
borderRight: '1px solid #999'
|
147
|
+
}
|
144
148
|
}
|
145
149
|
);
|
146
150
|
}
|
@@ -160,13 +164,13 @@ HPropertyList = HControl.extend({
|
|
160
164
|
[ 0, 0, this.parent.keyColumnRight(), 24 ],
|
161
165
|
this, {
|
162
166
|
html: '<b>Key</b>',
|
163
|
-
style:
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
167
|
+
style: {
|
168
|
+
verticalAlign: 'middle',
|
169
|
+
textIndent: '16px',
|
170
|
+
lineHeight: '24px',
|
171
|
+
fontSize: '13px',
|
172
|
+
borderRight: '3px double #999999'
|
173
|
+
}
|
170
174
|
}
|
171
175
|
);
|
172
176
|
if(!this.parent.options.hideTypeColumn){
|
@@ -174,14 +178,14 @@ HPropertyList = HControl.extend({
|
|
174
178
|
[ this.parent.typeColumnLeft(), 0, 60, 24 ],
|
175
179
|
this, {
|
176
180
|
html: '<b>Type</b>',
|
177
|
-
style:
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
181
|
+
style: {
|
182
|
+
verticalAlign: 'middle',
|
183
|
+
textIndent: '8px',
|
184
|
+
lineHeight: '24px',
|
185
|
+
fontSize: '13px',
|
186
|
+
paddingRight: '1px',
|
187
|
+
borderRight: '1px solid #999999'
|
188
|
+
}
|
185
189
|
}
|
186
190
|
);
|
187
191
|
}
|
@@ -189,19 +193,19 @@ HPropertyList = HControl.extend({
|
|
189
193
|
[ this.parent.valueColumnLeft(), 0, 80, 24, 0, null ],
|
190
194
|
this, {
|
191
195
|
html: '<b>Value</b>',
|
192
|
-
style:
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
196
|
+
style: {
|
197
|
+
verticalAlign: 'middle',
|
198
|
+
textIndent: '8px',
|
199
|
+
lineHeight: '24px',
|
200
|
+
fontSize: '13px'
|
201
|
+
}
|
198
202
|
}
|
199
203
|
);
|
200
204
|
}
|
201
205
|
}).nu(
|
202
206
|
[ 0, 0, null, 24, 0, null ],
|
203
207
|
this, {
|
204
|
-
style:
|
208
|
+
style: { borderBottom: '1px solid #999' }
|
205
209
|
}
|
206
210
|
);
|
207
211
|
|
@@ -231,8 +235,8 @@ HPropertyList = HControl.extend({
|
|
231
235
|
keyColumn = parent.keyColumn,
|
232
236
|
keyLabel = parent.header.keyLabel,
|
233
237
|
keyRight = parent.keyColumnRight();
|
234
|
-
keyColumn.rect.setRight( keyRight );
|
235
|
-
keyLabel.rect.setRight( keyRight );
|
238
|
+
keyColumn.rect.setRight( keyRight );
|
239
|
+
keyLabel.rect.setRight( keyRight );
|
236
240
|
|
237
241
|
var
|
238
242
|
valueColumn = parent.valueColumn,
|
@@ -275,9 +279,7 @@ HPropertyList = HControl.extend({
|
|
275
279
|
[ this.keyColumnRight(), 0, 5, 25 ],
|
276
280
|
this, {
|
277
281
|
events: { draggable: true },
|
278
|
-
style:
|
279
|
-
[ 'cursor', 'ew-resize' ]
|
280
|
-
]
|
282
|
+
style: { cursor: 'ew-resize' }
|
281
283
|
}
|
282
284
|
);
|
283
285
|
|
@@ -452,7 +454,7 @@ HPropertyList = HControl.extend({
|
|
452
454
|
},
|
453
455
|
|
454
456
|
// Row separator style
|
455
|
-
rowSeparatorStyle: "position:absolute;left:1px;right:1px;font-size:0px;height:1px;overflow:hidden;border-bottom:1px solid #
|
457
|
+
rowSeparatorStyle: "position:absolute;left:1px;right:1px;font-size:0px;height:1px;overflow:hidden;border-bottom:1px solid #999999;",
|
456
458
|
|
457
459
|
// Adds row separator
|
458
460
|
addRowSeparator: function( token, i, even ){
|
@@ -82,8 +82,10 @@ HMiniMenu = HRadioButtonList.extend({
|
|
82
82
|
},
|
83
83
|
|
84
84
|
menuHide: function(){
|
85
|
-
this.menuItemView
|
86
|
-
|
85
|
+
if( this.menuItemView ){
|
86
|
+
this.menuItemView.sendToBack();
|
87
|
+
this.menuItemView.hide();
|
88
|
+
}
|
87
89
|
},
|
88
90
|
|
89
91
|
startDrag: function(x,y){
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -69,7 +69,7 @@ module ArgvUtil
|
|
69
69
|
elsif arg == '--disable-obfuscation'
|
70
70
|
@args[:client_pkg_no_obfuscation] = true
|
71
71
|
elsif arg == '--disable-jsmin'
|
72
|
-
@args[:
|
72
|
+
@args[:client_pkg_no_whitespace_removal] = true
|
73
73
|
elsif arg == '--build-report'
|
74
74
|
@args[:suppress_build_messages] = false
|
75
75
|
else
|
@@ -144,8 +144,8 @@ module RSence
|
|
144
144
|
config[:session_conf][:reset_sessions] = true if args[:reset_ses]
|
145
145
|
config[:daemon][:http_delayed_start] = args[:http_delayed_start] if args[:http_delayed_start] != nil
|
146
146
|
|
147
|
-
config[:client_pkg][:no_obfuscation] =
|
148
|
-
config[:client_pkg][:no_whitespace_removal] =
|
147
|
+
config[:client_pkg][:no_obfuscation] = args[:client_pkg_no_obfuscation]
|
148
|
+
config[:client_pkg][:no_whitespace_removal] = args[:client_pkg_no_whitespace_removal]
|
149
149
|
|
150
150
|
# Sets the default pid and log paths used by the HTTPDaemon
|
151
151
|
if config[:daemon].has_key?(:pid_fn)
|
@@ -55,17 +55,15 @@ class ClientPkgPlugin < Servlet
|
|
55
55
|
end
|
56
56
|
|
57
57
|
def rebuild_client
|
58
|
-
while @build_busy
|
59
|
-
puts "-- build busy, sleeping.. --"
|
60
|
-
sleep 0.1
|
61
|
-
end
|
62
58
|
@build_busy = true
|
63
|
-
|
59
|
+
next_change=Time.now.to_f
|
64
60
|
@client_build.setup_dirs
|
65
|
-
@client_build.run
|
66
|
-
|
67
|
-
|
61
|
+
@client_build.run( next_change )
|
62
|
+
client_cache = ClientPkgCache.new
|
63
|
+
client_cache.set_cache( @client_build.js, @client_build.gz, @client_build.themes )
|
64
|
+
@client_cache = client_cache
|
68
65
|
RSence.plugin_manager.incr! if RSence.config[:transporter_conf][:client_autoreload]
|
66
|
+
@last_change = next_change
|
69
67
|
@build_busy = false
|
70
68
|
end
|
71
69
|
|
@@ -79,7 +77,7 @@ class ClientPkgPlugin < Servlet
|
|
79
77
|
Thread.pass
|
80
78
|
while true
|
81
79
|
begin
|
82
|
-
if @client_build.bundle_changes( @last_change )
|
80
|
+
if not @build_busy and @client_build.bundle_changes( @last_change )
|
83
81
|
rebuild_client
|
84
82
|
puts "Autobuilt."
|
85
83
|
if RSence.args[:say]
|
@@ -7,7 +7,7 @@
|
|
7
7
|
##
|
8
8
|
|
9
9
|
|
10
|
-
require '
|
10
|
+
require 'jsmin_c'
|
11
11
|
require 'jscompress'
|
12
12
|
require 'html_min'
|
13
13
|
begin
|
@@ -69,65 +69,110 @@ class ClientPkgBuild
|
|
69
69
|
return [html_data, gz_html]
|
70
70
|
end
|
71
71
|
|
72
|
-
def read_gfx( src_path_theme,
|
72
|
+
def read_gfx( src_path_theme, theme_newest )
|
73
73
|
gfx_size = 0
|
74
|
+
gfx_data = {}
|
74
75
|
src_files_gfx_path = File.join( src_path_theme, 'gfx' )
|
75
76
|
[ src_path_theme, src_files_gfx_path ].each do |src_files_gfx|
|
76
77
|
if File.exist?( src_files_gfx )
|
77
78
|
Dir.entries( src_files_gfx ).each do |src_gfx_filename|
|
78
79
|
src_file_gfx = File.join( src_files_gfx, src_gfx_filename )
|
79
80
|
if @gfx_formats.include?( src_file_gfx[-4..-1] )
|
80
|
-
|
81
|
-
|
81
|
+
fstat = File.stat( src_file_gfx )
|
82
|
+
theme_newest = fstat.mtime.to_f if fstat.mtime.to_f > theme_newest
|
83
|
+
gfx_size += fstat.size
|
84
|
+
gfx_data[src_gfx_filename] = read_file( src_file_gfx )
|
82
85
|
end
|
83
86
|
end
|
84
87
|
end
|
85
88
|
end
|
86
|
-
return gfx_size
|
89
|
+
return [ gfx_size, gfx_data, theme_newest ]
|
87
90
|
end
|
88
91
|
|
89
92
|
# processes theme-related files
|
90
93
|
def read_theme( bundle_dir, bundle_name )
|
94
|
+
time_start = Time.now.to_f
|
91
95
|
@theme_names.each do |theme_name|
|
92
|
-
@theme_sizes[ theme_name ] = {
|
93
|
-
:css => [0,0],
|
94
|
-
:html => [0,0],
|
95
|
-
:gfx => 0
|
96
|
-
} unless @theme_sizes.has_key?( theme_name )
|
97
|
-
tgt_hash_theme = @themes[theme_name]
|
98
96
|
src_path_theme = File.join( bundle_dir, 'themes', theme_name )
|
99
|
-
[
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
( css_data, gz_css ) = read_css( src_file_css )
|
104
|
-
tgt_hash_css = tgt_hash_theme[:css][bundle_name] = {
|
105
|
-
:data => css_data,
|
106
|
-
:gzip => gz_css
|
107
|
-
}
|
108
|
-
@theme_sizes[ theme_name ][:css][0] += File.stat( src_file_css ).size
|
109
|
-
@theme_sizes[ theme_name ][:css][1] += css_data.bytesize
|
110
|
-
@css_by_theme[ theme_name ][ bundle_name ] = css_data
|
111
|
-
end
|
97
|
+
if @src_cache[:theme_timestamp].has_key?(src_path_theme)
|
98
|
+
theme_newest = @src_cache[:theme_timestamp][src_path_theme]
|
99
|
+
else
|
100
|
+
theme_newest = 0
|
112
101
|
end
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
102
|
+
if theme_newest == 0 or find_newer( src_path_theme, theme_newest )
|
103
|
+
theme_css = { :data => '' }
|
104
|
+
theme_html = { :data => '' }
|
105
|
+
theme_size = {
|
106
|
+
:css => [0,0],
|
107
|
+
:html => [0,0],
|
108
|
+
:gfx => 0
|
109
|
+
}
|
110
|
+
[ File.join( src_path_theme, bundle_name+'.css' ),
|
111
|
+
File.join( src_path_theme, 'css', bundle_name+'.css' )
|
112
|
+
].each do |src_file_css|
|
113
|
+
if File.exist?( src_file_css )
|
114
|
+
fstat = File.stat( src_file_css )
|
115
|
+
theme_newest = fstat.mtime.to_f if fstat.mtime.to_f > theme_newest
|
116
|
+
( css_data, gz_css ) = read_css( src_file_css )
|
117
|
+
theme_css = { :data => css_data, :gzip => gz_css }
|
118
|
+
theme_size[:css][0] += fstat.size
|
119
|
+
theme_size[:css][1] += css_data.bytesize
|
120
|
+
break
|
121
|
+
end
|
122
|
+
end
|
123
|
+
[ File.join( src_path_theme, bundle_name+'.html' ),
|
124
|
+
File.join( src_path_theme, 'html', bundle_name+'.html' )
|
125
|
+
].each do |src_file_html|
|
126
|
+
if File.exist?( src_file_html )
|
127
|
+
fstat = File.stat( src_file_html )
|
128
|
+
theme_newest = fstat.mtime.to_f if fstat.mtime.to_f > theme_newest
|
129
|
+
( html_data, gz_html ) = read_html( src_file_html )
|
130
|
+
theme_html = { :data => html_data, :gzip => gz_html }
|
131
|
+
theme_size[:html][0] += fstat.size
|
132
|
+
theme_size[:html][1] += html_data.bytesize
|
133
|
+
break
|
134
|
+
end
|
125
135
|
end
|
136
|
+
( gfx_size, theme_gfx, theme_newest ) = read_gfx( src_path_theme, theme_newest )
|
137
|
+
theme_size[:gfx] += gfx_size
|
138
|
+
@src_cache[:theme_timestamp][src_path_theme] = theme_newest
|
139
|
+
@src_cache[:theme_data][src_path_theme] = {} unless @src_cache[:theme_data].has_key?(src_path_theme)
|
140
|
+
@src_cache[:theme_data][src_path_theme][:size] = theme_size
|
141
|
+
@src_cache[:theme_data][src_path_theme][:data] = {
|
142
|
+
:css => theme_css,
|
143
|
+
:html => theme_html,
|
144
|
+
:gfx => theme_gfx
|
145
|
+
}
|
146
|
+
else
|
147
|
+
theme_size = @src_cache[:theme_data][src_path_theme][:size]
|
148
|
+
tc = @src_cache[:theme_data][src_path_theme][:data]
|
149
|
+
theme_css = tc[:css]
|
150
|
+
theme_html = tc[:html]
|
151
|
+
theme_gfx = tc[:gfx]
|
152
|
+
end
|
153
|
+
@html_by_theme[theme_name][bundle_name] = theme_html[:data]
|
154
|
+
@css_by_theme[theme_name][bundle_name] = theme_css[:data]
|
155
|
+
th = @themes[theme_name]
|
156
|
+
th[:css][bundle_name] = theme_css
|
157
|
+
th[:html][bundle_name] = theme_html
|
158
|
+
th[:gfx].merge!(theme_gfx)
|
159
|
+
unless @theme_sizes.has_key?( theme_name )
|
160
|
+
@theme_sizes[ theme_name ] = {
|
161
|
+
:css => [0,0],
|
162
|
+
:html => [0,0],
|
163
|
+
:gfx => 0
|
164
|
+
}
|
126
165
|
end
|
127
|
-
|
128
|
-
|
129
|
-
|
166
|
+
ts = @theme_sizes[theme_name]
|
167
|
+
ts[:css][0] += theme_size[:css][0]
|
168
|
+
ts[:css][1] += theme_size[:css][1]
|
169
|
+
ts[:html][0] += theme_size[:html][0]
|
170
|
+
ts[:html][1] += theme_size[:html][1]
|
171
|
+
ts[:gfx] += theme_size[:gfx]
|
172
|
+
|
130
173
|
end
|
174
|
+
|
175
|
+
@theme_time += (Time.now.to_f - time_start)
|
131
176
|
end
|
132
177
|
|
133
178
|
def add_bundle( bundle_name, bundle_path, entries, has_js=false, has_coffee=false )
|
@@ -144,45 +189,74 @@ class ClientPkgBuild
|
|
144
189
|
return true
|
145
190
|
end
|
146
191
|
if has_coffee and @coffee_supported
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
192
|
+
src_path = File.join( bundle_path, bundle_name+'.coffee' )
|
193
|
+
is_coffee = true
|
194
|
+
elsif not has_js
|
195
|
+
src_path = false
|
196
|
+
else
|
197
|
+
src_path = File.join( bundle_path, bundle_name+'.js' )
|
198
|
+
is_coffee = false
|
199
|
+
end
|
200
|
+
if src_path
|
201
|
+
src_timestamp = File.stat( src_path ).mtime.to_i
|
202
|
+
src_cache_compiled = @src_cache[:path_compiled].has_key?( src_path )
|
203
|
+
src_cache_timestamp = @src_cache[:path_timestamp].has_key?( src_path )
|
204
|
+
src_cache_entry = src_cache_compiled and src_cache_timestamp
|
205
|
+
src_cached = ( src_cache_entry and ( @src_cache[:path_timestamp][src_path] == src_timestamp ) )
|
206
|
+
if src_cached
|
207
|
+
js_data = @src_cache[:path_compiled][src_path]
|
208
|
+
js_size = @src_cache[:orig_size][src_path]
|
209
|
+
min_size = js_data.bytesize
|
210
|
+
else
|
211
|
+
process_start = Time.new.to_f
|
212
|
+
if is_coffee
|
213
|
+
begin
|
214
|
+
coffee_src = read_file( src_path )
|
215
|
+
js_data = CoffeeScript.compile( coffee_src, :bare => true )
|
216
|
+
rescue CoffeeScript::CompilationError
|
217
|
+
if has_js
|
218
|
+
js_data = %{console.log( "WARNING: CoffeeScript complilation failed for source file #{src_path.to_json}, using the js variant instead." );}
|
219
|
+
js_data += read_file( File.join( bundle_path, bundle_name+'.js' ) )
|
220
|
+
else
|
221
|
+
js_data = %{console.log( "WARNING: CoffeeScript complilation failed for source file #{src_path.to_json}" );}
|
222
|
+
end
|
223
|
+
end
|
157
224
|
else
|
158
|
-
|
159
|
-
js_data = CoffeeScript.compile( coffee_src, :bare => true )
|
160
|
-
@coffee_cache[:path_timestamp][coffee_path] = coffee_timestamp
|
161
|
-
@coffee_cache[:path_compiled][coffee_path] = js_data
|
225
|
+
js_data = read_file( src_path )
|
162
226
|
end
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
js_data = %{console.log( "WARNING: CoffeeScript complilation failed for source file #{coffee_path}, using the js variant instead." );}
|
167
|
-
js_data += read_file( File.join( bundle_path, bundle_name+'.js' ) )
|
227
|
+
js_size = js_data.bytesize
|
228
|
+
if @debug
|
229
|
+
min_size = js_size
|
168
230
|
else
|
169
|
-
js_data =
|
231
|
+
js_data = @jsmin.minimize( js_data ) unless @no_whitespace_removal
|
232
|
+
min_size = js_data.bytesize
|
170
233
|
end
|
234
|
+
if is_coffee
|
235
|
+
@coffee_time += ( Time.new.to_f - process_start )
|
236
|
+
else
|
237
|
+
@js_time += ( Time.new.to_f - process_start )
|
238
|
+
end
|
239
|
+
@src_cache[:path_timestamp][src_path] = src_timestamp
|
240
|
+
@src_cache[:path_compiled][src_path] = js_data
|
241
|
+
@src_cache[:orig_size][src_path] = js_size
|
171
242
|
end
|
172
|
-
elsif not has_js
|
173
|
-
js_data = %{console.log( "ERROR: CoffeeScript not suuported and no JS source available for #{bundle_path}" );}
|
174
243
|
else
|
175
|
-
js_data =
|
244
|
+
js_data = %{console.log( "ERROR: CoffeeScript not suuported and no JS source available for #{bundle_path}" );}
|
245
|
+
js_size = js_data.bytesize
|
246
|
+
min_size = js_size
|
247
|
+
src_timestamp = 0
|
176
248
|
end
|
177
249
|
@bundles_found[ bundle_name ] = {
|
178
250
|
:path => bundle_path,
|
179
251
|
:js_data => js_data,
|
180
|
-
:js_size =>
|
181
|
-
:
|
252
|
+
:js_size => min_size,
|
253
|
+
:orig_size => js_size,
|
254
|
+
:has_themes => has_themes,
|
255
|
+
:src_timestamp => src_timestamp
|
182
256
|
}
|
183
|
-
|
184
|
-
|
185
|
-
|
257
|
+
|
258
|
+
read_theme( bundle_path, bundle_name ) if has_themes
|
259
|
+
|
186
260
|
return true
|
187
261
|
end
|
188
262
|
|
@@ -229,9 +303,10 @@ class ClientPkgBuild
|
|
229
303
|
@logger.log( '' )
|
230
304
|
@logger.log( "Client package build report.......................#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}" )
|
231
305
|
@logger.log( '' )
|
232
|
-
@logger.log( "JS Package....................:
|
306
|
+
@logger.log( "JS Package....................: Source | Minimized | GNUZipped" )
|
233
307
|
@logger.log( " : | |" )
|
234
308
|
end
|
309
|
+
@package_origsizes = {}
|
235
310
|
@destination_files.each_key do | package_name |
|
236
311
|
jsc_data = process_js( @destination_files[package_name] )
|
237
312
|
@js[package_name] = jsc_data
|
@@ -240,7 +315,8 @@ class ClientPkgBuild
|
|
240
315
|
@gz[package_name] = gz_data
|
241
316
|
end
|
242
317
|
unless @quiet
|
243
|
-
js_size = @destination_files[ package_name ].bytesize
|
318
|
+
js_size = @destination_origsize[package_name] #@destination_files[ package_name ].bytesize
|
319
|
+
@package_origsizes[package_name] = js_size
|
244
320
|
jsc_size = jsc_data.bytesize
|
245
321
|
if @no_gzip
|
246
322
|
gz_size = -1
|
@@ -255,17 +331,22 @@ class ClientPkgBuild
|
|
255
331
|
def squeeze( js, is_coffee=false )
|
256
332
|
unless @no_whitespace_removal
|
257
333
|
begin
|
258
|
-
|
259
|
-
js = JSMinC.minify( js )
|
334
|
+
js = @jsmin.minimize( js ).strip
|
335
|
+
# js = JSMinC.minify( js )
|
260
336
|
rescue IndexError => e
|
261
337
|
warn "js can't get smaller using js; just ignoring jsmin"
|
262
338
|
end
|
263
339
|
end
|
264
340
|
unless @no_obfuscation
|
265
|
-
|
266
|
-
|
341
|
+
begin
|
342
|
+
## Not creating new indexes on the fly, to save some speed
|
343
|
+
# @jscompress.build_indexes( js )
|
344
|
+
js = @jscompress.compress( js )
|
345
|
+
rescue
|
346
|
+
warn "jscompress failed squeeze; just ignoring jscompress"
|
347
|
+
end
|
267
348
|
end
|
268
|
-
return js
|
349
|
+
return js
|
269
350
|
end
|
270
351
|
|
271
352
|
def coffee( src )
|
@@ -290,17 +371,16 @@ class ClientPkgBuild
|
|
290
371
|
return src_in
|
291
372
|
else
|
292
373
|
src_out = src_in
|
293
|
-
# src_out = @jsmin.minimize( src_out ) unless @no_whitespace_removal
|
294
|
-
src_out = JSMinC.minify( src_out ) unless @no_whitespace_removal
|
295
374
|
src_out = pre_convert( src_out ) unless @no_obfuscation
|
296
|
-
return src_out
|
375
|
+
return src_out
|
297
376
|
end
|
298
377
|
end
|
299
378
|
|
300
379
|
def build_themes
|
380
|
+
time_start = Time.now.to_f
|
301
381
|
unless @quiet
|
302
382
|
@logger.log( '' )
|
303
|
-
@logger.log( "Theme name and part...........:
|
383
|
+
@logger.log( "Theme name and part...........: Source | Minimized | GNUZipped" )
|
304
384
|
@logger.log( " : | |" )
|
305
385
|
end
|
306
386
|
# compile "all-in-one" css and html resources
|
@@ -309,6 +389,7 @@ class ClientPkgBuild
|
|
309
389
|
css_templates = @css_by_theme[ theme_name ]
|
310
390
|
theme_css_template_data = css_templates.values.join("\n")
|
311
391
|
theme_html_js_arr = []
|
392
|
+
theme_html_js_arr.push "(function(){"
|
312
393
|
theme_html_js_arr.push "HThemeManager._tmplCache[#{theme_name.to_json}]=#{html_templates.to_json}; "
|
313
394
|
theme_html_js_arr.push "HNoComponentCSS.push(#{theme_name.to_json});"
|
314
395
|
theme_html_js_arr.push "HNoCommonCSS.push(#{theme_name.to_json});"
|
@@ -319,7 +400,10 @@ class ClientPkgBuild
|
|
319
400
|
_this.useCSS(#{theme_css_template_data.to_json});
|
320
401
|
} );
|
321
402
|
}
|
322
|
-
|
403
|
+
theme_html_js_arr.push "})();"
|
404
|
+
theme_html_js = theme_html_js_arr.join("\n")
|
405
|
+
@package_origsizes[theme_name+'_theme'] = theme_html_js.bytesize
|
406
|
+
theme_html_js = process_js( theme_html_js )
|
323
407
|
@js[theme_name+'_theme'] = theme_html_js
|
324
408
|
unless @no_gzip
|
325
409
|
theme_html_gz = gzip_string( @js[theme_name+'_theme'] )
|
@@ -338,47 +422,48 @@ class ClientPkgBuild
|
|
338
422
|
end
|
339
423
|
unless @quiet
|
340
424
|
print_stat( "#{theme_name}/css", @theme_sizes[theme_name][:css][0], @theme_sizes[theme_name][:css][1], theme_css_template_data_gz.bytesize )
|
341
|
-
print_stat( "#{theme_name}/gfx", @theme_sizes[theme_name][:gfx],
|
425
|
+
print_stat( "#{theme_name}/gfx", @theme_sizes[theme_name][:gfx], @theme_sizes[theme_name][:gfx], @theme_sizes[theme_name][:gfx] )
|
342
426
|
@logger.log( '' )
|
343
427
|
end
|
344
428
|
end
|
429
|
+
@theme_time += (Time.now.to_f - time_start)
|
345
430
|
end
|
346
431
|
|
347
432
|
def build_compound_packages
|
433
|
+
time_start = Time.now.to_f
|
348
434
|
unless @quiet
|
349
435
|
@logger.log( '' )
|
350
|
-
@logger.log( "Compound package..............:
|
436
|
+
@logger.log( "Compound package..............: Source | Minimized | GNUZipped" )
|
351
437
|
@logger.log( " : | |" )
|
352
438
|
end
|
353
439
|
@compound_config.each do |pkg_name, js_order|
|
440
|
+
js_size = 0
|
354
441
|
pkg_parts = []
|
355
442
|
js_order.each do |js_pkg|
|
356
443
|
pkg_part = @js[ js_pkg ]
|
357
444
|
pkg_parts.push( pkg_part )
|
445
|
+
js_size += ( @package_origsizes[ js_pkg ] or @destination_origsize[ js_pkg ] )
|
358
446
|
end
|
359
|
-
js_src = pkg_parts.join(
|
447
|
+
js_src = pkg_parts.join("\n")
|
360
448
|
@js[ pkg_name ] = js_src
|
361
449
|
unless @no_gzip
|
362
450
|
gz_data = gzip_string( js_src )
|
363
451
|
@gz[ pkg_name ] = gz_data
|
364
452
|
end
|
365
453
|
unless @quiet
|
366
|
-
|
454
|
+
jsc_size = js_src.bytesize
|
367
455
|
if @no_gzip
|
368
456
|
gz_size = -1
|
369
457
|
else
|
370
458
|
gz_size = gz_data.bytesize
|
371
459
|
end
|
372
|
-
print_stat( pkg_name, js_size,
|
460
|
+
print_stat( pkg_name, js_size, jsc_size, gz_size )
|
373
461
|
end
|
374
462
|
end
|
463
|
+
@js_time += (Time.now.to_f - time_start)
|
375
464
|
end
|
376
465
|
|
377
|
-
def
|
378
|
-
|
379
|
-
time_start = Time.now.to_f*10000
|
380
|
-
@coffee_time = 0
|
381
|
-
|
466
|
+
def reset_structures
|
382
467
|
# hash of bundles per bundle name per theme; @html_by_theme[theme_name][bundle_name] = bundle_data
|
383
468
|
@html_by_theme = {}
|
384
469
|
@css_by_theme = {}
|
@@ -397,33 +482,60 @@ class ClientPkgBuild
|
|
397
482
|
end
|
398
483
|
@bundles_found = {} # populated by add_bundle
|
399
484
|
@conversion_stats = {} # populated by add_hints
|
485
|
+
end
|
486
|
+
|
487
|
+
def traverse_bundles
|
400
488
|
src_dirs = @src_dirs.clone
|
401
489
|
src_dirs.each do | src_dir |
|
402
490
|
find_bundles( src_dir )
|
403
491
|
end
|
492
|
+
end
|
493
|
+
|
494
|
+
def compose_destinations
|
404
495
|
@destination_files = {} # rename to package_products
|
496
|
+
@destination_origsize = {}
|
405
497
|
@package_names.each do |package_name|
|
406
498
|
@packages[package_name].each do |bundle_name|
|
407
499
|
if @bundles_found.has_key?( bundle_name )
|
408
500
|
@destination_files[ package_name ] = [] unless @destination_files.has_key?( package_name )
|
409
501
|
@destination_files[ package_name ].push( @bundles_found[bundle_name][:js_data] )
|
502
|
+
@destination_origsize[ package_name ] = 0 unless @destination_origsize.has_key?( package_name )
|
503
|
+
@destination_origsize[ package_name ] += @bundles_found[bundle_name][:orig_size]
|
410
504
|
end
|
411
505
|
end
|
412
506
|
end
|
413
507
|
@destination_files.each do | package_name, package_array |
|
414
|
-
package_data = package_array.join(
|
508
|
+
package_data = package_array.join("\n")
|
415
509
|
@destination_files[ package_name ] = package_data
|
416
510
|
end
|
511
|
+
end
|
512
|
+
|
513
|
+
def run( last_change=0 )
|
514
|
+
|
515
|
+
time_start = Time.now.to_f*10000
|
516
|
+
@coffee_time = 0
|
517
|
+
@js_time = 0
|
518
|
+
@theme_time = 0
|
519
|
+
@last_change = last_change
|
520
|
+
|
521
|
+
reset_structures
|
417
522
|
|
523
|
+
traverse_bundles
|
524
|
+
|
525
|
+
compose_destinations
|
526
|
+
|
418
527
|
build_indexes
|
419
|
-
|
528
|
+
|
420
529
|
minimize_data
|
530
|
+
build_themes
|
421
531
|
build_compound_packages
|
422
532
|
|
423
533
|
ms_taken = ((Time.now.to_f*10000)-time_start).round/10.0
|
534
|
+
js_taken = (@js_time*10000).round/10.0
|
424
535
|
coffee_taken = (@coffee_time*10000).round/10.0
|
425
|
-
|
426
|
-
|
536
|
+
themes_taken = (@theme_time*10000).round/10.0
|
537
|
+
other_taken = ((ms_taken - coffee_taken - js_taken - themes_taken)*10).round/10.0
|
538
|
+
@logger.log( "\nTime taken:\n js: #{js_taken}ms\n coffee: #{coffee_taken}ms\n themes: #{themes_taken}ms\n other: #{other_taken}ms\n total: #{ms_taken}ms\n\n" )
|
427
539
|
|
428
540
|
end
|
429
541
|
|
@@ -544,9 +656,12 @@ class ClientPkgBuild
|
|
544
656
|
def initialize( config, logger )
|
545
657
|
|
546
658
|
@coffee_supported = config[:coffee_supported]
|
547
|
-
@
|
659
|
+
@src_cache = {
|
548
660
|
:path_timestamp => {},
|
549
|
-
:path_compiled => {}
|
661
|
+
:path_compiled => {},
|
662
|
+
:orig_size => {},
|
663
|
+
:theme_timestamp => {},
|
664
|
+
:theme_data => {}
|
550
665
|
}
|
551
666
|
|
552
667
|
@logger = logger
|
@@ -580,7 +695,7 @@ class ClientPkgBuild
|
|
580
695
|
@html_min = HTMLMin.new
|
581
696
|
|
582
697
|
# JSMin removes js white-space (makes the source shorter)
|
583
|
-
|
698
|
+
@jsmin = JSMin.new
|
584
699
|
|
585
700
|
# makes sure the specified dirs are ok
|
586
701
|
return if not setup_dirs
|
@@ -607,7 +722,7 @@ class ClientPkgBuild
|
|
607
722
|
@compound_config = config[:compound_packages]
|
608
723
|
end
|
609
724
|
|
610
|
-
def find_newer( src_dir, newer_than )
|
725
|
+
def find_newer( src_dir, newer_than, quiet=false )
|
611
726
|
if File.exist?( src_dir ) and File.directory?( src_dir )
|
612
727
|
Dir.entries( src_dir ).each do | dir_entry |
|
613
728
|
next if dir_entry[0].chr == '.'
|
@@ -616,7 +731,7 @@ class ClientPkgBuild
|
|
616
731
|
return true if find_newer( sub_dir, newer_than )
|
617
732
|
else
|
618
733
|
if newer_than < File.stat( sub_dir ).mtime.to_i
|
619
|
-
@logger.log( "File changed: #{sub_dir}" )
|
734
|
+
@logger.log( "File changed: #{sub_dir}" ) unless quiet
|
620
735
|
return true
|
621
736
|
end
|
622
737
|
end
|
@@ -635,7 +750,7 @@ class ClientPkgBuild
|
|
635
750
|
end
|
636
751
|
|
637
752
|
def print_stat( package_name, dst_size, jsc_size, gz_size )
|
638
|
-
percent = 'n/a'
|
753
|
+
# percent = 'n/a'
|
639
754
|
if dst_size > 0
|
640
755
|
percent1 = (100*(jsc_size/dst_size.to_f)).to_i.to_s + '%'
|
641
756
|
percent2 = (100*(gz_size/dst_size.to_f)).to_i.to_s + '%'
|