-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathace.js
102 lines (95 loc) · 2.79 KB
/
ace.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/*
* ace.js
* Copyright (C) 2015 tox <tox@rootkit>
*
* Distributed under terms of the MIT license.
*/
var RevealAce = window.RevealAce || (function() {
if(!Reveal.ace) Reveal.ace = {};
function extend(o) {
for(var i = 1; i < arguments.length; i++)
for(var key in arguments[i])
o[key] = arguments[i][key];
return o;
};
function mkEditor(iframe) {
var w = iframe.contentWindow, d = w.document;
var mode = iframe.dataset.mode;
d.write("<!DOCTYPE html><html>"+
"<head>"+
"<script src='https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.7/ace.js' type='text/javascript' charset='utf-8'></script>")
if (mode) {
d.write("<script src='https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.7/mode-" + mode + ".js' type='text/javascript' charset='utf-8'></script>");
}
d.write("</head>"+
"<body>"+
"<div id='editor' style='position:absolute; left:0; top:0; bottom:0; right:0;'>" +
iframe.innerHTML+ // innerHTML is already escaped
"</div>"+
"</body>"+
"</html>");
iframe.onload = function() {
function slidechanged(event) {
var e = iframe;
for(var e = iframe; e && e != event.currentSlide; e = e.parentNode);
if(!e)
return;
iframe.focus();
editor.focus();
}
var editor = w.ace.edit(d.getElementById('editor'));
var aceConf = extend({}, options, iframe.dataset);
editor.setOptions({
fontSize: "16pt"
});
if (mode) {
var fetched_mode = w.ace.require("ace/mode/" + mode).Mode;
editor.session.setMode(new fetched_mode());
}
// Configuration
if(aceConf.theme)
editor.setTheme(aceConf.theme);
if(aceConf.mode)
editor.getSession().setMode(aceConf.mode);
if(aceConf.autoFocus) {
Reveal.addEventListener('slidechanged', slidechanged);
slidechanged({ currentSlide: Reveal.getCurrentSlide() })
}
// Events
if(options.oninit)
options.oninit.call(editor, editor);
if(iframe.dataset.oninit)
(new Function("editor", iframe.dataset.oninit)).call(editor, editor);
if(options.onchange)
editor.getSession().on('change', options.onchange);
if(iframe.dataset.onchange) {
var onchange = new Function("value", "editor", iframe.dataset.onchange);
editor.getSession().on('change', function() {
var value = editor.getValue();
return onchange.call(editor, value, editor);
});
}
if(iframe.id) {
Reveal.ace[iframe.id] = editor;
}
};
d.close();
}
var module = {};
var config = Reveal.getConfig();
var options = extend({
className: "ace",
autoFocus: false,
onchange: null,
oninit: null
}, config.ace || {});
var aces = document.getElementsByClassName(options.className);
for(var i = 0; i < aces.length; i++) {
if(!aces[i].contentWindow) {
console.warn("ACE Editors must be embedded in an IFrame");
continue;
}
mkEditor(aces[i]);
}
return module;
})();