riot_js-rails 0.3.0 → 0.4.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.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: riot_js-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bartosz Jaroszewski
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-09-15 00:00:00.000000000 Z
11
+ date: 2016-02-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -135,8 +135,8 @@ files:
135
135
  - lib/riot_js/rails/railtie.rb
136
136
  - lib/riot_js/rails/version.rb
137
137
  - riot_js-rails.gemspec
138
+ - vendor/assets/javascripts/compiler/brackets.js
138
139
  - vendor/assets/javascripts/compiler/compiler.js
139
- - vendor/assets/javascripts/compiler/compiler_core.js
140
140
  - vendor/assets/javascripts/compiler/node_runner.js
141
141
  - vendor/assets/javascripts/compiler/parsers.js
142
142
  - vendor/assets/javascripts/riot.js
@@ -1,234 +0,0 @@
1
- var BOOL_ATTR = ('allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,'+
2
- 'defaultchecked,defaultmuted,defaultselected,defer,disabled,draggable,enabled,formnovalidate,hidden,'+
3
- 'indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,'+
4
- 'pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,spellcheck,translate,truespeed,'+
5
- 'typemustmatch,visible').split(','),
6
- // these cannot be auto-closed
7
- VOID_TAGS = 'area,base,br,col,command,embed,hr,img,input,keygen,link,meta,param,source,track,wbr'.split(','),
8
- /*
9
- Following attributes give error when parsed on browser with { exrp_values }
10
-
11
- 'd' describes the SVG <path>, Chrome gives error if the value is not valid format
12
- https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/d
13
- */
14
- PREFIX_ATTR = ['style', 'src', 'd'],
15
-
16
- LINE_TAG = /^<([\w\-]+)>(.*)<\/\1>/gim,
17
- QUOTE = /=({[^}]+})([\s\/\>]|$)/g,
18
- SET_ATTR = /([\w\-]+)=(["'])([^\2]+?)\2/g,
19
- EXPR = /{\s*([^}]+)\s*}/g,
20
- // (tagname) (html) (javascript) endtag
21
- CUSTOM_TAG = /^<([\w\-]+)\s?([^>]*)>([^\x00]*[\w\/}"']>$)?([^\x00]*?)^<\/\1>/gim,
22
- SCRIPT = /<script(?:\s+type=['"]?([^>'"]+)['"]?)?>([^\x00]*?)<\/script>/gi,
23
- STYLE = /<style(?:\s+([^>]+))?>([^\x00]*?)<\/style>/gi,
24
- CSS_SELECTOR = /(^|\}|\{)\s*([^\{\}]+)\s*(?=\{)/g,
25
- HTML_COMMENT = /<!--.*?-->/g,
26
- CLOSED_TAG = /<([\w\-]+)([^>]*)\/\s*>/g,
27
- BLOCK_COMMENT = /\/\*[\s\S]*?\*\//g,
28
- LINE_COMMENT = /^\s*\/\/.*$/gm,
29
- INPUT_NUMBER = /(<input\s[^>]*?)type=['"]number['"]/gm
30
-
31
- function mktag(name, html, css, attrs, js) {
32
- return 'riot.tag(\'' +
33
- name + '\', \'' +
34
- html + '\'' +
35
- (css ? ', \'' + css + '\'' : '') +
36
- (attrs ? ', \'' + attrs.replace(/'/g, "\\'") + '\'' : '') +
37
- ', function(opts) {' + js + '\n});'
38
- }
39
-
40
- function compileHTML(html, opts, type) {
41
-
42
- if (!html) return ''
43
-
44
- var brackets = riot.util.brackets,
45
- b0 = brackets(0),
46
- b1 = brackets(1)
47
-
48
- // foo={ bar } --> foo="{ bar }"
49
- html = html.replace(brackets(QUOTE), '="$1"$2')
50
-
51
- // whitespace
52
- html = opts.whitespace ? html.replace(/\r\n?|\n/g, '\\n') : html.replace(/\s+/g, ' ')
53
-
54
- // strip comments
55
- html = html.trim().replace(HTML_COMMENT, '')
56
-
57
- // input type=numbr
58
- html = html.replace(INPUT_NUMBER, '$1riot-type='+ b0 +'"number"'+ b1) // fake expression
59
-
60
- // alter special attribute names
61
- html = html.replace(SET_ATTR, function(full, name, _, expr) {
62
- if (expr.indexOf(b0) >= 0) {
63
- name = name.toLowerCase()
64
-
65
- if (PREFIX_ATTR.indexOf(name) >= 0) name = 'riot-' + name
66
-
67
- // IE8 looses boolean attr values: `checked={ expr }` --> `__checked={ expr }`
68
- else if (BOOL_ATTR.indexOf(name) >= 0) name = '__' + name
69
- }
70
-
71
- return name + '="' + expr + '"'
72
- })
73
-
74
- // run expressions trough parser
75
- if (opts.expr) {
76
- html = html.replace(brackets(EXPR), function(_, expr) {
77
- var ret = compileJS(expr, opts, type).trim().replace(/[\r\n]+/g, '').trim()
78
- if (ret.slice(-1) == ';') ret = ret.slice(0, -1)
79
- return b0 + ret + b1
80
- })
81
- }
82
-
83
- // <foo/> -> <foo></foo>
84
- html = html.replace(CLOSED_TAG, function(_, name, attr) {
85
- var tag = '<' + name + (attr ? ' ' + attr.trim() : '') + '>'
86
-
87
- // Do not self-close HTML5 void tags
88
- if (VOID_TAGS.indexOf(name.toLowerCase()) == -1) tag += '</' + name + '>'
89
- return tag
90
- })
91
-
92
- // escape single quotes
93
- html = html.replace(/'/g, "\\'")
94
-
95
- // \{ jotain \} --> \\{ jotain \\}
96
- html = html.replace(brackets(/\\{|\\}/g), '\\$&')
97
-
98
- // compact: no whitespace between tags
99
- if (opts.compact) html = html.replace(/> </g, '><')
100
-
101
- return html
102
-
103
- }
104
-
105
-
106
- function riotjs(js) {
107
-
108
- // strip comments
109
- js = js.replace(LINE_COMMENT, '').replace(BLOCK_COMMENT, '')
110
-
111
- // ES6 method signatures
112
- var lines = js.split('\n'),
113
- es6Ident = ''
114
-
115
- lines.forEach(function(line, i) {
116
- var l = line.trim()
117
-
118
- // method start
119
- if (l[0] != '}' && ~l.indexOf('(')) {
120
- var end = l.match(/[{}]$/),
121
- m = end && line.match(/^(\s+)([$\w]+)\s*\(([$\w,\s]*)\)\s*\{/)
122
-
123
- if (m && !/^(if|while|switch|for|catch|function)$/.test(m[2])) {
124
- lines[i] = m[1] + 'this.' + m[2] + ' = function(' + m[3] + ') {'
125
-
126
- // foo() { }
127
- if (end[0] == '}') {
128
- lines[i] += ' ' + l.slice(m[0].length - 1, -1) + '}.bind(this)'
129
-
130
- } else {
131
- es6Ident = m[1]
132
- }
133
- }
134
-
135
- }
136
-
137
- // method end
138
- if (line.slice(0, es6Ident.length + 1) == es6Ident + '}') {
139
- lines[i] = es6Ident + '}.bind(this);'
140
- es6Ident = ''
141
- }
142
-
143
- })
144
-
145
- return lines.join('\n')
146
-
147
- }
148
-
149
- function scopedCSS (tag, style, type) {
150
- // 1. Remove CSS comments
151
- // 2. Find selectors and separate them by conmma
152
- // 3. keep special selectors as is
153
- // 4. prepend tag and [riot-tag]
154
- return style.replace(BLOCK_COMMENT, '').replace(CSS_SELECTOR, function (m, p1, p2) {
155
- return p1 + ' ' + p2.split(/\s*,\s*/g).map(function(sel) {
156
- var s = sel.trim()
157
- var t = (/:scope/.test(s) ? '' : ' ') + s.replace(/:scope/, '')
158
- return s[0] == '@' || s == 'from' || s == 'to' || /%$/.test(s) ? s :
159
- tag + t + ', [riot-tag="' + tag + '"]' + t
160
- }).join(',')
161
- }).trim()
162
- }
163
-
164
- function compileJS(js, opts, type) {
165
- if (!js) return ''
166
- var parser = opts.parser || (type ? riot.parsers.js[type] : riotjs)
167
- if (!parser) throw new Error('Parser not found "' + type + '"')
168
- return parser(js.replace(/\r\n?/g, '\n'), opts)
169
- }
170
-
171
- function compileTemplate(lang, html) {
172
- var parser = riot.parsers.html[lang]
173
- if (!parser) throw new Error('Template parser not found "' + lang + '"')
174
- return parser(html.replace(/\r\n?/g, '\n'))
175
- }
176
-
177
- function compileCSS(style, tag, type, scoped) {
178
- if (type === 'scoped-css') scoped = 1
179
- else if (riot.parsers.css[type]) style = riot.parsers.css[type](tag, style)
180
- else if (type !== 'css') throw new Error('CSS parser not found: "' + type + '"')
181
- if (scoped) style = scopedCSS(tag, style)
182
- return style.replace(/\s+/g, ' ').replace(/\\/g, '\\\\').replace(/'/g, "\\'").trim()
183
- }
184
-
185
- function compile(src, opts) {
186
-
187
- if (!opts) opts = {}
188
- else {
189
-
190
- if (opts.brackets) riot.settings.brackets = opts.brackets
191
-
192
- if (opts.template) src = compileTemplate(opts.template, src)
193
- }
194
-
195
- src = src.replace(LINE_TAG, function(_, tagName, html) {
196
- return mktag(tagName, compileHTML(html, opts), '', '', '')
197
- })
198
-
199
- return src.replace(CUSTOM_TAG, function(_, tagName, attrs, html, js) {
200
- var style = '',
201
- type = opts.type
202
-
203
- if (html) {
204
-
205
- // js wrapped inside <script> tag
206
- if (!js.trim()) {
207
- html = html.replace(SCRIPT, function(_, _type, script) {
208
- if (_type) type = _type.replace('text/', '')
209
- js = script
210
- return ''
211
- })
212
- }
213
-
214
- // styles in <style> tag
215
- html = html.replace(STYLE, function(_, types, _style) {
216
- var scoped = /(?:^|\s+)scoped(\s|=|$)/i.test(types),
217
- type = types && types.match(/(?:^|\s+)type\s*=\s*['"]?([^'"\s]+)['"]?/i)
218
- if (type) type = type[1].replace('text/', '')
219
- style += (style ? ' ' : '') + compileCSS(_style.trim(), tagName, type || 'css', scoped)
220
- return ''
221
- })
222
- }
223
-
224
- return mktag(
225
- tagName,
226
- compileHTML(html, opts, type),
227
- style,
228
- compileHTML(attrs, ''),
229
- compileJS(js, opts, type)
230
- )
231
-
232
- })
233
-
234
- }