flexlayout-rails 0.1.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.
@@ -0,0 +1,339 @@
1
+ /*!
2
+ * CSS Template Layout
3
+ * Copyright (c) 2011-2012 Pablo Escalada
4
+ *
5
+ * Contributor(s):
6
+ * César Acebal
7
+ *
8
+ * MIT Licensed
9
+ */
10
+ (function (global) {
11
+ var log = wef.logger("templateLayout"),
12
+ templateLayout,
13
+ buffer = {},
14
+ tom,
15
+ parser;
16
+
17
+ /**
18
+ * Create the prototype main class
19
+ *
20
+ * @param {string|strings[]}[templateSource] template source.
21
+ * Supports 0..* strings containing valid CSS text or URL.
22
+ * </p>
23
+ * Empty constructor searches parent HTML file for STYLE tags and uses its
24
+ * CSS content as template source.
25
+ * </p>
26
+ * String params are analyzed and loaded in this way:
27
+ * <ul>
28
+ * <li>"htttp[s]://..." entries are loaded as files and content extracted</li>
29
+ * <li>"file://..." entries are loaded as files and content extracted</li>
30
+ * <li>Unmatched entries are loaded as CSS text</li>
31
+ * </ul>
32
+ * Multiple strings are first analyzed and then concatenated
33
+ *
34
+ * @class TemplateLayout is a CSS Template Layout prototype that implements
35
+ * some basic features defined in W3C working draft "Template Layout Module".
36
+ * Features:
37
+ * <ul>
38
+ * <li>basic template definition: letters, . (dot) and @</li>
39
+ * <li>column width in pixels and %</li>
40
+ * <li>row height imn pixels and %</li>
41
+ * </ul>
42
+ */
43
+ templateLayout = function (templateSource) {
44
+ log.info("create templateLayout...");
45
+ return new templateLayout.prototype.init(arguments);
46
+ };
47
+
48
+
49
+ templateLayout.prototype = {
50
+ constructor:templateLayout,
51
+ /**
52
+ * Version number
53
+ */
54
+ version:"1.0.0",
55
+ /**
56
+ * Template sources store
57
+ */
58
+ templateSources:[],
59
+ /**
60
+ * Constant object that stores CSS properties names used as triggers
61
+ * </p>
62
+ * Currently used:
63
+ * <ul>
64
+ * <li>constants.DISPLAY = "display"</li>
65
+ * <li>constants.POSITION = "position"</li>
66
+ * </ul>
67
+ */
68
+ constants:{
69
+ DISPLAY:"display",
70
+ POSITION:"position"
71
+ },
72
+ /**
73
+ * Template compiler
74
+ */
75
+ compiler:null,
76
+ /**
77
+ * Template output generator
78
+ */
79
+ generator:null,
80
+
81
+ /**
82
+ * @ignore
83
+ * see templateLayout constructor
84
+ */
85
+ init:function (templateSources) {
86
+ var args, firstSource, internalSources = [];
87
+ log.debug("sources:", templateSources);
88
+
89
+ log.debug("init subsystems...");
90
+ parser = wef.cssParser();
91
+ log.debug("subsystems... [OK]");
92
+
93
+ args = Array.prototype.slice.call(templateSources);
94
+ firstSource = args[0];
95
+
96
+ //templateLayout()
97
+ if (!firstSource) {
98
+ log.info("no external template loaded!!!");
99
+ Array.prototype.forEach.call(document.styleSheets, function (sheet) {
100
+ if (sheet.href !== null) {
101
+ //load external CSS
102
+ log.info("load external CSS", sheet.href);
103
+ internalSources.push(sheet.href);
104
+ }
105
+ else {
106
+ var text = sheet.ownerNode.innerHTML;
107
+ log.info("load style tag", text);
108
+ internalSources.push(text);
109
+ }
110
+ });
111
+
112
+ this.templateSources = internalSources.map(getContent);
113
+ log.info("templateLayout... [OK]");
114
+ return this;
115
+ }
116
+
117
+ //templateLayout("aString") and templateLayout("aString", "anotherString", ...)
118
+ if (args.length >= 1 && args.every(function (element) {
119
+ return typeof element == "string";
120
+ })) {
121
+ this.templateSources = args.map(getContent);
122
+ log.info("templateLayout... [OK]");
123
+ return this;
124
+ }
125
+
126
+ log.error("Invalid argument");
127
+ throw new Error("Invalid argument");
128
+ },
129
+ /**
130
+ * Reads, compiles and generates the template
131
+ *
132
+ * @param {string}[options=all] Only for testing purposes.
133
+ * Supported values [none|parse|compile]
134
+ * </p>
135
+ * Stops transform process at different points:
136
+ * <ul>
137
+ * <li>none: transform does nothing</li>
138
+ * <li>parse: transform only parses template source</li>
139
+ * <li>compile: transform parses source and compiles the template</li>
140
+ * </ul>
141
+ */
142
+ transform:function () {
143
+ log.debug("transform...");
144
+ var options = parseTransformOptions(arguments);
145
+
146
+ if (options.parse) {
147
+ log.info("Step 1: parse");
148
+ log.group();
149
+ parser.whenStart(this.parserStarts);
150
+ parser.whenProperty(this.propertyFound);
151
+ parser.whenStop(this.parserDone);
152
+
153
+ parser.parse(this.templateSources.reduce(function (previous, source) {
154
+ return previous + source.sourceText;
155
+ }, ""));
156
+
157
+ log.groupEnd();
158
+ log.info("Step 1: parse... [OK]");
159
+ }
160
+ if (options.compile) {
161
+ log.info("Step 2: compile");
162
+ log.group();
163
+ tom = this.compiler().compile(buffer);
164
+ // log.info("TOM: ", tom);
165
+ log.groupEnd();
166
+ log.info("Step 2: compile... [OK]");
167
+ }
168
+ if (options.generate) {
169
+ log.info("Step 3: generate");
170
+ log.group();
171
+ this.generator(tom).patchDOM();
172
+ log.groupEnd();
173
+ log.info("Step 3: generate... [OK]");
174
+ }
175
+
176
+ log.info("transform... [OK]");
177
+ return this;
178
+ },
179
+ /**
180
+ * Returns the info from the parsing step
181
+ * @returns {ParserBufferEntry[]}buffer
182
+ */
183
+ getBuffer:function () {
184
+ return buffer;
185
+ },
186
+ /**
187
+ * Returns TOM (Template Object Model)
188
+ * @returns {rootTemplate}tom
189
+ */
190
+ getTOM:function () {
191
+ return tom;
192
+ },
193
+ /**
194
+ * "Parser start" callback. Prints start time and resets buffer
195
+ *
196
+ * @param o Information sent by parser
197
+ * @param o.time Start time in milliseconds
198
+ */
199
+ parserStarts:function (o) {
200
+ log.info("start parsing at", new Date(o.time).toLocaleTimeString());
201
+ buffer = {};
202
+ },
203
+ /**
204
+ * "Property has been found" callback. Stores in buffer valid properties
205
+ *
206
+ * @param {CSSParserProperty}property found property information
207
+ */
208
+ propertyFound:function (property) {
209
+ log.info("templateLayout listens: property found");
210
+ if (templateLayout.fn.isSupportedProperty(property)) {
211
+ store(property);
212
+ }
213
+ },
214
+ /**
215
+ * "Parser stop" callback. Prints stop time
216
+ * @param {StopCallbackData}o Information sent by parser
217
+ */
218
+ parserDone:function (o) {
219
+ log.info("parsing done at", new Date(o.time).toLocaleTimeString());
220
+ },
221
+ /**
222
+ * Checks if given property is a valid one.
223
+ * If property name exists in constants then is a valid one
224
+ *
225
+ * @param {CSSParserProperty}property the property
226
+ * @returns {boolean}true if exists constants[???] == property.declaration.property
227
+ */
228
+ isSupportedProperty:function (property) {
229
+ var iterator;
230
+ for (iterator in templateLayout.fn.constants) {
231
+ if (templateLayout.fn.constants.hasOwnProperty(iterator)) {
232
+ if (templateLayout.fn.constants[iterator] == property.declaration.property) {
233
+ log.info("supported property found: ", property.declaration.property);
234
+ return true;
235
+ }
236
+ }
237
+ }
238
+ return false;
239
+ }
240
+ };
241
+
242
+ templateLayout.fn = templateLayout.prototype;
243
+
244
+ templateLayout.fn.init.prototype = templateLayout.fn;
245
+
246
+ function getSourceType(templateSource) {
247
+ var rxHttp = /^http[s]?:\/\/.*\.css$/i, rxFile = /^file:\/\/.*\.css$/i, rxPath = /^(?!\s*.*(http[s]?|file))(\.){0,2}(\/.*)*.*\.css$/i;
248
+ if (rxHttp.exec(templateSource)) {
249
+ return "http";
250
+ }
251
+ if (rxPath.exec(templateSource) || rxFile.exec(templateSource)) {
252
+ return "file";
253
+ }
254
+ return "css";
255
+ }
256
+
257
+ function getContent(templateSource) {
258
+ var type = getSourceType(templateSource);
259
+ if (type == "http" || type == "file") {
260
+ return {
261
+ type:type,
262
+ sourceText:readFile(templateSource)
263
+ };
264
+ }
265
+ if (type == "css") {
266
+ return {
267
+ type:type,
268
+ sourceText:templateSource
269
+ };
270
+ } else {
271
+ throw new Error("unknown sourceType");
272
+ }
273
+ }
274
+
275
+ function parseTransformOptions(args) {
276
+ var options = {parse:true, compile:true, generate:true};
277
+ if (args.length === 0) {
278
+ return options;
279
+ }
280
+ if (args[0].action == "none") {
281
+ options.parse = options.compile = options.generate = false;
282
+ }
283
+ if (args[0].action == "parse") {
284
+ options.compile = options.generate = false;
285
+ }
286
+ if (args[0].action == "compile") {
287
+ options.generate = false;
288
+ }
289
+ return options;
290
+ }
291
+
292
+ function readFile(url) {
293
+ var templateText="";
294
+
295
+ try {
296
+ log.info("reading file...");
297
+ wef.net.ajax(url, {
298
+ asynchronous:false,
299
+ success:function (request) {
300
+ templateText = request.responseText;
301
+ }
302
+ });
303
+ log.info("template loaded... [OK]");
304
+ return templateText;
305
+ } catch (e) {
306
+ log.error("Operation not supported", e);
307
+ throw new Error("Operation not supported", e);
308
+ }
309
+ }
310
+
311
+ function store(rule) {
312
+ if (!buffer[rule.selectorText]) {
313
+ buffer[rule.selectorText] =
314
+ /**
315
+ * @namespace Data format of parser buffer entry
316
+ * @name ParserBufferEntry
317
+ */
318
+ /**
319
+ * @lends ParserBufferEntry#
320
+ */
321
+ {
322
+ /**
323
+ * property selector text
324
+ * @type string
325
+ */
326
+ selectorText:rule.selectorText,
327
+ /**
328
+ * array of declarations (property_name:property_value)
329
+ * @type string[]
330
+ */
331
+ declaration:{}
332
+ };
333
+ }
334
+ buffer[rule.selectorText].declaration[rule.declaration.property] = rule.declaration.valueText;
335
+ log.info("property stored: ", rule.declaration.property);
336
+ }
337
+
338
+ global.templateLayout = templateLayout;
339
+ })(window);
metadata ADDED
@@ -0,0 +1,158 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: flexlayout-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Kristian Mandrup
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-08-28 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 2.8.0
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 2.8.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: rdoc
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '3.12'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '3.12'
46
+ - !ruby/object:Gem::Dependency
47
+ name: bundler
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: 1.0.0
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 1.0.0
62
+ - !ruby/object:Gem::Dependency
63
+ name: jeweler
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: 1.8.3
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: 1.8.3
78
+ - !ruby/object:Gem::Dependency
79
+ name: simplecov
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0.5'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0.5'
94
+ description: Use CSS Flex, Regions and Template layout models in your Rails apps
95
+ email: kmandrup@gmail.com
96
+ executables: []
97
+ extensions: []
98
+ extra_rdoc_files:
99
+ - LICENSE.txt
100
+ - README.md
101
+ files:
102
+ - .document
103
+ - .rspec
104
+ - Gemfile
105
+ - Gemfile.lock
106
+ - LICENSE.txt
107
+ - README.md
108
+ - Rakefile
109
+ - VERSION
110
+ - flexlayout-rails.gemspec
111
+ - lib/flexlayout-rails.rb
112
+ - spec/regions/img/lorem-ipsum-logo.jpeg
113
+ - spec/regions/index.html
114
+ - spec/regions/js/detection.js
115
+ - spec/regions/js/layout.js
116
+ - spec/regions/js/setup.js
117
+ - spec/spec_helper.rb
118
+ - vendor/assets/javascripts/feature-detects/cssregions.js
119
+ - vendor/assets/javascripts/flexie.js
120
+ - vendor/assets/javascripts/flexie.min.js
121
+ - vendor/assets/javascripts/jquery.lettering.js
122
+ - vendor/assets/javascripts/jquery.lettering.min.js
123
+ - vendor/assets/javascripts/regions.jquery.js
124
+ - vendor/assets/javascripts/regions.jquery.min.js
125
+ - vendor/assets/javascripts/template_layout/jquery/jquery.tpl_layout1.1.6.js
126
+ - vendor/assets/javascripts/template_layout/jquery/jquery.tpl_layout1.1.6.min.js
127
+ - vendor/assets/javascripts/template_layout/templateLayout.compiler.js
128
+ - vendor/assets/javascripts/template_layout/templateLayout.generator.js
129
+ - vendor/assets/javascripts/template_layout/templateLayout.js
130
+ homepage: http://github.com/kristianmandrup/flexlayout-rails
131
+ licenses:
132
+ - MIT
133
+ post_install_message:
134
+ rdoc_options: []
135
+ require_paths:
136
+ - lib
137
+ required_ruby_version: !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ segments:
144
+ - 0
145
+ hash: 76961756385462174
146
+ required_rubygems_version: !ruby/object:Gem::Requirement
147
+ none: false
148
+ requirements:
149
+ - - ! '>='
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ requirements: []
153
+ rubyforge_project:
154
+ rubygems_version: 1.8.24
155
+ signing_key:
156
+ specification_version: 3
157
+ summary: CSS3 layout polyfills pre-packaged for Rails asset pipeline
158
+ test_files: []