Skip to content

Commit dfe0e25

Browse files
committed
feat(text and css): html partials and css can be loaded via systemjs
1 parent eda2325 commit dfe0e25

File tree

4 files changed

+168
-0
lines changed

4 files changed

+168
-0
lines changed

public/app/core/utils/css_loader.ts

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
///<reference path="../../headers/common.d.ts" />
2+
3+
var waitSeconds = 100;
4+
var head = document.getElementsByTagName('head')[0];
5+
6+
// get all link tags in the page
7+
var links = document.getElementsByTagName('link');
8+
var linkHrefs = [];
9+
for (var i = 0; i < links.length; i++) {
10+
linkHrefs.push(links[i].href);
11+
}
12+
13+
var isWebkit = !!window.navigator.userAgent.match(/AppleWebKit\/([^ ;]*)/);
14+
var webkitLoadCheck = function(link, callback) {
15+
setTimeout(function() {
16+
for (var i = 0; i < document.styleSheets.length; i++) {
17+
var sheet = document.styleSheets[i];
18+
if (sheet.href === link.href) {
19+
return callback();
20+
}
21+
}
22+
webkitLoadCheck(link, callback);
23+
}, 10);
24+
};
25+
26+
var noop = function() {};
27+
28+
var loadCSS = function(url) {
29+
return new Promise(function(resolve, reject) {
30+
var link = document.createElement('link');
31+
var timeout = setTimeout(function() {
32+
reject('Unable to load CSS');
33+
}, waitSeconds * 1000);
34+
35+
var _callback = function(error) {
36+
clearTimeout(timeout);
37+
link.onload = link.onerror = noop;
38+
setTimeout(function() {
39+
if (error) {
40+
reject(error);
41+
} else {
42+
resolve('');
43+
}
44+
}, 7);
45+
};
46+
47+
link.type = 'text/css';
48+
link.rel = 'stylesheet';
49+
link.href = url;
50+
51+
if (!isWebkit) {
52+
link.onload = function() { _callback(undefined); };
53+
} else {
54+
webkitLoadCheck(link, _callback);
55+
}
56+
57+
link.onerror = function(evt: any) {
58+
_callback(evt.error || new Error('Error loading CSS file.'));
59+
};
60+
61+
head.appendChild(link);
62+
});
63+
};
64+
65+
export function fetch(load): any {
66+
if (typeof window === 'undefined') {
67+
return '';
68+
}
69+
70+
// dont reload styles loaded in the head
71+
for (var i = 0; i < linkHrefs.length; i++) {
72+
if (load.address === linkHrefs[i]) {
73+
return '';
74+
}
75+
}
76+
return loadCSS(load.address);
77+
}
78+

public/app/system.conf.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ System.config({
4343
},
4444

4545
map: {
46+
text: 'vendor/plugin-text/text.js',
47+
css: 'app/core/utils/css_loader.js'
4648
},
4749

4850
meta: {

public/vendor/plugin-css/css.js

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
"use strict";
2+
3+
if (typeof window !== 'undefined') {
4+
var waitSeconds = 100;
5+
6+
var head = document.getElementsByTagName('head')[0];
7+
8+
// get all link tags in the page
9+
var links = document.getElementsByTagName('link');
10+
var linkHrefs = [];
11+
for (var i = 0; i < links.length; i++) {
12+
linkHrefs.push(links[i].href);
13+
}
14+
15+
var isWebkit = !!window.navigator.userAgent.match(/AppleWebKit\/([^ ;]*)/);
16+
var webkitLoadCheck = function(link, callback) {
17+
setTimeout(function() {
18+
for (var i = 0; i < document.styleSheets.length; i++) {
19+
var sheet = document.styleSheets[i];
20+
if (sheet.href === link.href) {
21+
return callback();
22+
}
23+
}
24+
webkitLoadCheck(link, callback);
25+
}, 10);
26+
};
27+
28+
var noop = function() {};
29+
30+
var loadCSS = function(url) {
31+
return new Promise(function(resolve, reject) {
32+
var timeout = setTimeout(function() {
33+
reject('Unable to load CSS');
34+
}, waitSeconds * 1000);
35+
var _callback = function(error) {
36+
clearTimeout(timeout);
37+
link.onload = link.onerror = noop;
38+
setTimeout(function() {
39+
if (error) {
40+
reject(error);
41+
}
42+
else {
43+
resolve('');
44+
}
45+
}, 7);
46+
};
47+
var link = document.createElement('link');
48+
link.type = 'text/css';
49+
link.rel = 'stylesheet';
50+
link.href = url;
51+
if (!isWebkit) {
52+
link.onload = function() {
53+
_callback();
54+
}
55+
} else {
56+
webkitLoadCheck(link, _callback);
57+
}
58+
link.onerror = function(event) {
59+
_callback(event.error || new Error('Error loading CSS file.'));
60+
};
61+
head.appendChild(link);
62+
});
63+
};
64+
65+
exports.fetch = function(load) {
66+
// dont reload styles loaded in the head
67+
for (var i = 0; i < linkHrefs.length; i++)
68+
if (load.address == linkHrefs[i])
69+
return '';
70+
return loadCSS(load.address);
71+
};
72+
}

public/vendor/plugin-text/text.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/*
2+
Text plugin
3+
*/
4+
exports.translate = function(load) {
5+
load.metadata.format = 'amd';
6+
return 'def' + 'ine(function() {\nreturn "' + load.source
7+
.replace(/(["\\])/g, '\\$1')
8+
.replace(/[\f]/g, "\\f")
9+
.replace(/[\b]/g, "\\b")
10+
.replace(/[\n]/g, "\\n")
11+
.replace(/[\t]/g, "\\t")
12+
.replace(/[\r]/g, "\\r")
13+
.replace(/[\u2028]/g, "\\u2028")
14+
.replace(/[\u2029]/g, "\\u2029")
15+
+ '";\n});';
16+
}

0 commit comments

Comments
 (0)