-
Notifications
You must be signed in to change notification settings - Fork 27
/
document.js
115 lines (101 loc) · 2.81 KB
/
document.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
103
104
105
106
107
108
109
110
111
112
113
114
115
define("data/document.js", ["ui/editor.js","bodec.js","js-git/lib/modes.js"], function (module, exports) { "use strict";
/*global ace*/
var modelist = ace.require('ace/ext/modelist');
var whitespace = ace.require('ace/ext/whitespace');
var editor = require('ui/editor.js');
var binary = require('bodec.js');
var modes = require('js-git/lib/modes.js');
var recent = [];
var recentIndex = 0;
var current;
var imageTypes = {
png: "image/png",
gif: "image/gif",
jpg: "image/jpeg",
jpeg: "image/jpeg",
svg: "image/svg+xml",
};
// JSHint Options for JavaScript files
var hintOptions = [{
unused: true,
undef: true,
esnext: true,
browser: true,
node: true,
onevar: false,
passfail: false,
maxerr: 100,
multistr: true,
globalstrict: true
}];
module.exports = setDoc;
setDoc.next = next;
setDoc.reset = reset;
function setDoc(row, body) {
if (!row) return editor.setDoc();
var doc = row.doc || (row.doc = { save: save });
doc.row = row;
var ext = row.path.match(/[^.]*$/)[0].toLowerCase();
var imageType = imageTypes[ext];
if (imageType) {
if (doc.session) delete doc.session;
if (doc.hash !== row.hash) {
var blob = new Blob([body], { type: imageType });
doc.url = window.URL.createObjectURL(blob);
}
}
else {
var code = binary.toUnicode(body);
if (doc.url) delete doc.url;
if (!doc.session) {
doc.session = ace.createEditSession(code);
doc.code = code;
doc.session.setTabSize(2);
whitespace.detectIndentation(doc.session);
doc.mode = 0;
}
else if (doc.code !== code) {
doc.session.setValue(code, 1);
doc.code = code;
whitespace.detectIndentation(doc.session);
}
if (doc.mode !== row.mode) {
var aceMode =
/\.rule/.test(row.path) ? "ace/mode/jack" :
/\.gitmodules/.test(row.path) ? "ace/mode/ini" :
/\.webapp/.test(row.path) ? "ace/mode/json" :
row.mode === modes.sym ? "ace/mode/text" :
modelist.getModeForPath(row.path).mode;
doc.session.setMode(aceMode, function () {
if (aceMode !== "ace/mode/javascript") return;
doc.session.$worker.call("setOptions", hintOptions);
});
doc.mode = row.mode;
}
}
doc.hash = row.hash;
current = doc;
reset();
editor.setDoc(doc);
function save(text) {
if (text === doc.code) return;
doc.code = text;
setDoc.updateDoc(row, binary.fromUnicode(text));
}
}
function next() {
if (!recent.length) return;
recentIndex = (recentIndex + 1) % recent.length;
current = recent[recentIndex];
editor.setDoc(current);
setDoc.setActive(current.row.path);
}
function reset() {
if (!current) return;
// Put current at the front of the recent list.
var index = recent.indexOf(current);
if (index >= 0) recent.splice(index, 1);
recent.unshift(current);
recentIndex = 0;
}
});