| 181 | }; |
| 182 | |
| 183 | var parseUrlData = function(data, cb) { |
| 184 | var ret = []; |
| 185 | |
| 186 | try { |
| 187 | data = data.replace(/\t/g, ' '); |
| 188 | data = data.replace(/\r/g, '\n'); |
| 189 | data = data.replace(/\n\n+/g, '\n'); |
| 190 | |
| 191 | var lines = data.split('\n'); |
| 192 | for (var i=0;i<lines.length;i++) { |
| 193 | var l = lines[i]; |
| 194 | var tags = l.split('|'); |
| 195 | if (tags.length > 3) { |
| 196 | console.log("si: can't handle line: " + l); |
| 197 | continue; |
| 198 | } |
| 199 | var url = tags[tags.length - 1]; |
| 200 | var options = null; |
| 201 | var name = null; |
| 202 | if (tags.length > 1) { |
| 203 | for (var j=tags.length-2;j>=0;j--) { |
| 204 | try { |
| 205 | options = JSON.parse(tags[j]); |
| 206 | } catch (e) { |
| 207 | name = tags[j]; |
| 208 | } |
| 209 | } |
| 210 | } |
| 211 | |
| 212 | ret.push({ name: name, url: url, options: (options || {}) }); |
| 213 | } |
| 214 | } catch (e) { |
| 215 | console.log("si: unable to parse data: " + data); |
| 216 | } |
| 217 | if (cb) cb(ret); |
| 218 | }; |
| 219 | |
| 220 | var listFromUrl = function(callback) { |
| 221 | if (!_url) { |