SiteOrigin CSS - Version 1.1

Version Description

  • 26 September 2016 =
  • Changed CSS parsing library. Fixed several issues with the visual editor mode.
  • Added address bar to preview window.
  • Small CSS fixes.
  • Small changes to allow adding more visual editor fields.
Download this release

Release Info

Developer gpriday
Plugin Icon 128x128 SiteOrigin CSS
Version 1.1
Comparing to
See all releases

Code changes from version 1.0.8 to 1.1

Files changed (13) hide show
  1. css/admin.css +37 -3
  2. js/URI.js +2201 -0
  3. js/URI.min.js +1 -0
  4. js/css.js +4344 -555
  5. js/css.min.js +2 -1
  6. js/editor.js +146 -76
  7. js/editor.min.js +1 -1
  8. js/inspector.js +52 -27
  9. js/inspector.min.js +1 -1
  10. readme.txt +8 -2
  11. so-css.php +14 -5
  12. tpl/js-templates.php +7 -0
  13. tpl/page.php +6 -9
css/admin.css CHANGED
@@ -64,7 +64,8 @@
64
  margin: 0;
65
  line-height: 2.2em;
66
  }
67
- #so-custom-css-form .custom-css-preview iframe {
 
68
  display: none;
69
  }
70
  #so-custom-css-form .custom-css-toolbar {
@@ -169,13 +170,41 @@
169
  #so-custom-css-form.expanded .custom-css-preview {
170
  position: fixed;
171
  display: block;
172
- top: 0;
173
  right: 0;
174
  bottom: 0;
175
  left: 340px;
176
  background: #ffffff;
177
  }
178
- #so-custom-css-form.expanded .custom-css-preview iframe {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
179
  display: block;
180
  width: 100%;
181
  height: 100%;
@@ -302,6 +331,11 @@
302
  width: 175px;
303
  box-sizing: border-box;
304
  border-radius: 0;
 
 
 
 
 
305
  }
306
  #so-custom-css-properties .sections .fields-table .select {
307
  display: block;
64
  margin: 0;
65
  line-height: 2.2em;
66
  }
67
+ #so-custom-css-form .custom-css-preview iframe,
68
+ #so-custom-css-form .custom-css-preview #preview-navigator {
69
  display: none;
70
  }
71
  #so-custom-css-form .custom-css-toolbar {
170
  #so-custom-css-form.expanded .custom-css-preview {
171
  position: fixed;
172
  display: block;
173
+ top: 40px;
174
  right: 0;
175
  bottom: 0;
176
  left: 340px;
177
  background: #ffffff;
178
  }
179
+ #so-custom-css-form.expanded .custom-css-preview #preview-navigator {
180
+ display: block;
181
+ -ms-box-sizing: border-box;
182
+ -moz-box-sizing: border-box;
183
+ -webkit-box-sizing: border-box;
184
+ box-sizing: border-box;
185
+ padding: 6px 10px;
186
+ position: absolute;
187
+ width: 100%;
188
+ height: 40px;
189
+ top: -40px;
190
+ background: #bbb;
191
+ background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #bbb), color-stop(1, #eee));
192
+ background: -ms-linear-gradient(bottom, #bbb, #eee);
193
+ background: -moz-linear-gradient(center bottom, #bbb 0%, #eee 100%);
194
+ background: -o-linear-gradient(#eee, #bbb);
195
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eee', endColorstr='#bbb', GradientType=0);
196
+ border-bottom: 1px solid #888;
197
+ }
198
+ #so-custom-css-form.expanded .custom-css-preview #preview-navigator input {
199
+ width: 100%;
200
+ border: 1px solid #888;
201
+ border-radius: 2px;
202
+ color: #444;
203
+ -webkit-box-shadow: inset 2px 2px 2px rgba( 0,0,0,0.1 );
204
+ -moz-box-shadow: inset 2px 2px 2px rgba( 0,0,0,0.1 );
205
+ box-shadow: inset 2px 2px 2px rgba( 0,0,0,0.1 );
206
+ }
207
+ #so-custom-css-form.expanded .custom-css-preview #preview-iframe {
208
  display: block;
209
  width: 100%;
210
  height: 100%;
331
  width: 175px;
332
  box-sizing: border-box;
333
  border-radius: 0;
334
+ font-size: 12px;
335
+ padding: 5px 8px;
336
+ }
337
+ #so-custom-css-properties .sections .fields-table .minicolors input {
338
+ padding-left: 30px;
339
  }
340
  #so-custom-css-properties .sections .fields-table .select {
341
  display: block;
js/URI.js ADDED
@@ -0,0 +1,2201 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * URI.js - Mutating URLs
3
+ *
4
+ * Version: 1.18.1
5
+ *
6
+ * Author: Rodney Rehm
7
+ * Web: http://medialize.github.io/URI.js/
8
+ *
9
+ * Licensed under
10
+ * MIT License http://www.opensource.org/licenses/mit-license
11
+ *
12
+ */
13
+ (function (root, factory) {
14
+ 'use strict';
15
+ // Browser globals (root is window)
16
+ root.URI = factory(root.punycode, root.IPv6, root.SecondLevelDomains, root);
17
+ }(this, function (punycode, IPv6, SLD, root) {
18
+ 'use strict';
19
+ /*global location, escape, unescape */
20
+ // FIXME: v2.0.0 renamce non-camelCase properties to uppercase
21
+ /*jshint camelcase: false */
22
+
23
+ // save current URI variable, if any
24
+ var _URI = root && root.URI;
25
+
26
+ function URI(url, base) {
27
+ var _urlSupplied = arguments.length >= 1;
28
+ var _baseSupplied = arguments.length >= 2;
29
+
30
+ // Allow instantiation without the 'new' keyword
31
+ if (!(this instanceof URI)) {
32
+ if (_urlSupplied) {
33
+ if (_baseSupplied) {
34
+ return new URI(url, base);
35
+ }
36
+
37
+ return new URI(url);
38
+ }
39
+
40
+ return new URI();
41
+ }
42
+
43
+ if (url === undefined) {
44
+ if (_urlSupplied) {
45
+ throw new TypeError('undefined is not a valid argument for URI');
46
+ }
47
+
48
+ if (typeof location !== 'undefined') {
49
+ url = location.href + '';
50
+ } else {
51
+ url = '';
52
+ }
53
+ }
54
+
55
+ this.href(url);
56
+
57
+ // resolve to base according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#constructor
58
+ if (base !== undefined) {
59
+ return this.absoluteTo(base);
60
+ }
61
+
62
+ return this;
63
+ }
64
+
65
+ URI.version = '1.18.1';
66
+
67
+ var p = URI.prototype;
68
+ var hasOwn = Object.prototype.hasOwnProperty;
69
+
70
+ function escapeRegEx(string) {
71
+ // https://github.com/medialize/URI.js/commit/85ac21783c11f8ccab06106dba9735a31a86924d#commitcomment-821963
72
+ return string.replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
73
+ }
74
+
75
+ function getType(value) {
76
+ // IE8 doesn't return [Object Undefined] but [Object Object] for undefined value
77
+ if (value === undefined) {
78
+ return 'Undefined';
79
+ }
80
+
81
+ return String(Object.prototype.toString.call(value)).slice(8, -1);
82
+ }
83
+
84
+ function isArray(obj) {
85
+ return getType(obj) === 'Array';
86
+ }
87
+
88
+ function filterArrayValues(data, value) {
89
+ var lookup = {};
90
+ var i, length;
91
+
92
+ if (getType(value) === 'RegExp') {
93
+ lookup = null;
94
+ } else if (isArray(value)) {
95
+ for (i = 0, length = value.length; i < length; i++) {
96
+ lookup[value[i]] = true;
97
+ }
98
+ } else {
99
+ lookup[value] = true;
100
+ }
101
+
102
+ for (i = 0, length = data.length; i < length; i++) {
103
+ /*jshint laxbreak: true */
104
+ var _match = lookup && lookup[data[i]] !== undefined
105
+ || !lookup && value.test(data[i]);
106
+ /*jshint laxbreak: false */
107
+ if (_match) {
108
+ data.splice(i, 1);
109
+ length--;
110
+ i--;
111
+ }
112
+ }
113
+
114
+ return data;
115
+ }
116
+
117
+ function arrayContains(list, value) {
118
+ var i, length;
119
+
120
+ // value may be string, number, array, regexp
121
+ if (isArray(value)) {
122
+ // Note: this can be optimized to O(n) (instead of current O(m * n))
123
+ for (i = 0, length = value.length; i < length; i++) {
124
+ if (!arrayContains(list, value[i])) {
125
+ return false;
126
+ }
127
+ }
128
+
129
+ return true;
130
+ }
131
+
132
+ var _type = getType(value);
133
+ for (i = 0, length = list.length; i < length; i++) {
134
+ if (_type === 'RegExp') {
135
+ if (typeof list[i] === 'string' && list[i].match(value)) {
136
+ return true;
137
+ }
138
+ } else if (list[i] === value) {
139
+ return true;
140
+ }
141
+ }
142
+
143
+ return false;
144
+ }
145
+
146
+ function arraysEqual(one, two) {
147
+ if (!isArray(one) || !isArray(two)) {
148
+ return false;
149
+ }
150
+
151
+ // arrays can't be equal if they have different amount of content
152
+ if (one.length !== two.length) {
153
+ return false;
154
+ }
155
+
156
+ one.sort();
157
+ two.sort();
158
+
159
+ for (var i = 0, l = one.length; i < l; i++) {
160
+ if (one[i] !== two[i]) {
161
+ return false;
162
+ }
163
+ }
164
+
165
+ return true;
166
+ }
167
+
168
+ function trimSlashes(text) {
169
+ var trim_expression = /^\/+|\/+$/g;
170
+ return text.replace(trim_expression, '');
171
+ }
172
+
173
+ URI._parts = function() {
174
+ return {
175
+ protocol: null,
176
+ username: null,
177
+ password: null,
178
+ hostname: null,
179
+ urn: null,
180
+ port: null,
181
+ path: null,
182
+ query: null,
183
+ fragment: null,
184
+ // state
185
+ duplicateQueryParameters: URI.duplicateQueryParameters,
186
+ escapeQuerySpace: URI.escapeQuerySpace
187
+ };
188
+ };
189
+ // state: allow duplicate query parameters (a=1&a=1)
190
+ URI.duplicateQueryParameters = false;
191
+ // state: replaces + with %20 (space in query strings)
192
+ URI.escapeQuerySpace = true;
193
+ // static properties
194
+ URI.protocol_expression = /^[a-z][a-z0-9.+-]*$/i;
195
+ URI.idn_expression = /[^a-z0-9\.-]/i;
196
+ URI.punycode_expression = /(xn--)/i;
197
+ // well, 333.444.555.666 matches, but it sure ain't no IPv4 - do we care?
198
+ URI.ip4_expression = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;
199
+ // credits to Rich Brown
200
+ // source: http://forums.intermapper.com/viewtopic.php?p=1096#1096
201
+ // specification: http://www.ietf.org/rfc/rfc4291.txt
202
+ URI.ip6_expression = /^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/;
203
+ // expression used is "gruber revised" (@gruber v2) determined to be the
204
+ // best solution in a regex-golf we did a couple of ages ago at
205
+ // * http://mathiasbynens.be/demo/url-regex
206
+ // * http://rodneyrehm.de/t/url-regex.html
207
+ URI.find_uri_expression = /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/ig;
208
+ URI.findUri = {
209
+ // valid "scheme://" or "www."
210
+ start: /\b(?:([a-z][a-z0-9.+-]*:\/\/)|www\.)/gi,
211
+ // everything up to the next whitespace
212
+ end: /[\s\r\n]|$/,
213
+ // trim trailing punctuation captured by end RegExp
214
+ trim: /[`!()\[\]{};:'".,<>?«»“”„‘’]+$/
215
+ };
216
+ // http://www.iana.org/assignments/uri-schemes.html
217
+ // http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers#Well-known_ports
218
+ URI.defaultPorts = {
219
+ http: '80',
220
+ https: '443',
221
+ ftp: '21',
222
+ gopher: '70',
223
+ ws: '80',
224
+ wss: '443'
225
+ };
226
+ // allowed hostname characters according to RFC 3986
227
+ // ALPHA DIGIT "-" "." "_" "~" "!" "$" "&" "'" "(" ")" "*" "+" "," ";" "=" %encoded
228
+ // I've never seen a (non-IDN) hostname other than: ALPHA DIGIT . -
229
+ URI.invalid_hostname_characters = /[^a-zA-Z0-9\.-]/;
230
+ // map DOM Elements to their URI attribute
231
+ URI.domAttributes = {
232
+ 'a': 'href',
233
+ 'blockquote': 'cite',
234
+ 'link': 'href',
235
+ 'base': 'href',
236
+ 'script': 'src',
237
+ 'form': 'action',