written 0.0.5 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/LICENSE +8 -0
- data/README.md +63 -0
- data/Rakefile +17 -27
- data/lib/written.rb +0 -8
- data/lib/written/app/assets/images/written/placeholder.png +0 -0
- data/lib/written/app/assets/javascripts/written.coffee +2 -0
- data/lib/written/app/assets/javascripts/written/core/content.coffee +53 -35
- data/lib/written/app/assets/javascripts/written/core/cursor.coffee +33 -12
- data/lib/written/app/assets/javascripts/written/core/document.coffee +16 -11
- data/lib/written/app/assets/javascripts/written/core/extensions/string.coffee +9 -0
- data/lib/written/app/assets/javascripts/written/core/extensions/text.coffee +2 -0
- data/lib/written/app/assets/javascripts/written/core/history.coffee +2 -0
- data/lib/written/app/assets/javascripts/written/core/observer.coffee +6 -2
- data/lib/written/app/assets/javascripts/written/core/stringify.coffee +15 -0
- data/lib/written/app/assets/javascripts/written/parsers/block.coffee +69 -0
- data/lib/written/app/assets/javascripts/written/parsers/block/code.coffee +79 -15
- data/lib/written/app/assets/javascripts/written/parsers/block/heading.coffee +60 -5
- data/lib/written/app/assets/javascripts/written/parsers/block/image.coffee +103 -9
- data/lib/written/app/assets/javascripts/written/parsers/block/olist.coffee +94 -12
- data/lib/written/app/assets/javascripts/written/parsers/block/paragraph.coffee +63 -5
- data/lib/written/app/assets/javascripts/written/parsers/block/quote.coffee +92 -0
- data/lib/written/app/assets/javascripts/written/parsers/block/ulist.coffee +93 -12
- data/lib/written/app/assets/javascripts/written/parsers/inline.coffee +81 -0
- data/lib/written/app/assets/javascripts/written/parsers/inline/code.coffee +57 -0
- data/lib/written/app/assets/javascripts/written/parsers/inline/italic.coffee +40 -7
- data/lib/written/app/assets/javascripts/written/parsers/inline/link.coffee +43 -13
- data/lib/written/app/assets/javascripts/written/parsers/inline/list.coffee +27 -0
- data/lib/written/app/assets/javascripts/written/parsers/inline/strong.coffee +41 -7
- data/lib/written/app/assets/javascripts/written/parsers/parsers.coffee +21 -107
- data/lib/written/app/assets/javascripts/written/polyfills/CustomElements/CustomElements.js +32 -0
- data/lib/written/app/assets/javascripts/written/polyfills/CustomElements/base.js +40 -0
- data/lib/written/app/assets/javascripts/written/polyfills/CustomElements/boot.js +124 -0
- data/lib/written/app/assets/javascripts/written/polyfills/CustomElements/observe.js +318 -0
- data/lib/written/app/assets/javascripts/written/polyfills/CustomElements/register.js +369 -0
- data/lib/written/app/assets/javascripts/written/polyfills/CustomElements/traverse.js +86 -0
- data/lib/written/app/assets/javascripts/written/polyfills/CustomElements/upgrade.js +130 -0
- data/lib/written/app/assets/javascripts/written/polyfills/MutationObserver/MutationObserver.js +575 -0
- data/lib/written/app/assets/javascripts/written/polyfills/WeakMap/WeakMap.js +49 -0
- data/lib/written/app/assets/javascripts/written/polyfills/base.coffee +10 -0
- data/lib/written/app/assets/javascripts/written/polyfills/dom.js +104 -0
- data/lib/written/app/assets/javascripts/written/uploaders/aws.coffee +125 -0
- data/lib/written/app/assets/stylesheets/written.scss +80 -11
- data/lib/written/version.rb +1 -1
- data/test/server/app/assets/javascripts/application.coffee +20 -2
- data/test/server/app/assets/stylesheets/application.scss +2 -2
- data/test/server/app/assets/stylesheets/prism.css +0 -1
- data/test/server/app/views/posts/show.html.erb +10 -3
- metadata +26 -20
- data/lib/written/app/assets/javascripts/written/core/ext.coffee +0 -109
- data/lib/written/app/assets/javascripts/written/core/extensions.coffee +0 -2
- data/lib/written/document.rb +0 -42
- data/lib/written/node.rb +0 -21
- data/lib/written/nodes/code.rb +0 -65
- data/lib/written/nodes/heading.rb +0 -15
- data/lib/written/nodes/image.rb +0 -14
- data/lib/written/nodes/ordered_list.rb +0 -18
- data/lib/written/nodes/unordered_list.rb +0 -19
- data/lib/written/parsers.rb +0 -11
- data/lib/written/parsers/base.rb +0 -26
- data/lib/written/parsers/code.rb +0 -60
- data/lib/written/parsers/heading.rb +0 -19
- data/lib/written/parsers/image.rb +0 -19
- data/lib/written/parsers/link.rb +0 -12
- data/lib/written/parsers/list.rb +0 -33
- data/lib/written/parsers/word.rb +0 -16
@@ -1,16 +1,46 @@
|
|
1
1
|
class Link
|
2
2
|
constructor: (match) ->
|
3
3
|
@match = match
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
@
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
4
|
+
|
5
|
+
index: =>
|
6
|
+
@match.index
|
7
|
+
|
8
|
+
length: =>
|
9
|
+
@match[0].length
|
10
|
+
|
11
|
+
markdown: =>
|
12
|
+
"<a is='written-a' href='javascript:void(0)'><strong>#{@match[1]}</strong>#{@match[3]}</a>".toHTML()
|
13
|
+
|
14
|
+
html: =>
|
15
|
+
"<a href='#{@match[4]}'>#{@match[2]}</a>".toHTML()
|
16
|
+
|
17
|
+
Link.rule = /!{0}(\[([^\]]+)\])(\(([^\)]+)\))/gi
|
18
|
+
|
19
|
+
Written.Parsers.Inline.register Link
|
20
|
+
|
21
|
+
prototype = Object.create(HTMLAnchorElement.prototype)
|
22
|
+
|
23
|
+
prototype.getRange = (offset, walker) ->
|
24
|
+
range = document.createRange()
|
25
|
+
|
26
|
+
if !@firstChild?
|
27
|
+
range.setStart(this, 0)
|
28
|
+
else
|
29
|
+
while walker.nextNode()
|
30
|
+
if walker.currentNode.length < offset
|
31
|
+
offset -= walker.currentNode.length
|
32
|
+
continue
|
33
|
+
|
34
|
+
range.setStart(walker.currentNode, offset)
|
35
|
+
break
|
36
|
+
|
37
|
+
range.collapse(true)
|
38
|
+
range
|
39
|
+
|
40
|
+
prototype.toString = ->
|
41
|
+
@textContent
|
42
|
+
|
43
|
+
document.registerElement('written-a', {
|
44
|
+
prototype: prototype
|
45
|
+
extends: 'a'
|
46
|
+
})
|
@@ -0,0 +1,27 @@
|
|
1
|
+
prototype = Object.create(HTMLLIElement.prototype)
|
2
|
+
|
3
|
+
prototype.getRange = (offset, walker) ->
|
4
|
+
range = document.createRange()
|
5
|
+
|
6
|
+
if !@firstChild?
|
7
|
+
range.setStart(this, 0)
|
8
|
+
else
|
9
|
+
while walker.nextNode()
|
10
|
+
if walker.currentNode.length < offset
|
11
|
+
offset -= walker.currentNode.length
|
12
|
+
continue
|
13
|
+
|
14
|
+
range.setStart(walker.currentNode, offset)
|
15
|
+
break
|
16
|
+
|
17
|
+
range.collapse(true)
|
18
|
+
range
|
19
|
+
|
20
|
+
prototype.toString = ->
|
21
|
+
@textContent
|
22
|
+
|
23
|
+
document.registerElement('written-li', {
|
24
|
+
prototype: prototype
|
25
|
+
extends: 'li'
|
26
|
+
})
|
27
|
+
|
@@ -1,12 +1,46 @@
|
|
1
1
|
class Strong
|
2
2
|
constructor: (match) ->
|
3
3
|
@match = match
|
4
|
-
@node = "<strong>".toHTML()
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
strong.splitText(@match[0].length)
|
9
|
-
@node.appendChild(document.createTextNode(@match[0]))
|
10
|
-
textNode.parentElement.replaceChild(@node, strong)
|
5
|
+
index: =>
|
6
|
+
@match.index
|
11
7
|
|
12
|
-
|
8
|
+
length: =>
|
9
|
+
@match[0].length
|
10
|
+
|
11
|
+
markdown: =>
|
12
|
+
"<strong is='written-strong'>#{@match[0]}</strong>".toHTML()
|
13
|
+
|
14
|
+
html: =>
|
15
|
+
"<strong>#{@match[3]}</strong>".toHTML()
|
16
|
+
|
17
|
+
Strong.rule = /((\*{1})([^\*]+)(\*{1}))/gi
|
18
|
+
|
19
|
+
Written.Parsers.Inline.register Strong
|
20
|
+
|
21
|
+
prototype = Object.create(HTMLElement.prototype)
|
22
|
+
|
23
|
+
prototype.getRange = (offset, walker) ->
|
24
|
+
range = document.createRange()
|
25
|
+
|
26
|
+
if !@firstChild?
|
27
|
+
range.setStart(this, 0)
|
28
|
+
else
|
29
|
+
while walker.nextNode()
|
30
|
+
if walker.currentNode.length < offset
|
31
|
+
offset -= walker.currentNode.length
|
32
|
+
continue
|
33
|
+
|
34
|
+
range.setStart(walker.currentNode, offset)
|
35
|
+
break
|
36
|
+
|
37
|
+
range.collapse(true)
|
38
|
+
range
|
39
|
+
|
40
|
+
prototype.toString = ->
|
41
|
+
@textContent
|
42
|
+
|
43
|
+
document.registerElement('written-strong', {
|
44
|
+
prototype: prototype
|
45
|
+
extends: 'strong'
|
46
|
+
})
|
@@ -1,113 +1,27 @@
|
|
1
|
-
Written.Parsers
|
2
|
-
freeze: ->
|
3
|
-
Written.Parsers.Block.freeze()
|
4
|
-
Written.Parsers.Inline.freeze()
|
5
|
-
}
|
6
|
-
|
7
|
-
Written.Parsers.Block = new class
|
8
|
-
constructor: ->
|
9
|
-
@parsers = []
|
10
|
-
|
11
|
-
freeze: ->
|
12
|
-
@parsers.push this.defaultParser
|
13
|
-
|
14
|
-
Object.freeze(this)
|
15
|
-
Object.freeze(@parsers)
|
16
|
-
|
17
|
-
get: (name) ->
|
18
|
-
parser = @parsers.find (parser) ->
|
19
|
-
parser.parser.name.localeCompare(name) == 0
|
20
|
-
|
21
|
-
if parser
|
22
|
-
parser.parser
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
register: (parser, rule, defaultParser = false) ->
|
27
|
-
if defaultParser
|
28
|
-
this.defaultParser = {
|
29
|
-
rule: rule,
|
30
|
-
parser: parser
|
31
|
-
}
|
32
|
-
else
|
33
|
-
@parsers.push {
|
34
|
-
rule: rule,
|
35
|
-
parser: parser
|
36
|
-
}
|
37
|
-
|
38
|
-
parse: (lines) =>
|
39
|
-
elements = []
|
40
|
-
currentNode = undefined
|
41
|
-
while (line = lines.pop()) != undefined
|
42
|
-
str = line.toString()
|
43
|
-
if !currentNode
|
44
|
-
parser = @find(str)
|
45
|
-
currentNode = parser.render(str)
|
46
|
-
elements.push(currentNode)
|
47
|
-
continue
|
48
|
-
|
49
|
-
if currentNode.dataset.status != 'opened'
|
50
|
-
parser = @find(str)
|
51
|
-
currentNode.nextDocumentNode = parser.render(str)
|
52
|
-
currentNode = currentNode.nextDocumentNode
|
53
|
-
currentNode.writtenNodeParser = parser
|
54
|
-
elements.push(currentNode)
|
55
|
-
continue
|
56
|
-
else if currentNode.writtenNodeParser.valid(str)
|
57
|
-
currentNode.writtenNodeParser.render(str)
|
58
|
-
continue
|
59
|
-
else
|
60
|
-
parser = @find(str)
|
61
|
-
currentNode.nextDocumentNode = parser.render(str)
|
62
|
-
currentNode = currentNode.nextDocumentNode
|
63
|
-
currentNode.writtenNodeParser = parser
|
64
|
-
elements.push(currentNode)
|
65
|
-
|
66
|
-
elements[0]
|
67
|
-
|
68
|
-
find: (str) ->
|
69
|
-
parser = undefined
|
70
|
-
for p in @parsers
|
71
|
-
if match = p.rule.exec(str)
|
72
|
-
parser = new p.parser(match)
|
73
|
-
break
|
74
|
-
|
75
|
-
return parser
|
76
|
-
|
77
|
-
|
78
|
-
Written.Parsers.Inline = new class
|
1
|
+
class @Written.Parsers
|
79
2
|
constructor: ->
|
80
|
-
@
|
81
|
-
|
82
|
-
freeze: ->
|
83
|
-
Object.freeze(this)
|
84
|
-
Object.freeze(@parsers)
|
3
|
+
@block = new Written.Parsers.Block()
|
4
|
+
@inline = new Written.Parsers.Inline()
|
85
5
|
|
86
|
-
|
87
|
-
|
88
|
-
|
6
|
+
use: (type, name) ->
|
7
|
+
if type != 'block' && type != 'inline'
|
8
|
+
raise 'error: Written.Parsers can either be "block" or "inline"'
|
9
|
+
return
|
89
10
|
|
90
|
-
|
91
|
-
parser.parser
|
11
|
+
@[type].use(name)
|
92
12
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
parser: parser
|
13
|
+
available: ->
|
14
|
+
{
|
15
|
+
block: Written.Parsers.Block.parsers.available,
|
16
|
+
inline: Written.Parsers.Inline.parsers.available
|
98
17
|
}
|
99
18
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
isLeafNode: (node) ->
|
111
|
-
if node.children.length == 0
|
112
|
-
return NodeFilter.FILTER_ACCEPT
|
113
|
-
|
19
|
+
freeze: ->
|
20
|
+
@block.freeze()
|
21
|
+
@inline.freeze()
|
22
|
+
|
23
|
+
@Written.Parsers.default = ->
|
24
|
+
parsers = new Written.Parsers()
|
25
|
+
parsers.use('inline', 'all')
|
26
|
+
parsers.use('block', 'all')
|
27
|
+
parsers
|
@@ -0,0 +1,32 @@
|
|
1
|
+
/**
|
2
|
+
* @license
|
3
|
+
* Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
|
4
|
+
* This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
|
5
|
+
* The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
|
6
|
+
* The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
|
7
|
+
* Code distributed by Google as part of the polymer project is also
|
8
|
+
* subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
9
|
+
*/
|
10
|
+
(function() {
|
11
|
+
|
12
|
+
// Establish polyfill scope. We do this here to store flags. Flags are not
|
13
|
+
// supported in the build.
|
14
|
+
window.CustomElements = window.CustomElements || {flags:{}};
|
15
|
+
|
16
|
+
// Flags. Convert url arguments to flags
|
17
|
+
var flags = {};
|
18
|
+
if (!flags.noOpts) {
|
19
|
+
location.search.slice(1).split('&').forEach(function(option) {
|
20
|
+
var parts = option.split('=');
|
21
|
+
var match;
|
22
|
+
if (parts[0] && (match = parts[0].match(/wc-(.+)/))) {
|
23
|
+
flags[match[1]] = parts[1] || true;
|
24
|
+
}
|
25
|
+
});
|
26
|
+
}
|
27
|
+
|
28
|
+
|
29
|
+
// exports
|
30
|
+
window.CustomElements.flags = flags;
|
31
|
+
|
32
|
+
})();
|
@@ -0,0 +1,40 @@
|
|
1
|
+
/**
|
2
|
+
* @license
|
3
|
+
* Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
|
4
|
+
* This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
|
5
|
+
* The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
|
6
|
+
* The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
|
7
|
+
* Code distributed by Google as part of the polymer project is also
|
8
|
+
* subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
9
|
+
*/
|
10
|
+
window.CustomElements = window.CustomElements || {flags:{}};
|
11
|
+
|
12
|
+
(function(scope) {
|
13
|
+
|
14
|
+
// imports
|
15
|
+
var flags = scope.flags;
|
16
|
+
|
17
|
+
// world's simplest module initializer
|
18
|
+
var modules = [];
|
19
|
+
var addModule = function(module) {
|
20
|
+
modules.push(module);
|
21
|
+
};
|
22
|
+
|
23
|
+
var initializeModules = function() {
|
24
|
+
modules.forEach(function(module) {
|
25
|
+
module(scope);
|
26
|
+
});
|
27
|
+
};
|
28
|
+
|
29
|
+
// exports
|
30
|
+
scope.addModule = addModule;
|
31
|
+
scope.initializeModules = initializeModules;
|
32
|
+
scope.hasNative = Boolean(document.registerElement);
|
33
|
+
scope.isIE = /Trident/.test(navigator.userAgent);
|
34
|
+
|
35
|
+
// NOTE: For consistent timing, use native custom elements only when not
|
36
|
+
// polyfilling other key related web components features.
|
37
|
+
scope.useNative = !flags.register && scope.hasNative &&
|
38
|
+
!window.ShadowDOMPolyfill && (!window.HTMLImports || window.HTMLImports.useNative);
|
39
|
+
|
40
|
+
})(window.CustomElements);
|
@@ -0,0 +1,124 @@
|
|
1
|
+
/**
|
2
|
+
* @license
|
3
|
+
* Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
|
4
|
+
* This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
|
5
|
+
* The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
|
6
|
+
* The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
|
7
|
+
* Code distributed by Google as part of the polymer project is also
|
8
|
+
* subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
9
|
+
*/
|
10
|
+
(function(scope){
|
11
|
+
|
12
|
+
// imports
|
13
|
+
var useNative = scope.useNative;
|
14
|
+
var initializeModules = scope.initializeModules;
|
15
|
+
|
16
|
+
var isIE = scope.isIE;
|
17
|
+
|
18
|
+
// If native, setup stub api and bail.
|
19
|
+
// NOTE: we fire `WebComponentsReady` under native for api compatibility
|
20
|
+
if (useNative) {
|
21
|
+
// stub
|
22
|
+
var nop = function() {};
|
23
|
+
|
24
|
+
// exports
|
25
|
+
scope.watchShadow = nop;
|
26
|
+
scope.upgrade = nop;
|
27
|
+
scope.upgradeAll = nop;
|
28
|
+
scope.upgradeDocumentTree = nop;
|
29
|
+
scope.upgradeSubtree = nop;
|
30
|
+
scope.takeRecords = nop;
|
31
|
+
|
32
|
+
scope.instanceof = function(obj, base) {
|
33
|
+
return obj instanceof base;
|
34
|
+
};
|
35
|
+
|
36
|
+
} else {
|
37
|
+
// Initialize polyfill modules. Note, polyfill modules are loaded but not
|
38
|
+
// executed; this is a convenient way to control which modules run when
|
39
|
+
// the polyfill is required and allows the polyfill to load even when it's
|
40
|
+
// not needed.
|
41
|
+
initializeModules();
|
42
|
+
}
|
43
|
+
|
44
|
+
// imports
|
45
|
+
var upgradeDocumentTree = scope.upgradeDocumentTree;
|
46
|
+
var upgradeDocument = scope.upgradeDocument;
|
47
|
+
|
48
|
+
// ShadowDOM polyfill wraps elements but some elements like `document`
|
49
|
+
// cannot be wrapped so we help the polyfill by wrapping some elements.
|
50
|
+
if (!window.wrap) {
|
51
|
+
if (window.ShadowDOMPolyfill) {
|
52
|
+
window.wrap = window.ShadowDOMPolyfill.wrapIfNeeded;
|
53
|
+
window.unwrap = window.ShadowDOMPolyfill.unwrapIfNeeded;
|
54
|
+
} else {
|
55
|
+
window.wrap = window.unwrap = function(node) {
|
56
|
+
return node;
|
57
|
+
};
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
// eagarly upgrade imported documents
|
62
|
+
if (window.HTMLImports) {
|
63
|
+
window.HTMLImports.__importsParsingHook = function(elt) {
|
64
|
+
if (elt.import) {
|
65
|
+
upgradeDocument(wrap(elt.import));
|
66
|
+
}
|
67
|
+
};
|
68
|
+
}
|
69
|
+
|
70
|
+
// bootstrap parsing
|
71
|
+
function bootstrap() {
|
72
|
+
// one more upgrade to catch out of order registrations
|
73
|
+
upgradeDocumentTree(window.wrap(document));
|
74
|
+
// install upgrade hook if HTMLImports are available
|
75
|
+
// set internal 'ready' flag, now document.registerElement will trigger
|
76
|
+
// synchronous upgrades
|
77
|
+
window.CustomElements.ready = true;
|
78
|
+
// async to ensure *native* custom elements upgrade prior to this
|
79
|
+
// DOMContentLoaded can fire before elements upgrade (e.g. when there's
|
80
|
+
// an external script)
|
81
|
+
// Delay doubly to help workaround
|
82
|
+
// https://code.google.com/p/chromium/issues/detail?id=516550.
|
83
|
+
// CustomElements must use requestAnimationFrame in attachedCallback
|
84
|
+
// to query style/layout data. The WebComponentsReady event is intended
|
85
|
+
// to convey overall readiness, which ideally should be after elements
|
86
|
+
// are attached. Adding a slight extra delay to WebComponentsReady
|
87
|
+
// helps preserve this guarantee.
|
88
|
+
var requestAnimationFrame = window.requestAnimationFrame || function(f) {
|
89
|
+
setTimeout(f, 16);
|
90
|
+
};
|
91
|
+
requestAnimationFrame(function() {
|
92
|
+
setTimeout(function() {
|
93
|
+
// capture blunt profiling data
|
94
|
+
window.CustomElements.readyTime = Date.now();
|
95
|
+
if (window.HTMLImports) {
|
96
|
+
window.CustomElements.elapsed = window.CustomElements.readyTime - window.HTMLImports.readyTime;
|
97
|
+
}
|
98
|
+
// notify the system that we are bootstrapped
|
99
|
+
document.dispatchEvent(
|
100
|
+
new CustomEvent('WebComponentsReady', {bubbles: true})
|
101
|
+
);
|
102
|
+
});
|
103
|
+
});
|
104
|
+
}
|
105
|
+
|
106
|
+
// When loading at readyState complete time (or via flag), boot custom elements
|
107
|
+
// immediately.
|
108
|
+
// If relevant, HTMLImports must already be loaded.
|
109
|
+
if (document.readyState === 'complete' || scope.flags.eager) {
|
110
|
+
bootstrap();
|
111
|
+
// When loading at readyState interactive time, bootstrap only if HTMLImports
|
112
|
+
// are not pending. Also avoid IE as the semantics of this state are unreliable.
|
113
|
+
} else if (document.readyState === 'interactive' && !window.attachEvent &&
|
114
|
+
(!window.HTMLImports || window.HTMLImports.ready)) {
|
115
|
+
bootstrap();
|
116
|
+
// When loading at other readyStates, wait for the appropriate DOM event to
|
117
|
+
// bootstrap.
|
118
|
+
} else {
|
119
|
+
var loadEvent = window.HTMLImports && !window.HTMLImports.ready ?
|
120
|
+
'HTMLImportsLoaded' : 'DOMContentLoaded';
|
121
|
+
window.addEventListener(loadEvent, bootstrap);
|
122
|
+
}
|
123
|
+
|
124
|
+
})(window.CustomElements);
|