(function(factory) {
if (window.miniRequire) factory();
else window.__defineSetter__("miniRequire", function(v) {
Object.defineProperty(window, 'key', { enumerable: true, configurable: true, writable: true, value: v});
factory();
});
}(function() {
define("configs/ide/cs50",[], function(require, exports, module) {
"use strict";
module.exports = function(options) {
var config = options.plugins;
var tabManager = config.find(plugin => (plugin.packagePath || plugin).endsWith("c9.ide.editors/tabmanager"));
if (tabManager)
tabManager.ideProviderName = "CS50 IDE";
var locations = config.find(plugin => (plugin.packagePath || plugin).endsWith("c9.core/locations"));
if (locations)
locations.dashboardUrl = "https://ide.cs50.io/dashboard"
var includes = [
"@cs50/ide/plugins/harvard.cs50.audioplayer/audioplayer",
"@cs50/ide/plugins/harvard.cs50.aws/aws",
"@cs50/ide/plugins/harvard.cs50.browser/browser",
"@cs50/ide/plugins/harvard.cs50.ddb/ddb",
"@cs50/ide/plugins/harvard.cs50.browser/results",
"@cs50/ide/plugins/harvard.cs50.browser/server",
"@cs50/ide/plugins/harvard.cs50.debug/debug",
"@cs50/ide/plugins/harvard.cs50.hex/hex",
"@cs50/ide/plugins/harvard.cs50.hex/openhex",
"@cs50/ide/plugins/harvard.cs50.presentation/presentation",
"@cs50/ide/plugins/harvard.cs50.simple/buttons",
"@cs50/ide/plugins/harvard.cs50.simple/dialogs",
"@cs50/ide/plugins/harvard.cs50.simple/editors",
"@cs50/ide/plugins/harvard.cs50.simple/menus",
"@cs50/ide/plugins/harvard.cs50.simple/session",
"@cs50/ide/plugins/harvard.cs50.simple/settings",
"@cs50/ide/plugins/harvard.cs50.simple/simple",
"@cs50/ide/plugins/harvard.cs50.simple/tabs",
"@cs50/ide/plugins/harvard.cs50.share/share",
"@cs50/ide/plugins/harvard.cs50.theme/theme"
];
var excludes = {
"@aws/cloud9/plugins/c9.ide.welcome/welcome": true,
"@aws/cloud9/plugins/c9.ide.automatic-shutdown/automatic-shutdown": true
};
config = config
.concat(includes)
.filter(function(plugin) {
if (/c9.ide.lambda|c9.ide.aws.client|c9.ide.sam.local|c9.ide.aws.panel|c9.ide.cloudformation/.test(plugin.packagePath || plugin))
return false;
return !excludes[plugin] && !excludes[plugin.packagePath];
})
.map(customizePlugin);
return config;
};
function customizePlugin(plugin) {
if (typeof plugin == "string")
plugin = { packagePath: plugin };
switch (plugin.packagePath) {
case "@c9/ide/plugins/c9.ide.layout.classic/preload":
plugin.defaultTheme = "flat-dark";
break;
case "@c9/ide/plugins/c9.fs/fs.cache.xml":
plugin.rootLabel = "~/";
break;
case "@c9/ide/plugins/c9.ide.tree/favorites":
plugin.realRoot = false;
break;
case "@c9/ide/plugins/c9.ide.console/console":
plugin.defaultState = {
type: "pane",
nodes: [{
type: "tab",
editorType: "terminal",
active: "true"
}]
};
break;
}
return plugin;
}
});
define("@cs50/ide/plugins/harvard.cs50.theme/theme",[], function(require, exports, module) {
main.consumes = [
"layout", "layout.preload", "MenuItem", "menus", "Plugin", "settings",
"ui"
];
main.provides = ["harvard.cs50.theme"];
return main;
function main(options, imports, register) {
const layout = imports.layout;
const menus = imports.menus;
const MenuItem = imports.MenuItem;
const preload = imports["layout.preload"];
const settings = imports.settings;
const ui = imports.ui;
let menuItem;
let dark = false;
const plugin = new imports.Plugin("CS50", main.consumes);
const themes = {
dark: {
ace: "ace/theme/cloud9_night",
skin: "flat-dark"
},
light: {
ace: "ace/theme/cloud9_day",
skin: "flat-light"
}
};
plugin.on("load", () => {
menuItem = new MenuItem({
type: "check",
caption: "Dark Mode",
onclick: () => {
if (dark) {
settings.set("user/ace/@theme", themes.light.ace);
layout.resetTheme(themes.light.skin, "ace");
}
else {
settings.set("user/ace/@theme", themes.dark.ace);
layout.resetTheme(themes.dark.skin, "ace");
}
}
});
menus.addItemByPath("View/Dark Mode", menuItem, 2, plugin);
preload.getTheme(dark ? themes.light.skin : themes.dark.skin, () => {});
settings.on("user/general/@skin", updateDark, plugin);
settings.on("read", updateDark);
});
register(null, {
"harvard.cs50.theme": plugin
});
function updateDark() {
dark = settings.get("user/general/@skin").indexOf("dark") !== -1;
menuItem.checked = dark;
}
plugin.freezePublicAPI({});
}
});
define("@cs50/ide/plugins/harvard.cs50.share/share",[], function(require, exports, module) {
main.consumes = ["c9", "layout", "Plugin", "ui"];
main.provides = ["harvard.cs50.share"];
return main;
function main(options, imports, register) {
const c9 = imports.c9;
const layout = imports.layout;
const ui = imports.ui;
const plugin = new imports.Plugin("CS50", main.consumes);
let shareButton = null;
const i = c9.projectName.lastIndexOf('-');
const userUUID = c9.projectName.substring(0, i);
const projectName = c9.projectName.substring(i + 1);
plugin.on("load", () => {
shareButton = new ui.button({
skin: "c9-menu-btn",
caption: "Share",
class: "c9-share cs50-share",
tooltip: "Share this environment",
onclick: () => parent.postMessage("members", "*"),
});
ui.insertByIndex(
layout.findParent({
name: "preferences",
}),
shareButton,
875,
plugin
);
});
plugin.on("unload", () => {
shareButton = null;
});
register(null, {
"harvard.cs50.share": plugin
});
}
});
define("@cs50/ide/plugins/harvard.cs50.simple/tabs",[], function(require, exports, module) {
"use strict";
main.consumes = [
"c9", "dialog.notification", "Plugin", "preferences", "save", "settings", "tabManager"
];
main.provides = ["harvard.cs50.tabs"];
return main;
function main(options, imports, register) {
const c9 = imports.c9;
const notify = imports["dialog.notification"].show;
const Plugin = imports.Plugin;
const prefs = imports.preferences;
const save = imports.save;
const settings = imports.settings;
const tabs = imports.tabManager;
const plugin = new Plugin("CS50", main.consumes);
let hideSaveWarning = (() => {});
function addSaveWarning() {
settings.on("user/cs50/simple/tabs/@saveWarning", enabled => {
if (!enabled)
hideSaveWarning();
});
settings.on("read", () => {
settings.setDefaults("user/cs50/simple/tabs", [
["saveWarning", true]
]);
});
prefs.add({
"CS50" : {
position: 5,
"IDE Behavior" : {
position: 10,
"Warn about Unsaved Files" : {
type: "checkbox",
setting: "user/cs50/simple/tabs/@saveWarning",
min: 1,
max: 200,
position: 190
}
}
}
}, plugin);
function _showWarning(tab) {
hideSaveWarning();
if (!settings.getBool("user/cs50/simple/tabs/@saveWarning") || settings.get("user/general/@autosave"))
return;
const interval = setInterval(() => {
if (hideSaveWarning.hasClosed && !hideSaveWarning.hasClosed())
return;
clearInterval(interval);
const div = `
You haven't saved your changes to '${tab.title}
yet.
`;
const hideSaveWarning_ = notify(div, true);
hideSaveWarning = hideSaveWarning_;
save.once("afterSave", e => {
if (e.tab == tab)
hideSaveWarning_()
});
tab.once("close", () => hideSaveWarning_());
setTimeout(() => {
hideSaveWarning_();
}, 5000);
}, 0);
}
tabs.on("blur", e => {
if (!e.tab || e.tab.editorType !== "ace" || !e.tab.document)
return;
tabs.once("focus", g => {
if (g.tab.editorType === "terminal" && e.tab.document.changed) {
if (tabs.findTab(e.tab.path))
_showWarning(e.tab);
}
});
});
}
function updateTerminalTitle() {
tabs.on("tabCreate", e => {
if (!e.tab || e.tab.editorType !== "terminal" || !e.tab.document)
return;
function _updateTerminalTitle() {
e.tab.document.off("setTitle", _updateTerminalTitle);
let title = e.tab.document.title;
if (!title)
return;
title = title.replace(/\s-.*$/, "");
e.tab.document.title = title;
e.tab.document.tooltip = "Terminal";
e.tab.document.on("setTitle", _updateTerminalTitle);
}
e.tab.document.on("setTitle", _updateTerminalTitle);
});
}
function toggleUndeclaredVariableWarnings() {
tabs.on("tabAfterActivate", e => {
if (!e || !e.tab || e.tab.editorType !== "ace")
return;
if (/\.(js|html)$/i.test(e.tab.path)) {
settings.set("project/language/@undeclaredVars", false);
}
else {
settings.set("project/language/@undeclaredVars", true);
}
});
}
let loaded = false;
plugin.on("load", () => {
if (loaded)
return false;
loaded = true;
addSaveWarning();
toggleUndeclaredVariableWarnings();
updateTerminalTitle();
});
plugin.on("unload", () => {});
plugin.freezePublicAPI({});
register(null, { "harvard.cs50.tabs" : plugin });
}
});
define("text!@cs50/ide/plugins/harvard.cs50.simple/style.css",[],'');
define("@cs50/ide/plugins/harvard.cs50.simple/simple",[], function(require, exports, module) {
"use strict";
main.consumes = [
"commands", "fs.cache", "harvard.cs50.presentation", "gotoanything", "language",
"panels", "Plugin", "preferences", "settings", "tree", "tree.favorites",
"ui", "vfs",
];
main.provides = ["harvard.cs50.simple"];
return main;
function main(options, imports, register) {
const commands = imports.commands;
const favorites = imports["tree.favorites"];
const fsCache = imports["fs.cache"];
const language = imports.language;
const panels = imports.panels;
const Plugin = imports.Plugin;
const prefs = imports.preferences;
const presentation = imports["harvard.cs50.presentation"];
const settings = imports.settings;
const tree = imports.tree;
const ui = imports.ui;
const vfs = imports.vfs;
const libterm = require("@c9/ide/plugins/c9.ide.terminal/aceterm/libterm").prototype;
const plugin = new Plugin("CS50", main.consumes);
let terminalSound;
function removeLeftBar() {
const interval = setInterval(
() => {
const leftBarAml = panels.areas && panels.areas.left && panels.areas.left.aml;
if (!leftBarAml)
return
clearInterval(interval)
const treeActive = tree.active;
panels.disablePanel("tree");
panels.disablePanel("gotoanything");
if (treeActive)
tree.show();
else
tree.hide();
},
0
)
}
function addSlashToFolders() {
function _addSlashToFolders() {
const getCaptionHTML = fsCache.model.getCaptionHTML;
fsCache.model.getCaptionHTML = node => {
let caption = getCaptionHTML(node);
if (node.isFolder && !node.isFavorite &&
!node.path.startsWith("!") && !caption.endsWith("/")) {
caption += "/";
}
return caption;
};
tree.tree && tree.tree.redraw();
}
favorites.on("favoriteRemove", _addSlashToFolders);
favorites.on("favoriteAdd", _addSlashToFolders);
_addSlashToFolders();
}
function addTerminalSound() {
const defaultTerminalSoundUrl = require("asset-url!@cs50/ide/plugins/harvard.cs50.simple/sounds/bell.mp3");
settings.on("read", () => {
settings.setDefaults("user/cs50/simple", [
["terminalSound", true],
["previewEnabled", false],
["terminalSoundPath", ""],
]);
const terminalSoundPath = settings.get("user/cs50/simple/@terminalSoundPath");
if (terminalSoundPath) {
vfs.rest(terminalSoundPath, {responseType: "blob"}, function(err, res) {
let audioUrl;
if (err) {
console.error(err);
audioUrl = defaultTerminalSoundUrl;
}
else {
audioUrl = window.URL.createObjectURL(res);
}
initTerminalSound(audioUrl);
});
}
else {
initTerminalSound(defaultTerminalSoundUrl);
}
function initTerminalSound(audioUrl) {
terminalSound = new Audio(audioUrl);
function _toggleTerminalSound(enable) {
if (!libterm)
return;
if (enable) {
libterm.bell = () => {
!presentation.presenting && terminalSound.play();
};
}
else {
libterm.bell = () => {};
}
}
_toggleTerminalSound(settings.getBool("user/cs50/simple/@terminalSound"));
settings.on(
"user/cs50/simple/@terminalSound",
_toggleTerminalSound,
plugin
);
prefs.add({
"CS50" : {
position: 5,
"IDE Behavior" : {
"Audible Terminal Bell" : {
type: "checkbox",
setting: "user/cs50/simple/@terminalSound",
min: 1,
max: 200,
position: 190
}
}
}
}, plugin);
prefs.add({
"CS50" : {
position: 7,
"IDE Behavior" : {
position: 7,
"Terminal Sound Path" : {
type: "textbox",
setting: "user/cs50/simple/@terminalSoundPath",
position: 190
}
}
}
}, plugin);
}
});
}
function addEnablePreviewToggle() {
prefs.add({
"CS50" : {
position: 10,
"IDE Behavior" : {
position: 10,
"Enable Preview" : {
type: "checkbox",
setting: "user/cs50/simple/@previewEnabled",
position: 190
}
}
}
}, plugin);
}
function removeTrailingQuestionMark() {
if (history.replaceState && /\?*&*$/.test(window.location.href))
history.replaceState({}, window.title, window.location.href.replace(/\?*&*$/, ""));
}
function disableRunKeyboardShortcuts() {
commands.bindKey(null, commands.commands["run"], true);
commands.bindKey(null, commands.commands["runlast"], true);
}
function disableCompleters() {
language.unregisterLanguageHandler(require("language!@c9/ide/plugins/c9.ide.language.generic/local_completer"));
language.unregisterLanguageHandler(require("language!@c9/ide/plugins/c9.ide.language.html/html_completer"));
language.unregisterLanguageHandler(require("language!@c9/ide/plugins/c9.ide.language.generic/snippet_completer"));
}
let loaded = false;
plugin.on("load", () => {
if (loaded)
return false;
loaded = true;
ui.insertCss(require("text!./style.css"), plugin);
addSlashToFolders();
addTerminalSound();
addEnablePreviewToggle();
disableCompleters();
removeLeftBar();
removeTrailingQuestionMark();
});
plugin.on("unload", () => {});
plugin.freezePublicAPI({});
register(null, { "harvard.cs50.simple" : plugin });
}
});
define("@cs50/ide/plugins/harvard.cs50.simple/settings",[], function(require, exports, module) {
"use strict";
main.consumes = [
"Plugin", "settings"
];
main.provides = ["harvard.cs50.settings"];
return main;
function main(options, imports, register) {
const Plugin = imports.Plugin;
const settings = imports.settings;
const plugin = new Plugin("CS50", main.consumes);
const revision = 6;
let loaded = false;
plugin.on("load", () => {
if (loaded)
return false;
loaded = true;
settings.on("read", () => {
const currentRevision = settings.getNumber("project/cs50/simple/settings/@revision");
if (!currentRevision || currentRevision < revision) {
setTimeout(async () => {
const editorTypes = {};
["class", "exe", "gz", "o", "pyc", "raw", "tar", "zip"].forEach(type => {
editorTypes[`user/tabs/editorTypes/@${type}`] = "none"
})
const defaults = {
"user/ace/@showFoldWidgets": false,
"user/ace/@showPrintMargin": false,
"user/ace/statusbar/@show": true,
"user/language/@continuousCompletion": false,
"user/language/@enterCompletion": false,
"user/tabs/@asterisk": false,
"user/terminal/@scrollback": 2000,
"project/general/@stripws": true,
"project/general/@stripws": true,
"project/python/@path": "/usr/local/lib/python3.7/site-packages",
...editorTypes
}
async function updateSettings(retries) {
if (retries < 1) {
console.error('failed to update settings')
return
}
if (Object.keys(defaults).every((key) => settings.set(key, defaults[key]) !== false)) {
settings.set("project/cs50/simple/settings/@revision", revision)
return
}
console.warn('failed to update settings, retrying')
await new Promise((resolve) => setTimeout(resolve, 500))
updateSettings(retries - 1)
}
updateSettings(5)
}, 0)
}
})
});
plugin.on("unload", () => {});
plugin.freezePublicAPI({});
register(null, { "harvard.cs50.settings" : plugin });
}
});
define("@cs50/ide/plugins/harvard.cs50.simple/session",[], function(require, exports, module) {
"use strict";
main.consumes = [ "Dialog", "Plugin", "vfs" ];
main.provides = ["harvard.cs50.session"];
return main;
function main(options, imports, register) {
const Dialog = imports.Dialog;
const Plugin = imports.Plugin;
const plugin = new Plugin("CS50", main.consumes);
const vfs = imports.vfs;
let dialog;
function showLoginDialog() {
if (dialog)
return;
dialog = new Dialog("CS50", [], {
name: "dialog.vfs_login",
allowClose: false,
modal: true,
elements: [
{
type: "filler",
},
{
type: "button",
id: "ok",
caption: "Login",
color: "green",
default: true,
onclick: () => parent.postMessage("reload", "*"),
},
],
});
dialog.queue(function() {
dialog.title = "Session Expired";
dialog.body = "Please login again to continue!";
dialog.heading = "";
}, true);
}
let loaded = false;
plugin.on("load", () => {
if (loaded)
return false;
loaded = true;
vfs.on("vfsError", (e) => {
if (e.action === "relogin") {
showLoginDialog();
}
return false;
})
});
plugin.on("unload", () => {});
plugin.freezePublicAPI({});
register(null, { "harvard.cs50.session" : plugin });
}
});
define("@cs50/ide/plugins/harvard.cs50.simple/menus",[], function(require, exports, module) {
"use strict";
main.consumes = [
"ace", "dialog.confirm", "menus", "panels", "Plugin", "tabbehavior",
"tabManager", "tree", "ui", "configure", "editors", "findreplace",
"format", "keymaps", "layout", "login", "newresource", "preferences",
"preferences.keybindings", "proc", "save", "settings", "ace.status", "terminal"
];
main.provides = ["harvard.cs50.menus"];
return main;
function main(options, imports, register) {
const ace = imports.ace;
const confirm_ = imports["dialog.confirm"].show;
const menus = imports.menus;
const panels = imports.panels;
const Plugin = imports.Plugin;
const proc = imports.proc;
const settings = imports.settings;
const tabbehavior = imports.tabbehavior;
const tabs = imports.tabManager;
const tree = imports.tree;
const ui = imports.ui;
const plugin = new Plugin("CS50", main.consumes);
let previewItem;
function applyToMenuItem(path, fn) {
const item = menus.get(path).item;
if (item)
fn(item)
return item;
}
function moveMenuItemSameMenu(path, index) {
applyToMenuItem(path, i => menus.addItemByPath(path, i, index, plugin));
}
function removeMenuItem(path) {
return applyToMenuItem(path, i => i.remove());
}
function renameMenuItem(path, caption) {
return applyToMenuItem(path, i => i.setAttribute("caption", caption));
}
function moveMenuItem(curPath, newPath, index) {
applyToMenuItem(curPath, i => menus.addItemByPath(newPath, i, index, plugin));
}
function removeUserMenu() {
removeMenuItem("user_info");
}
function updateAWSCloud9Menu() {
["Project Settings", "User Settings", "Keymap", "Init Script", "Stylesheet"]
.forEach(i => renameMenuItem(`AWS Cloud9/Open Your ${i}`, i));
renameMenuItem("AWS Cloud9", "CS50 IDE");
menus.addItemByPath("AWS Cloud9/~", new ui.divider(), 2000078, plugin);
menus.addItemByPath("AWS Cloud9/Reset Settings", new ui.item({
caption: "Reset Settings",
onclick() {
confirm_("Reset Settings",
"",
"Are you sure you want to reset CS50 IDE to factory " +
"defaults? It will then look just as it did the first time you " +
"logged in. Your files and folders will not be deleted.",
(() => {
window.location.search += "&reset=project|state|user";
}),
(() => {})
);
}
}), 2000079, plugin);
menus.addItemByPath("AWS Cloud9/Restart", new ui.item({
caption: "Restart",
onclick() {
confirm_("Restart IDE",
"",
"Are you sure you want to restart the IDE?",
(() => parent.postMessage("restart", "*")),
(() => {})
);
}
}), 2000080, plugin);
[
"Init Script",
"Keymap",
"Project Settings",
"Stylesheet",
"User Settings"
].forEach((p, i) => moveMenuItemSameMenu(`AWS Cloud9/Open Your ${p}`, 400 + i * 10));
}
function simplifyMenuBar() {
[
"File/Revert to Saved",
"File/Revert All to Saved",
"File/Line Endings",
"File/New From Template",
"Edit/Line/Move Line Up",
"Edit/Line/Move Line Down",
"Edit/Line/Copy Lines Up",
"Edit/Line/Copy Lines Down",
"Edit/Line/Remove Line",
"Edit/Line/Remove to Line End",
"Edit/Line/Remove to Line Start",
"Edit/Line/Split Line",
"Edit/Keyboard Mode",
"Edit/Selection",
"Edit/Text",
"Edit/Code Folding",
"Edit/Code Formatting",
"Find/Replace Next",
"Find/Replace Previous",
"Find/Replace All",
"View/Editors",
"View/Syntax",
"View/Wrap Lines",
"View/Wrap To Print Margin",
"View/Status Bar",
"View/Menu Bar",
"View/Tab Buttons",
"View/Themes",
"Go/Find References",
"Go/Go to Anything...",
"Go/Go to File...",
"Go/Go to Symbol...",
"Go/Go to Command...",
"Go/Next Error",
"Go/Previous Error",
"Go/Word Right",
"Go/Word Left",
"Go/Scroll to Selection",
"Tools",
"Window",
"Run",
"Support"
].forEach(removeMenuItem);
moveMenuItem("Window/New Terminal", "File/New Terminal", 150);
renameMenuItem("View/Gutter", "Line Numbers");
renameMenuItem("Go/Go to Line...", "Line...");
}
function simplifyPlusMenu() {
tabs.getElement("mnuEditors", menu => {
const captions = [
"New Run Configuration",
"Open Preferences",
"New Immediate Window",
"Recently Closed Tabs"
];
const interval = setInterval(() => {
menu.childNodes.forEach(node => {
const i = captions.indexOf(node.getAttribute("caption"));
if (i > -1) {
node.remove();
captions.splice(i, 1);
}
if (!captions.length) {
menu.childNodes[2] && menu.childNodes[2].remove();
clearInterval(interval);
}
}, 0);
});
});
}
function _hideRunThisFile(e) {
e.currentTarget.childNodes.some(node => {
if (node.getAttribute("caption") == "Run This File") {
node.remove();
return true;
}
});
}
function simplifyAceContextMenu() {
ace.getElement("menu", menu => {
menu.once("prop.visible", _hideRunThisFile);
});
}
function simplifyTabContextMenu() {
tabbehavior.contextMenu.once("prop.visible", _hideRunThisFile);
}
function simplifyTreeContextMenu() {
function getItem(menu, caption) {
const node = menu.childNodes.find((n) => {
return caption === n.getAttribute("caption");
});
return node;
}
tree.once("menuUpdate", (e) => {
const runItem = getItem(e.menu, "Run");
if (runItem)
runItem.remove();
const i = setInterval(() => {
previewItem = getItem(e.menu, "Preview");
if (previewItem) {
clearInterval(i);
if (!settings.getBool("user/cs50/simple/@previewEnabled"))
previewItem.hide();
}
}, 0);
});
tree.on("menuUpdate", (e) => {
if (!previewItem)
return;
const previewEnabled = settings.getBool("user/cs50/simple/@previewEnabled");
if (previewEnabled) {
previewItem.show();
}
else {
previewItem.hide();
}
});
}
function disableRightBarContextMenu() {
const aml = panels.areas["right"].aml;
if (aml) {
aml.childNodes.some(node => {
if (node.$ext && node.$ext.classList.contains("panelsbar"))
node.oncontextmenu = (() => {});
});
}
}
let loaded = false;
plugin.on("load", () => {
if (loaded)
return false;
loaded = true;
disableRightBarContextMenu();
removeUserMenu();
simplifyAceContextMenu();
simplifyMenuBar();
simplifyPlusMenu();
simplifyTabContextMenu();
simplifyTreeContextMenu();
updateAWSCloud9Menu();
});
plugin.on("unload", () => {});
plugin.freezePublicAPI({});
register(null, { "harvard.cs50.menus" : plugin });
}
});
define("@cs50/ide/plugins/harvard.cs50.simple/editors",[], function(require, exports, module) {
"use strict";
main.consumes = [
"commands", "console", "editors", "harvard.cs50.presentation", "layout", "menus", "Plugin", "settings", "tabManager", "ui"
];
main.provides = ["harvard.cs50.editors"];
return main;
function main(options, imports, register) {
const commands = imports.commands;
const editors = imports.editors;
const presentation = imports["harvard.cs50.presentation"];
const layout = imports.layout;
const menus = imports.menus;
const Plugin = imports.Plugin;
const settings = imports.settings;
const tabs = imports.tabManager;
const ui = imports.ui;
const plugin = new Plugin("CS50", main.consumes);
function addTooltips() {
imports.console.getElement("consoleButtons", consoleButtons => {
consoleButtons.childNodes.forEach(button => {
const class_ = button.getAttribute("class");
if (!class_)
return;
if (class_ === "maximize")
button.setAttribute("tooltip", "Maximize Console");
else if (class_.split(" ").indexOf("console_close_btn") > -1)
button.setAttribute("tooltip", "Close Console");
});
});
}
function simplifyImageEditor() {
editors.on("create", e => {
const editor = e.editor;
if (editor.type !== "imgeditor")
return;
editor.getElement("zoom", zoom => {
const parent = zoom.parentNode;
parent.childNodes.forEach(n => {
n.hide();
n.show = () => {};
});
parent.setAttribute("class", (parent.getAttribute("class") || "") + " cs50-simple-imgeditor-bar");
const label = new ui.label({ width: 50 });
label.setCaption = value => {
label.setAttribute(
"caption",
((typeof (value) === "number" && value) || "100") + "%"
);
};
editor.on("documentActivate", () => {
label.setCaption(zoom.value);
});
function _changeZoom(value) {
if (typeof(value) !== "number")
return zoom.setValue(100);
zoom.setValue(value);
label.setCaption(value);
zoom.dispatchEvent("afterchange");
}
const minus = new ui.button({
caption: "−",
class: "cs50-simple-zoom-button",
skin: "btn-default-css3",
onclick() {
_changeZoom(
Math.max(10, zoom.value - (zoom.value >= 200 ? 100 : 10))
);
},
margin: "2 0 0 5"
});
const plus = new ui.button({
caption: "+",
class: "cs50-simple-zoom-button",
skin: "btn-default-css3",
onclick() {
_changeZoom(
zoom.value + (zoom.value >= 100 ? 100 : 10)
);
},
margin: "2 0 0 5"
});
[minus, label, plus].forEach(e => {
parent.appendChild(e);
editor.addElement(e);
});
commands.addCommand({
name: "zoom_in",
hint: "Zooms in on image in image viewer",
group: "imgeditor",
bindKey: { mac: "Command-+", win: "Ctrl-+" },
isAvailable(editor) {
return editor && editor.type === "imgeditor";
},
exec() {
plus.dispatchEvent("click");
}
}, plugin);
commands.addCommand({
name: "zoom_out",
hint: "Zooms in on image in image viewer",
group: "imgeditor",
bindKey: { mac: "Command--", win: "Ctrl--" },
isAvailable(editor) {
return editor && editor.type === "imgeditor";
},
exec() {
minus.dispatchEvent("click");
}
}, plugin);
function setTheme(e) {
[plus, minus].forEach(button => {
let class_ = button.getAttribute("class") || "";
if (e.theme.indexOf("dark") > -1) {
if (class_.search(/\bdark\b/) === -1)
class_ += " dark";
}
else {
class_ = class_.replace(/\bdark\b/, "");
}
button.setAttribute("class", class_);
});
}
layout.on("themeChange", setTheme);
setTheme({ theme: settings.get("user/general/@skin") });
});
});
}
function syncAceAndTerminalFontSizes() {
function isAvailable() {
return tabs.focussedTab &&
tabs.focussedTab.editorType &&
["ace", "hex", "terminal"].indexOf(tabs.focussedTab.editorType) > -1;
};
const largerfontKeys = commands.commands.largerfont.bindKey;
delete commands.commands.largerfont.bindKey;
const smallerfontKeys = commands.commands.smallerfont.bindKey;
delete commands.commands.smallerfont.bindKey;
commands.addCommand({
name: "largerFonts",
exec() {
let size = settings.getNumber("user/ace/@fontSize");
settings.set("user/ace/@fontSize", ++size > 72 ? 72 : size);
size = settings.getNumber("user/terminal/@fontsize");
settings.set("user/terminal/@fontsize", ++size > 72 ? 72 : size);
},
bindKey: largerfontKeys,
isAvailable: isAvailable
}, plugin);
commands.addCommand({
name: "resetFonts",
exec() {
let size = presentation.presenting ? presentation.defaultFontSize : 12;
settings.set("user/ace/@fontSize", size);
settings.set("user/terminal/@fontsize", size);
},
bindKey: {
mac: "Command-Ctrl-0",
win: "Alt-Ctrl-0"
},
isAvailable: isAvailable,
}, plugin);
commands.addCommand({
name: "smallerFonts",
exec() {
let size = settings.getNumber("user/ace/@fontSize");
settings.set("user/ace/@fontSize", --size < 1 ? 1 : size);
size = settings.getNumber("user/terminal/@fontsize");
settings.set("user/terminal/@fontsize", --size < 1 ? 1 : size);
},
bindKey: smallerfontKeys,
isAvailable: isAvailable
}, plugin);
menus.get("View/Font Size/Increase Font Size").item.setAttribute(
"command", "largerFonts"
);
menus.get("View/Font Size/Decrease Font Size").item.setAttribute(
"command", "smallerFonts"
);
menus.addItemByPath("View/Font Size/Reset Font Size", new ui.item({
command: "resetFonts",
}), 150, plugin);
}
let loaded = false;
plugin.on("load", () => {
if (loaded)
return false;
loaded = true;
addTooltips();
simplifyImageEditor();
syncAceAndTerminalFontSizes();
});
plugin.on("unload", () => {});
plugin.freezePublicAPI({});
register(null, { "harvard.cs50.editors" : plugin });
}
});
define("@cs50/ide/plugins/harvard.cs50.simple/dialogs",[], function(require, exports, module) {
"use strict";
main.consumes = [
"commands", "dialog.file", "menus", "Plugin", "tabManager"
];
main.provides = ["harvard.cs50.dialogs"];
return main;
function main(options, imports, register) {
const commands = imports.commands;
const fileDialog = imports["dialog.file"];
const menus = imports.menus;
const Plugin = imports.Plugin;
const tabs = imports.tabManager;
const plugin = new Plugin("CS50", main.consumes);
function addFileDialog() {
const openItem = menus.get("File/Open...").item;
if (!openItem)
return;
const gotoanything = commands.commands.gotoanything;
commands.addCommand({
name: "openFileDialog",
hint: "Opens dialog for opening files",
bindKey: gotoanything.bindKey,
exec() {
fileDialog.show(
"Open file",
null,
path => {
fileDialog.tree.getSelection().getSelectedNodes()
.filter(node => !node.isFolder).forEach(node => {
tabs.openFile(node.path);
});
fileDialog.hide();
},
null,
{
createFolderButton: false,
showFilesCheckbox: false,
chooseCaption: "Open"
}
);
}
}, plugin);
delete gotoanything.bindKey;
delete commands.commands.gotofile.bindKey;
fileDialog.on("show", () => {
const txtDirectory = fileDialog.getElement("txtDirectory");
txtDirectory.previousSibling.hide();
txtDirectory.hide();
fileDialog.tree.once("afterChoose", () => {
fileDialog.getElement("btnChoose").dispatchEvent("click");
});
}, plugin);
openItem.setAttribute("command", "openFileDialog");
}
let loaded = false;
plugin.on("load", () => {
if (loaded)
return false;
loaded = true;
addFileDialog();
});
plugin.on("unload", () => {});
plugin.freezePublicAPI({});
register(null, { "harvard.cs50.dialogs" : plugin });
}
});
define("@cs50/ide/plugins/harvard.cs50.simple/buttons",[], function(require, exports, module) {
"use strict";
main.consumes = [
"layout", "menus", "Plugin", "settings", "tabManager", "tree", "ui",
"preferences", "preview", "run.gui"
];
main.provides = ["harvard.cs50.buttons"];
return main;
function main(options, imports, register) {
const layout = imports.layout;
const menus = imports.menus;
const Plugin = imports.Plugin;
const settings = imports.settings;
const tabs = imports.tabManager;
const tree = imports.tree;
const ui = imports.ui;
const plugin = new Plugin("CS50", main.consumes);
function addLogOutButton() {
menus.addItemByPath("AWS Cloud9/~", new ui.divider(), 2000081, plugin);
menus.addItemByPath("AWS Cloud9/Log Out", new ui.item({
id: "log_out",
caption: "Log Out",
onclick() {
window.top.location = "https://ide.cs50.io/logout";
}
}), 2000082, plugin);
}
function removePreviewAndRun() {
const parent = layout.findParent({ name: "preview" });
const captions = ["Preview", "Run"];
const interval = setInterval(() => {
parent.childNodes.forEach(node => {
const index = captions.indexOf(node.getAttribute("caption"));
if (index > -1) {
node.remove();
captions.splice(index, 1);
}
if (!captions.length)
clearInterval(interval);
});
}, 0);
}
function hideGearButton() {
layout.findParent({ name: "preferences" }).childNodes.some(node => {
if (node.getAttribute("class") === "preferences") {
node.remove();
return true;
}
});
}
function hideMinimizeButton() {
menus.getElement("menubar", e => {
e.firstChild.remove();
e.parentNode.$int.style.paddingLeft = "0";
});
}
function _getCodePanes() {
return tabs.getPanes(layout.findParent(tabs));
}
function _isCodePane(pane) {
return _getCodePanes().find(pane_ => pane === pane_);
}
function _getTopLeftCodePane() {
const codePanes = _getCodePanes();
if (codePanes.length < 1)
return;
let topLeftPane = codePanes[0];
let topLeftRect = topLeftPane.container.getBoundingClientRect();
for (let i = 1; i < codePanes.length; i++) {
const rect = codePanes[i].container.getBoundingClientRect();
if (rect.left < topLeftRect.left && rect.top < topLeftRect.top) {
topLeftPane = codePanes[i];
topLeftRect = rect;
}
}
return topLeftPane;
}
function addTreeToggle() {
tabs.on("paneCreate", e => {
if (!_isCodePane(e.pane))
return;
const button = ui.button({
id: "tree_toggle",
"class": "cs50-simple-tree-toggle",
command: "toggletree",
skin: "c9-simple-btn",
height: 16,
width: 16,
visible: false
});
e.pane.aml.appendChild(button);
e.pane.addElement(button);
showTreeToggle();
e.pane.on("unload", showTreeToggle);
});
tree.once("draw", syncTreeToggle.bind(null, true));
tree.on("show", syncTreeToggle.bind(null, true));
tree.on("hide", syncTreeToggle.bind(null, false));
settings.on("user/general/@skin", syncTreeToggle.bind(null, tree.active));
}
function showTreeToggle() {
_getCodePanes().forEach(codePane => {
codePane.getElement("tree_toggle", treeToggle => treeToggle.setAttribute("visible", false));
});
const codePane = _getTopLeftCodePane();
if (!codePane)
return;
codePane.getElement("tree_toggle", treeToggle => {
codePane.aml.$ext.classList.add("cs50-simple-pane0");
codePane.aml.$buttons.style.paddingLeft = "54px";
treeToggle.setAttribute("visible", settings.getBool("user/tabs/@show"));
syncTreeToggle(tree.active);
});
}
function syncTreeToggle(active) {
_getCodePanes().forEach(codePane => {
codePane.getElement("tree_toggle", treeToggle => treeToggle.setAttribute("visible", false));
});
const codePane = _getTopLeftCodePane();
if (!codePane)
return;
codePane.getElement("tree_toggle", treeToggle => {
const dark = settings.get("user/general/@skin").indexOf("dark") > -1;
treeToggle.setAttribute(
"class",
`cs50-simple-tree-toggle ${dark ? "dark" : ""} ${active ? "active" : ""}`
);
codePane.getElement("tree_toggle", treeToggle => treeToggle.setAttribute("visible", true));
});
}
let loaded = false;
plugin.on("load", () => {
if (loaded)
return false;
loaded = true;
settings.on("read", () => {
addLogOutButton();
addTreeToggle();
hideGearButton();
hideMinimizeButton();
removePreviewAndRun();
});
});
plugin.on("unload", () => {});
plugin.freezePublicAPI({});
register(null, { "harvard.cs50.buttons" : plugin });
}
});
define("text!@cs50/ide/plugins/harvard.cs50.presentation/style.css",[],'');
define("@cs50/ide/plugins/harvard.cs50.presentation/presentation",[], function(require, exports, module) {
main.consumes = [
"ace.status", "layout", "menus", "Plugin", "settings", "ui"
];
main.provides = ["harvard.cs50.presentation"];
return main;
function main(options, imports, register) {
const layout = imports.layout;
const menus = imports.menus;
const Plugin = imports.Plugin;
const settings = imports.settings;
const status = imports["ace.status"];
const ui = imports.ui;
const plugin = new Plugin("CS50", main.consumes);
const defaultFontSize = 24;
let presenting;
let menuItem = null;
let barExtras = null;
const listeners = [];
function addListener(listener) {
if (typeof(listener) !== "function" || listeners.indexOf(listener) > -1)
return;
listeners.push(listener);
if (presenting !== undefined)
listener(presenting);
}
function swapSettings(path1, path2) {
const val = settings.getNumber(path2);
settings.set(path2, settings.getNumber(path1));
settings.set(path1, val);
}
function toggleElements(show) {
if (typeof show !== "boolean")
return;
if (show) {
status.show();
barExtras.$ext.classList.remove("cs50-presentation");
}
else {
status.hide();
barExtras.$ext.classList.add("cs50-presentation");
}
}
function togglePresentationMode(override) {
if (typeof override === "boolean") {
if (!override && presenting) {
updateEditors();
toggleElements(true);
}
if (override === presenting)
return;
presenting = override;
}
else {
presenting = !presenting;
settings.set("user/cs50/presentation/@presenting", presenting);
updateEditors();
}
toggleElements(!presenting);
menuItem.setAttribute("checked", presenting);
listeners.forEach(listener => listener(presenting));
}
function updateEditors() {
swapSettings(
"user/cs50/presentation/@editorFontSize",
"user/ace/@fontSize"
);
swapSettings(
"user/cs50/presentation/@terminalFontSize",
"user/terminal/@fontsize"
);
}
plugin.on("load", () => {
menuItem = new ui.item({
type: "check",
caption: "Presentation Mode",
onclick: togglePresentationMode
});
menus.addItemByPath("View/~", new ui.divider(), 1, plugin);
menus.addItemByPath("View/Presentation Mode", menuItem, 2, plugin);
barExtras = layout.findParent({ name: "preferences" });
settings.on("read", () => {
settings.setDefaults("user/cs50/presentation", [
["presenting", false],
["editorFontSize", defaultFontSize],
["terminalFontSize", defaultFontSize]
]);
togglePresentationMode(
settings.getBool("user/cs50/presentation/@presenting")
);
});
ui.insertCss(require("text!./style.css"), plugin);
});
plugin.on("unload", () => {
togglePresentationMode(false);
menuItem = null;
barExtras = null;
presenting = undefined;
});
plugin.freezePublicAPI({
get presenting() { return presenting; },
get defaultFontSize() { return defaultFontSize; },
addListener: addListener
});
register(null, {
"harvard.cs50.presentation": plugin
});
}
});
define("@cs50/ide/plugins/harvard.cs50.hex/openhex",[], function(require, exports, module) {
main.consumes = [
"c9", "dialog.error", "menus", "Plugin", "tabManager", "tree", "ui"
];
main.provides = ["harvard.cs50.openhex"];
return main;
function main(options, imports, register) {
const c9 = imports.c9;
const menus = imports.menus;
const Plugin = imports.Plugin;
const showError = imports["dialog.error"];
const tabManager = imports.tabManager;
const tree = imports.tree;
const ui = imports.ui;
const plugin = new Plugin("CS50", main.consumes);
function openSelection() {
if (!c9.has(c9.STORAGE))
return;
var nodes = tree.selectedNodes;
var last = nodes.length - 1;
var noanim = nodes.length > 1;
nodes.forEach(function(node, i) {
var tab;
var focus = (i === last);
if (!node.isFolder) {
var path = node.path;
tab = tabManager.findTab(path);
if (tab) {
return tabManager.open({
name: "hex-" + path,
document: { path: path },
editorType: "hex",
pane: tab.pane,
focus: false
}, function(err, tab) {
if (err)
return showError(err);
if (tab) {
tab.document.progress({ complete: true });
if (focus)
tabManager.focusTab(tab);
}
});
}
tabManager.open({
name: "hex-" + path,
document: { path: path },
editorType: "hex",
active: focus,
focus: focus,
noanim: noanim
});
}
});
}
plugin.on("load", function() {
tree.getElement("mnuCtxTree", function(mnuCtxTree) {
menus.addItemToMenu(mnuCtxTree, new ui.item({
caption: "Open as hexadecimal",
onclick: openSelection,
match: "file"
}), 101, plugin);
});
});
plugin.on("unload", function() {});
register(null, {
"harvard.cs50.openhex": plugin
});
}
});
define("text!@cs50/ide/plugins/harvard.cs50.hex/style.css",[],'');
define("@cs50/ide/plugins/harvard.cs50.hex/hex",[], function(require, exports, module) {
main.consumes = [
"dialog.error", "Editor", "editors", "layout", "settings", "vfs", "ui"
];
main.provides = ["harvard.cs50.hex"];
return main;
function main(options, imports, register) {
var Editor = imports.Editor;
var editors = imports.editors;
var layout = imports.layout;
var settings = imports.settings;
var showError = imports["dialog.error"].show;
var vfs = imports.vfs;
var ui = imports.ui;
var basename = require("path").basename;
var extensions = [];
var handle = editors.register("hex", "Hex", Hex, extensions);
handle.darken = function(elements, dark) {
if (Array.isArray(elements) && typeof (dark) === "boolean") {
elements.forEach(function(element) {
var c = element.getAttribute("class") || "";
if (!dark)
element.setAttribute("class", c.replace(/\sdark/, ""));
else if (c.indexOf("dark") === -1)
element.setAttribute("class", c.concat(" dark"));
});
}
};
var cssInserted = false;
handle.insertCss = function() {
if (cssInserted)
return;
cssInserted = true;
ui.insertCss(require("text!./style.css"), handle);
};
handle.updateFontSize = function(element, size) {
if (typeof (element) === "object" && typeof (element.style) === "object")
element.style.fontSize = size + "px";
};
function Hex() {
var plugin = new Editor("CS50", main.consumes, extensions);
var currSession = null;
var bar = null;
var configElements = {};
var content = null;
plugin.on("draw", function(e) {
handle.insertCss();
configElements.rowBytes = new ui.spinner({
defaultValue: 16,
min: 1,
max: 256,
});
configElements.colBytes = new ui.spinner({
defaultValue: 2,
min: 1,
max: 256,
});
configElements.offset = new ui.spinner({
defaultValue: 0,
min: 0,
});
function handleEnter(e) {
if (typeof (e) === "object" && e.keyCode === 13)
update();
}
for (var element in configElements)
configElements[element].on("keydown", handleEnter);
bar = new ui.bar({
id: "configs",
class: "cs50-hex-configs fakehbox aligncenter padding3",
height: "40",
childNodes: [
new ui.label({caption : "Start with byte: "}),
configElements.offset,
new ui.divider({
class: "cs50-hex-divider",
skin: "c9-divider"
}),
new ui.label({caption : "Bytes per row: "}),
configElements.rowBytes,
new ui.divider({
class: "cs50-hex-divider",
skin: "c9-divider"
}),
new ui.label({caption : "Bytes per column: "}),
configElements.colBytes,
new ui.divider({
class: "cs50-hex-divider",
skin: "c9-divider"
}),
new ui.button({
caption: "Set",
class: "btn-green",
onclick: update,
skin: "btn-default-css3"
})
]
});
content = new ui.textarea({
id: "content",
border: 0,
class: "cs50-hex-content",
focussable: false,
height: "100%",
width: "100%"
});
content.on("DOMNodeInsertedIntoDocument", function(e) {
handle.updateFontSize(content.$ext, settings.getNumber("user/ace/@fontSize"));
settings.on("user/ace/@fontSize", function(size) {
handle.updateFontSize(content.$ext, size);
});
content.$ext.setAttribute("readonly", "true");
});
var vbox = new ui.vsplitbox({
childNodes: [
bar,
new ui.bar({childNodes: [content]})
]
});
plugin.addElement(vbox);
e.tab.appendChild(vbox);
for (var element in configElements) {
configElements[element].$buttonMinus.addEventListener("mouseup", update);
configElements[element].$buttonPlus.addEventListener("mouseup", update);
}
});
function configChanged(configs) {
if (typeof (configs) !== "object") {
showError("Error reading hex configs");
return false;
}
for (var name in configs) {
if (configElements[name]) {
var val = parseInt(configElements[name].oInput.value);
if (Number.isNaN(val) || val < configElements[name].min)
configElements[name].oInput.value = configElements[name].min;
else if(val > configElements[name].max)
configElements[name].oInput.value = configElements[name].max;
if (configElements[name].oInput.value !== configs[name])
return true;
}
else {
console.warn("element " + name + " not found");
}
}
return false;
}
function format(session) {
if (typeof (session) !== "object") {
showError("Error reading hex configs");
return false;
}
if (typeof (session.hex) === "object" && typeof (session.hex.configs) === "object" && typeof (session.hex.content) === "string") {
if (session.hex.content === "" || configChanged(session.hex.configs)) {
session.hex.configs = getConfigs(!Object.keys(session.hex.configs).length);
session.hex.content = "";
var len = session.hex.bytes.length;
for (var i = session.hex.configs["offset"] * 2, j = 1; i < len; i += 2) {
session.hex.content += (session.hex.bytes[i] + session.hex.bytes[i + 1]);
if (j % session.hex.configs["rowBytes"] === 0)
session.hex.content += "\n";
else if (j % session.hex.configs["colBytes"] === 0) {
session.hex.content += " ";
}
j = (j + 1) % session.hex.configs["rowBytes"];
}
}
return true;
}
else {
showError("Error reading hex configs");
return false;
}
}
function getConfigs(defaults) {
var configs = {};
for (var element in configElements) {
configs[element] = (defaults === true)
? configElements[element].defaultValue
: configElements[element].oInput.value;
}
return configs;
}
function render(configs, formattedHex) {
if (typeof (configs) !== "object" || typeof (formattedHex) !== "string")
return showError("Error rendering hex");
for (var name in configs) {
if (configElements[name])
configElements[name].oInput.value = configs[name];
else
console.warn("config " + name + " not found");
}
if (content) {
content.setAttribute("value", formattedHex);
showLoading(false);
}
}
function showLoading(show) {
if (show === true && content) {
content.setAttribute("visible", false);
var c = content.parentNode.getAttribute("class");
if (c.indexOf("cs50-hex.loading") === -1)
content.parentNode.setAttribute("class", c.concat(" cs50-hex-loading"));
}
else {
var c = content.parentNode.getAttribute("class");
content.parentNode.setAttribute("class", c.replace(/\s*cs50-hex-loading/, ""));
content.setAttribute("visible", true);
}
}
function update() {
if (format(currSession))
render(currSession.hex.configs, currSession.hex.content);
}
plugin.on("documentLoad", function(e) {
var doc = e.doc;
doc.meta.ignoreSave = true;
if (!doc.lastState.path)
return showError("Error retrieving file path");
var session = doc.getSession();
function setTheme(e) {
var tab = doc.tab;
if (e.theme.indexOf("dark") > -1) {
tab.backgroundColor = "#303130";
tab.classList.add("dark");
handle.darken([bar, content, content.parentNode], true);
}
else {
tab.backgroundColor = "#f1f1f1";
tab.classList.remove("dark");
handle.darken([bar, content, content.parentNode], false);
}
}
layout.on("themeChange", setTheme, session);
setTheme({ theme: settings.get("user/general/@skin") });
function setTitle(e) {
var path = doc.lastState.path;
doc.title = basename(path);
doc.tooltip = path;
}
setTitle();
doc.tab.on("setPath", setTitle, session);
showLoading(true);
session.hex = doc.lastState.hex;
if (!session.hex) {
session.hex = {
bytes: "",
configs: {},
content: ""
};
}
doc.on("getState", function(e) {
e.state.hex = session.hex;
e.state.path = doc.lastState.path;
});
vfs.rest(doc.lastState.path, { responseType: "arraybuffer" }, (err, buffer) => {
if (err)
return;
if (typeof (session.hex) !== "object")
return;
const bytes = new Uint8Array(buffer);
session.hex.bytes = "";
for (var i = 0, len = bytes.length; i < len; i++) {
if (bytes[i] < 16)
session.hex.bytes += "0";
session.hex.bytes += bytes[i].toString(16);
}
if (format(session) && session === currSession)
render(session.hex.configs, session.hex.content)
})
});
plugin.on("documentActivate", function(e) {
currSession = e.doc.getSession();
if (typeof (currSession.hex) === "object" && currSession.hex.content !== "")
render(currSession.hex.configs, currSession.hex.content);
});
plugin.on("documentUnload", function(e) {
delete e.doc.getSession().hex;
});
plugin.on("resize", function(){
if (content && content.getAttribute("visible") === true) {
content.setAttribute("visible", false);
content.setAttribute("visible", true);
}
});
plugin.freezePublicAPI({});
plugin.load(null, "harvard.cs50.hex");
return plugin;
}
register(null, {
"harvard.cs50.hex": handle
});
}
});
define("@cs50/ide/plugins/harvard.cs50.debug/debug",[], function(require, exports, module) {
"use strict";
main.consumes = [
"breakpoints", "c9", "commands", "dialog.error", "debugger",
"fs", "Plugin", "proc", "run", "settings"
];
main.provides = ["harvard.cs50.debug"];
return main;
function main(options, imports, register) {
const Plugin = imports.Plugin;
const breakpoints = imports.breakpoints;
const c9 = imports.c9;
const commands = imports.commands;
const debug = imports.debugger;
const fs = imports.fs;
const proc = imports.proc;
const run = imports.run;
const showError = imports["dialog.error"].show;
const settings = imports.settings;
const plugin = new Plugin("Ajax.org", main.consumes);
let process = {};
const SETTING_PID = "project/cs50/debug/@pid";
const SETTING_PROXY = "project/cs50/debug/@proxy";
const SETTING_NAME = "project/cs50/debug/@name";
const SETTING_RUNNER = "project/cs50/debug/@runner";
const SETTING_VER = "project/cs50/debug/@ver";
const NAMED_PIPE = "/home/ubuntu/.c9/ikp3dbpipe";
const IKP3DB_PORT = 15472;
function handleErr(proc, err) {
showError(proc, "error:", err);
}
function startDebugging(pid, reconnect) {
if (reconnect == undefined)
reconnect = false;
debug.debug(process[pid], reconnect, err => {
if (err) {
handleErr("Debug start", err);
return cleanState(pid);
}
settings.set(SETTING_PID, pid);
settings.set(SETTING_PROXY, process[pid].pid);
settings.set(SETTING_NAME, process[pid].name);
settings.set(SETTING_RUNNER, process[pid].runner.caption || process[pid].runner[0].caption);
});
}
function startProxy(cwd, pid, runner) {
proc.spawn("kill", { args: ["-SIGUSR1", pid] }, () => {});
const procOpts = {
cwd: cwd,
args: [pid.toString()],
debug: true
};
process[pid] = run.run(runner, procOpts, err => {
if (err)
return handleErr("Proxy process run", err);
startDebugging(pid);
});
process[pid].on("stopping", cleanState.bind(null, pid));
}
function cleanState(pid) {
debug.stop();
if (pid)
delete process[pid];
settings.set(SETTING_PID, null);
settings.set(SETTING_NAME, null);
settings.set(SETTING_PROXY, null);
settings.set(SETTING_RUNNER, null);
}
function startDebugger(args, reconnect) {
if (args.length != 3) {
showError("Error: expected process PID and a runner!");
return false;
}
const pid = args[2];
const runnerName = args[1] === "gdb" ?
"GDBMonitor" : (args[1] === "ikp3db" ?
"IKP3DBMonitor" : null);
if (!runnerName) {
showError("Error: invalid debugger!");
return false;
}
run.getRunner(runnerName, (err, runner) => {
if (err)
return handleErr("Runner fetch", err);
debug.checkAttached(() => {
startProxy(args[0], pid, runner);
}, () => {
proc.spawn("kill", { args: [pid] }, () => {});
});
});
}
function stopDebugger(args) {
if (args.length != 2) {
showError("Error: expected process PID!");
return false;
}
debug.stop();
const pid = args[1];
if (!process[pid])
return;
process[pid].stop(cleanState.bind(this, pid));
}
function restoreProcess() {
const proxy = settings.getNumber(SETTING_PROXY);
const pid = settings.getNumber(SETTING_PID);
const name = settings.get(SETTING_NAME);
const runnerName = settings.get(SETTING_RUNNER);
if (!proxy || !pid || !name || !runnerName)
return;
run.getRunner(runnerName, (err, runner) => {
if (err)
return cleanState(pid);
process[pid] = run.restoreProcess({
pid: proxy,
name: name,
runner: [runner],
running: run.STARTED
});
if (!process[pid] || process[pid].running === run.STOPPED)
cleanState(pid);
else
process[pid].on("stopping", cleanState.bind(null, pid));
startDebugging(pid, true);
});
}
function load() {
}
plugin.on("load", () => {
run.addRunner("GDBMonitor", {
caption: "GDBMonitor",
script: ["while kill -0 $args ; do sleep 1; done"],
debugger: "gdb",
$debugDefaultState: true,
retryCount: 100,
retryInterval: 300,
socketpath: "/home/ubuntu/.c9/gdbdebugger.socket"
}, run);
run.addRunner("IKP3DBMonitor", {
caption: "IKP3DBMonitor",
script: ["while kill -0 $args; do sleep 1; done"],
debugger: "ikpdb",
debugport: IKP3DB_PORT,
maxdepth: 50,
$debugDefaultState: true,
retryCount: 100,
retryInterval: 300
}, run);
commands.addCommand({
name: "startDebugger",
hint: "Kickstart debugger from CLI",
group: "Run & Debug",
exec: startDebugger
}, plugin);
commands.addCommand({
name: "stopDebugger",
hint: "Stop debugger started from CLI",
group: "Run & Debug",
exec: stopDebugger
}, plugin);
commands.addCommand({
name: "breakpoint_set",
hint: "Check if source file has at least a breakpoint",
group: "Run & Debug",
exec(args) {
if (args.length !== 2)
return false;
return breakpoints.breakpoints.some(breakpoint => {
return breakpoint.path.replace(/^\//, c9.environmentDir + "/").replace(/^~/, c9.home) == args[1];
});
}
}, plugin);
settings.on("read", () => {
settings.set("user/output/nosavequestion", "true");
restoreProcess();
});
});
plugin.on("unload", () => {
process = null;
});
plugin.freezePublicAPI({});
register(null, {
"harvard.cs50.debug": plugin
});
}
});
define("@cs50/ide/plugins/harvard.cs50.browser/server",[], function(require, exports, module) {
"use strict";
main.consumes = ["c9", "menus", "Plugin", "proc", "tree", "ui"];
main.provides = ["harvard.cs50.server"];
return main;
function main(options, imports, register) {
const c9 = imports.c9;
const menus = imports.menus;
const Plugin = imports.Plugin;
const proc = imports.proc;
const tree = imports.tree;
const ui = imports.ui;
const plugin = new Plugin("CS50", main.consumes);
function getHostname(port) {
if (c9.hostname) {
return `${c9.hostname}-${port}.cs50.ws`;
}
else {
return `localhost:${port}`;
}
}
function addWebServer() {
menus.addItemByPath("AWS Cloud9/Web Server", new ui.item({
id: "web_server",
caption: "Web Server",
onclick() {
window.open(`//${getHostname(8080)}`);
}
}), 102, plugin);
}
function addGUI() {
menus.addItemByPath("AWS Cloud9/GUI", new ui.item({
id: "gui50",
caption: "GUI",
onclick() {
proc.spawn("gui50", (err, p) => {
if (err) {
console.error(err);
}
else {
p.unref();
let url = "";
p.stdout.on("data", function handleOutput(chunk) {
url += chunk;
if (url.match(/https?:\/\/.+\s/)) {
console.log(url);
p.stdout.off("data", handleOutput);
window.open(url);
}
});
}
});
}
}), 101, plugin);
}
function addServe() {
tree.getElement("mnuCtxTree", mnuCtxTree => {
menus.addItemToMenu(mnuCtxTree, new ui.item({
caption: "Serve",
match: "folder",
isAvailable() {
return tree.selectedNodes.filter(node => {
return node.isFolder;
}).length === 1;
},
onclick() {
const node = tree.selectedNodes.find(node => {
return node.isFolder;
});
if (!node)
return;
const path = node.path.replace(/^\//, c9.environmentDir + "/");
const PORT = "8081";
proc.spawn("http-server", {
args: [ "-p", PORT ],
cwd: path
},
(err, process) => {
if (err) {
return console.error(err);
}
process.stderr.on("data", (data) => console.log(data));
const URL = `//${getHostname(PORT)}`;
async function checkResponse(retries) {
if (retries < 1) {
console.error(`${URL} did not return a success code`);
return;
}
try {
const response = await fetch(URL);
if (response.status === 200)
return window.open(URL);
}
catch (err) {
console.error(err);
}
await new Promise((resolve) => setTimeout(resolve, 500));
return checkResponse(retries - 1);
}
checkResponse(10);
});
}
}), 102, plugin);
});
}
let loaded = false;
plugin.on("load", () => {
if (loaded)
return false;
loaded = true;
addServe();
addGUI();
addWebServer();
});
plugin.on("unload", () => {});
plugin.freezePublicAPI({});
register(null, { "harvard.cs50.server" : plugin });
}
});
define("@cs50/ide/plugins/harvard.cs50.browser/results",[], function(require, exports, module) {
"use strict";
main.consumes = [
"commands", "Plugin", "notificationBubble"
];
main.provides = ["harvard.cs50.results"];
return main;
function main(options, imports, register) {
const commands = imports.commands;
const bubble = imports.notificationBubble;
const Plugin = imports.Plugin;
const plugin = new Plugin("CS50", main.consumes);
let loaded = false;
plugin.on("load", () => {
if (loaded)
return false;
loaded = true;
commands.addCommand({
name: "renderresults",
hint: "Render check results",
group: "General",
exec: (args) => {
if (args.length !== 3 || typeof args[1] !== "string" || typeof args[2] !== "string")
return false;
bubble.popup(
[
["span", "Click "],
[
"a",
{
href:`javascript:(() => window.open('', '_blank').document.write('${args[2].replace(/'/g, "\\'")}'))()`,
"style": "display: inline"
},
"here"
],
[
"span",
` to view detailed ${args[1]} results!`
]
]
)
}
}, plugin);
});
plugin.on("unload", () => {});
plugin.freezePublicAPI({});
register(null, { "harvard.cs50.results" : plugin });
}
});
define("text!@cs50/ide/plugins/harvard.cs50.ddb/style.css",[],'');
define("@cs50/ide/plugins/harvard.cs50.ddb/ddb",[], function(require, exports, module) {
main.consumes = ["commands", "collab.util", "layout", "Panel", "panels", "ui"];
main.provides = ["harvard.cs50.ddb"];
return main;
function main(options, imports, register) {
const commands = imports.commands;
const layout = imports.layout;
const Panel = imports.Panel;
const panels = imports.panels;
const ui = imports.ui;
const util = imports["collab.util"];
const plugin = new Panel("CS50", [], {
index: 200,
panelCSSClass: "ddbPanel",
buttonCSSClass: "ddbPanelButton",
minWidth: 130,
where: "right",
name: "ddb",
caption: "ddb",
textselect: true,
style: "flex:1;",
});
const emoji = require("@c9/ide/plugins/c9.ide.collab/chat/my_emoji");
let button;
let chatInput, chatText, parent;
function $(id) {
return document.getElementById(id);
}
let loaded = false;
let firstMsg = true;
function load() {
if (loaded) return;
loaded = true;
button = new ui.button({
"skin": "c9-menu-btn",
"visible": true,
onclick: () => {
if (plugin.active) {
plugin.hide();
}
else {
plugin.show();
}
}
});
button.setAttribute("class", "ddbButton");
ui.insertByIndex(layout.findParent({
name: "preferences"
}), button, 900, plugin);
commands.addCommand({
name: "ddb",
hint: "Open ddb panel",
group: "Run & Debug",
exec: () => plugin.show()
}, plugin);
}
let drawn = false;
function draw(options) {
if (drawn) return;
drawn = true;
ui.insertCss(require("text!./style.css"), plugin);
parent = options.aml;
let parentExt = parent.$int;
parentExt.className += " ddbChatContainer";
chatText = parentExt.appendChild(document.createElement("div"));
chatText.setAttribute("class", "ddbChatText");
chatInput = new apf.codebox({
htmlNode: parentExt,
skin: "codebox",
"initial-message": "Message ddb",
focusselect: "true",
});
plugin.on("show", () => setTimeout(() => chatInput.focus(), 200));
chatInput.$ext.classList.remove("ace_searchbox");
chatInput.ace.setOptions({
wrap: "free",
indentedSoftWrap: false,
maxLines: 5,
minLines: 2,
fontFamily: "inherit",
});
plugin.addElement(chatInput);
chatInput.ace.commands.addCommands([
{
bindKey: "ESC",
exec: function() {
if (chatInput.getValue()) chatInput.setValue("");
else plugin.hide();
},
},
{
bindKey: "Enter",
exec: send,
},
]);
}
function scrollDown() {
chatText.scrollTop = chatText.scrollHeight;
}
function getRandomInt(max) {
return Math.floor(Math.random() * Math.floor(max));
}
function quack(prevMsg) {
let reply = "quack ".repeat(1 + getRandomInt(3)).trim();
if (prevMsg && prevMsg.endsWith("!")) {
reply += "!";
}
addMessage({text: reply , fromDuck: true});
}
function send() {
let text = chatInput.getValue().trim();
if (!text) return;
text = emoji.toEmojiUnicode(text);
addMessage({text: text})
chatInput.setValue("");
if (firstMsg) {
firstMsg = false;
quack(text);
}
else if (getRandomInt(10) < 8) {
setTimeout(() => quack(text), 500 * (1 + getRandomInt(2)));
}
}
function formatMessageText(text) {
text = util.escapeHtmlWithClickableLinks(text.trim(), "_blank");
text = text.replace(/\n/g, "
");
text = emoji.emoji(text);
return text;
}
function addMessage(msg) {
var authorNameEl = document.createElement("a");
authorNameEl.className = "ddbAuthorName";
authorNameEl.innerHTML = "" + (msg.fromDuck ? "ddb" : "you") + "";
let text = formatMessageText(msg.text);
let html = document.createElement("p");
html.className = "ddbYou";
let borderEl = document.createElement("span");
html.appendChild(borderEl);
borderEl.className = "ddbChatBorder";
borderEl.style.borderLeftColor = msg.fromDuck ? "#ffd45a" : "#d2e3fc";
html.appendChild(authorNameEl);
let textEl = document.createElement("span");
textEl.className = "ddbChatMessage";
textEl.innerHTML = text + "
";
html.appendChild(textEl);
chatText.appendChild(html);
scrollDown();
}
plugin.on("load", function() {
load();
plugin.once("draw", draw);
});
plugin.on("enable", function() {});
plugin.on("disable", function() {});
plugin.on("unload", function() {
loaded = false;
drawn = false;
});
register(null, {
"harvard.cs50.ddb": plugin
});
}
});
define("text!@cs50/ide/plugins/harvard.cs50.browser/style.css",[],'');
define("@cs50/ide/plugins/harvard.cs50.browser/browser",[], function(require, exports, module) {
main.consumes = [
"c9", "commands", "Editor", "editors", "fs", "layout",
"MenuItem", "menus", "tabManager", "proc", "settings", "tree", "ui"
];
main.provides = ["harvard.cs50.browser"];
return main;
function main(options, imports, register) {
const c9 = imports.c9;
const commands = imports.commands;
const Editor = imports.Editor;
const editors = imports.editors;
const fs = imports.fs;
const layout = imports.layout;
const MenuItem = imports.MenuItem;
const menus = imports.menus;
const proc = imports.proc;
const tabs = imports.tabManager;
const settings = imports.settings;
const tree = imports.tree;
const ui = imports.ui;
const basename = require("path").basename;
const extname = require("path").extname;
const join = require("path").join;
const BROWSER_VER = 1;
const extensions = ["db", "db3", "sqlite", "sqlite3"];
const handle = editors.register("browser", "Browser", Browser, extensions);
let cssInserted = false;
handle.insertCss = () => {
if (cssInserted)
return;
cssInserted = true;
ui.insertCss(require("text!./style.css"), handle);
}
handle.addReloadItem = () => {
if (handle.reloadAdded)
return;
handle.tabMenu = menus.get("context/tabs").menu;
if (!handle.tabMenu)
return;
handle.reloadItem = new MenuItem({
caption: "Reload",
onclick: () => {
const tab = tabs.focussedTab;
if (tab.editorType === "browser")
tab.editor.reloadTab(tab);
},
visible: false
});
menus.addItemByPath("context/tabs/Reload", handle.reloadItem, 0, handle);
handle.reloadAdded = true;
handle.tabMenu.on("prop.visible", e => {
if (tabs.focussedTab.editorType === "browser" && e.value)
handle.reloadItem.show();
else
handle.reloadItem.hide();
});
};
handle.toggleLoadingSpinner = (container, tab, visible) => {
if (visible) {
tab.classList.add("loading");
container.classList.add("cs50-browser-loading");
}
else {
tab.classList.remove("loading");
container.classList.remove("cs50-browser-loading");
}
};
function openBrowserTab(options, onClose) {
tabs.open(
{
name: options.name || "browser-tab",
document: {
title: options.title || "browser",
browser: {
content: options.content,
path: options.path
}
},
editorType: "browser",
active: true,
focus: true,
},
onClose || (() => {})
);
}
register(null, {
"harvard.cs50.browser": handle
});
function openSelection(opts) {
if (!c9.has(c9.STORAGE) || !tree.tree)
return;
const sel = tree.tree.selection.getSelectedNodes();
let db = null;
sel.forEach(node => {
if (node && node.path && extensions.indexOf(extname(node.path).substring(1)) > -1) {
db = node;
tree.tree.selection.unselectNode(db);
}
});
if (sel.length > 0)
tree.openSelection(opts);
if (db) {
const tab = tabs.findTab("phpliteadmin-tab");
if (tab && tab.document.lastState.browser.path === db.path)
return tabs.focusTab(tab);
openBrowserTab({
name: "phpliteadmin-tab",
title: "phpliteadmin",
path: db.path.replace(/^\//, c9.environmentDir + "/")
}, handleTabClose);
tree.tree.selection.selectNode(db, true);
}
}
function handleTabClose(err, tab) {
if (err)
return console.error(err);
tab.off("close", handleTabClose);
tab.on("close", () => {
const pid = tab.document.lastState.browser.pid;
if (pid)
proc.spawn("kill", { args: ["-1", pid ]}, () => {});
});
}
function startPhpliteadmin(path, callback) {
if (!path)
return;
proc.spawn("phpliteadmin", {
args: [ "--url-only", path ] },
(err, process) => {
if (err)
return callback(err);
process.unref();
let data = "";
process.stdout.on("data", function handleOutput(chunk) {
data += chunk;
const matches = data.match(/(https?:\/\/.+)\s/);
if (matches && matches[1]) {
process.stdout.off("data", handleOutput);
callback(null, matches[1], process.pid);
}
});
});
}
tree.once("draw", () => {
if (tree.tree) {
tree.tree.off("afterChoose", tree.openSelection);
tree.tree.on("afterChoose", openSelection);
}
});
function Browser(){
const plugin = new Editor("CS50", main.consumes, extensions);
const emit = plugin.getEmitter();
let container, iframe;
let currDoc, currSession;
let timeout;
plugin.on("draw", (e) => {
handle.insertCss();
handle.addReloadItem();
iframe = document.createElement("iframe");
iframe.style.background = "white";
iframe.style.borderWidth = "0";
iframe.style.display = "none";
iframe.style.width = iframe.style.height = "100%";
container = e.htmlNode;
container.appendChild(iframe);
});
function reloadTab(tab) {
if (tab === currDoc.tab) {
if (currSession.url)
updateIframe({ url: iframe.src });
else if (currSession.content)
updateIframe({ content: currSession.content });
}
}
function updateIframe(options) {
iframe.onload = () => {};
iframe.src = "about:blank";
iframe.style.display = "none";
if (!options)
return;
handle.toggleLoadingSpinner(container, currDoc.tab, true);
if (options.url) {
currSession.url = options.url;
iframe.src = options.url;
}
iframe.onload = () => {
iframe.onload = () => {};
if (options.content) {
currSession.content = options.content;
iframe.contentWindow.document.open();
iframe.contentWindow.document.write(options.content);
iframe.contentWindow.document.close();
}
iframe.style.display = "initial";
handle.toggleLoadingSpinner(container, currDoc.tab, false);
}
}
plugin.on("documentLoad", e => {
updateIframe();
currDoc = e.doc;
currSession = currDoc.getSession();
plugin.on("contentSet", content => {
updateIframe({ content: content })
});
function setTheme(e) {
if (!currDoc)
return;
const tab = currDoc.tab;
if (e.theme.indexOf("dark") > -1) {
container.style.backgroundColor = tab.backgroundColor = "#303130";
container.classList.add("dark");
tab.classList.add("dark");
}
else {
container.style.backgroundColor = tab.backgroundColor = "#f1f1f1";
container.classList.remove("dark");
tab.classList.remove("dark");
}
}
layout.on("themeChange", setTheme, currSession);
setTheme({ theme: settings.get("user/general/@skin") });
});
plugin.on("documentActivate", e => {
currDoc = e.doc;
currSession = currDoc.getSession();
if (currSession.url && currSession.url !== iframe.src)
updateIframe({ url: currSession.url });
else if (currSession.content)
updateIframe({ content: currSession.content });
});
plugin.on("setState", (e) => {
updateIframe();
currDoc = e.doc;
currSession = currDoc.getSession();
currSession.path = e.state.path;
if (e.state.pid) {
currSession.pid = e.state.pid;
handleTabClose(null, currDoc.tab);
}
if (e.state.url) {
currSession.url = e.state.url;
updateIframe({ url: currSession.url });
}
else if (e.state.content) {
currSession.content = e.state.content;
emit("contentSet", currSession.content);
}
else {
handle.toggleLoadingSpinner(container, currDoc.tab, true);
clearTimeout(timeout);
updateIframe();
startPhpliteadmin(currSession.path, (err, url, pid) => {
if (err)
return console.error(err);
currSession.url = url;
currSession.pid = pid;
timeout = setTimeout(() => {
updateIframe({ url: url });
}, 1000);
});
}
});
plugin.on("getState", e => {
e.state.content = e.doc.getSession().content;
e.state.path = e.doc.getSession().path;
e.state.pid = e.doc.getSession().pid;
e.state.url = e.doc.getSession().url;
});
plugin.freezePublicAPI({
reloadTab: reloadTab
});
plugin.load(null, "harvard.cs50.browser");
return plugin;
}
}
});
define("text!@cs50/ide/plugins/harvard.cs50.aws/style.css",[],'');
define("@cs50/ide/plugins/harvard.cs50.aws/aws",[], function(require, exports, module) {
main.consumes = ["layout", "Plugin", "ui"];
main.provides = ["harvard.cs50.aws"];
return main;
function main(options, imports, register) {
const plugin = new imports.Plugin("CS50", main.consumes);
let button = null;
plugin.on("load", () => {
button = new imports.ui.button({
"skin": "c9-menu-btn",
"visible": true,
onclick: () => window.open("https://aws.amazon.com/education/awseducate/", "_blank")
});
button.setAttribute("class", "cs50-aws");
imports.ui.insertCss(require("text!./style.css"), plugin);
imports.ui.insertByIndex(imports.layout.findParent({
name: "preferences"
}), button, 1000, plugin);
});
plugin.on("unload", () => {
button = null;
});
register(null, {
"harvard.cs50.aws": plugin
});
}
});
define("text!@cs50/ide/plugins/harvard.cs50.audioplayer/style.css",[],'');
define("@cs50/ide/plugins/harvard.cs50.audioplayer/audioplayer",[], function(require, exports, module) {
main.consumes = [
"ace", "Editor", "editors", "dialog.error", "tabManager", "ui", "vfs"
];
main.provides = ["harvard.cs50.audioplayer"];
return main;
function main(options, imports, register) {
const ace = imports.ace;
const Editor = imports.Editor;
const editors = imports.editors;
const showError = imports["dialog.error"].show;
const tabManager = imports.tabManager;
const ui = imports.ui;
const vfs = imports.vfs;
const basename = require("path").basename;
const extensions = ["mp3", "ogg", "wav"];
const handle = editors.register(
"audioplayer", "Audio Player", AudioPlayer, extensions
);
function AudioPlayer() {
let drawn = false;
const plugin = new Editor("CS50", main.consumes, extensions);
let container;
function setPath(doc) {
doc.title = basename(doc.tab.path);
doc.tooltip = doc.tab.path;
}
plugin.on("draw", function(e) {
if (drawn)
return;
drawn = true;
container = document.createElement("div");
container.classList.add("playerwrapper");
e.htmlNode.appendChild(container);
ui.insertCss(
require("text!./style.css"),
options.staticPrefix,
handle
);
});
plugin.on("documentLoad", function(e) {
const doc = e.doc;
doc.meta.ignoreSave = true;
const session = doc.getSession();
if (session.audio) {
return;
}
session.audio = document.createElement("audio");
session.audio.setAttribute("controls", "");
session.audio.setAttribute("controlsList", "nodownload");
session.audio.setAttribute("preload", "");
session.audio.addEventListener("error", function() {
showError("Error loading audio file");
});
doc.tab.on("setPath", function(e) {
setPath(doc);
}, session);
function updateTabBackground() {
const tab = doc.tab;
const theme = ace.theme;
if (theme) {
if (theme.bg) {
tab.pane.aml.$ext.style.backgroundColor = tab.backgroundColor = theme.bg;
}
if (theme.isDark) {
tab.classList.add("dark");
}
else {
tab.classList.remove("dark");
}
}
}
ace.on("themeChange", updateTabBackground, doc);
tabManager.on("tabAfterReparent", function(e) {
if (e.tab === doc.tab) {
updateTabBackground();
}
});
updateTabBackground();
});
plugin.on("documentActivate", function(e) {
const doc = e.doc;
const session = doc.getSession();
if (!session.audio.src) {
vfs.rest(doc.tab.path, {responseType: "blob"}, function(err, res) {
if (err) {
console.error(err);
return;
}
session.audio.src = window.URL.createObjectURL(res);
});
}
if (!container.contains(session.audio)) {
container.appendChild(session.audio);
}
if (container.currAudio && container.currAudio !== session.audio) {
container.currAudio.style.display = "none";
}
session.audio.style.display = "initial";
container.currAudio = session.audio;
});
plugin.on("documentUnload", function(e) {
const audio = e.doc.getSession().audio;
if (audio) {
container.removeChild(audio);
}
});
plugin.freezePublicAPI({
autoload: false
});
plugin.load(null, "harvard.cs50.audioplayer");
return plugin;
}
AudioPlayer.autoload = false;
register(null, {
"harvard.cs50.audioplayer": handle
});
}
});
;
define(function(require, exports, module) {
require.config({ paths: {"@cs50/ide": "/static/@cs50/ide/cdn/@cs50/ide"} });
module.exports = function(options) {
var settings = Object.assign({}, options);
settings.plugins = settings.plugins || window.plugins;
var plugins = require("configs/ide/cs50")(settings);
plugins.push({
provides: [],
consumes: [],
setup: function(options, imports, register) {
require("ace/lib/dom").importCssString("/* @file css.errors.txt */\n\
/*1 missing image: @cs50/ide/plugins/harvard.cs50.simple/images/c9.png from //compiled/@cs50/ide/plugins/harvard.cs50.simple/style.css\n\
\n\
2 missing image: @cs50/ide/plugins/harvard.cs50.simple/images/tree-toggle.png from //compiled/@cs50/ide/plugins/harvard.cs50.simple/style.css\n\
\n\
3 missing image: @cs50/ide/plugins/harvard.cs50.simple/images/tree-toggle-active.png from //compiled/@cs50/ide/plugins/harvard.cs50.simple/style.css\n\
\n\
4 missing image: @cs50/ide/plugins/harvard.cs50.simple/images/tree-toggle-dark.png from //compiled/@cs50/ide/plugins/harvard.cs50.simple/style.css\n\
\n\
5 missing image: @cs50/ide/plugins/harvard.cs50.simple/images/tree-toggle-dark-active.png from //compiled/@cs50/ide/plugins/harvard.cs50.simple/style.css\n\
\n\
6 missing image: @cs50/ide/plugins/harvard.cs50.simple/images/tree-toggle.png from //compiled/@cs50/ide/plugins/harvard.cs50.simple/style.css\n\
\n\
7 missing image: @cs50/ide/plugins/harvard.cs50.simple/images/tree-toggle-active.png from //compiled/@cs50/ide/plugins/harvard.cs50.simple/style.css\n\
\n\
8 missing image: @cs50/ide/plugins/harvard.cs50.simple/images/tree-toggle-dark.png from //compiled/@cs50/ide/plugins/harvard.cs50.simple/style.css\n\
\n\
9 missing image: @cs50/ide/plugins/harvard.cs50.simple/images/tree-toggle-dark-active.png from //compiled/@cs50/ide/plugins/harvard.cs50.simple/style.css\n\
\n\
10 missing image: @cs50/ide/plugins/harvard.cs50.simple/images/c9.png from //compiled/@cs50/ide/plugins/harvard.cs50.simple/style.css\n\
\n\
11 missing image: @cs50/ide/plugins/harvard.cs50.hex/images/loading.gif from //compiled/@cs50/ide/plugins/harvard.cs50.hex/style.css\n\
\n\
12 missing image: @cs50/ide/plugins/harvard.cs50.hex/images/loading-dark.gif from //compiled/@cs50/ide/plugins/harvard.cs50.hex/style.css\n\
\n\
13 missing image: @cs50/ide/plugins/harvard.cs50.ddb/images/ddb.svg from //compiled/@cs50/ide/plugins/harvard.cs50.ddb/style.css\n\
\n\
14 missing image: @cs50/ide/plugins/harvard.cs50.browser/images/loading.gif from //compiled/@cs50/ide/plugins/harvard.cs50.browser/style.css\n\
\n\
15 missing image: @cs50/ide/plugins/harvard.cs50.browser/images/loading-dark.gif from //compiled/@cs50/ide/plugins/harvard.cs50.browser/style.css\n\
\n\
16 missing image: @cs50/ide/plugins/harvard.cs50.browser/images/loading.gif from //compiled/@cs50/ide/plugins/harvard.cs50.browser/style.css\n\
\n\
17 missing image: @cs50/ide/plugins/harvard.cs50.browser/images/loading-dark.gif from //compiled/@cs50/ide/plugins/harvard.cs50.browser/style.css\n\
\n\
18 missing image: @cs50/ide/plugins/harvard.cs50.aws/images/aws.svg from //compiled/@cs50/ide/plugins/harvard.cs50.aws/style.css\n\
\n\
Missing definitions for: collab-chat-font-size\n\
\t\tcollab-chat-background\n\
\t\tcollab-chat-item-padding\n\
\t\tcollab-chat-item-border-bottom\n\
\t\tcollab-chat-item-border-top\n\
\t\tcollab-chat-color-size\n\
\t\tcollab-chat-author-color\n\
\t\tcollab-chat-message-color*/\n\
\n\
/* @file /compiled/@cs50/ide/plugins/harvard.cs50.simple/style.css */\n\
body:after {\n\
content: url(\"/static/@cs50/ide/cdn/@cs50/ide/plugins/harvard.cs50.simple/images/c9.png\") url(\"/static/@cs50/ide/cdn/@cs50/ide/plugins/harvard.cs50.simple/images/tree-toggle.png\") url(\"/static/@cs50/ide/cdn/@cs50/ide/plugins/harvard.cs50.simple/images/tree-toggle-active.png\") url(\"/static/@cs50/ide/cdn/@cs50/ide/plugins/harvard.cs50.simple/images/tree-toggle-dark.png\") url(\"/static/@cs50/ide/cdn/@cs50/ide/plugins/harvard.cs50.simple/images/tree-toggle-dark-active.png\");\n\
display: none;\n\
}\n\
div.panel-bar.environment_files.top-margin {\n\
left: 0 !important;\n\
top: 0 !important;\n\
}\n\
.cs50-simple-tree-toggle {\n\
background-image: url(\"/static/@cs50/ide/cdn/@cs50/ide/plugins/harvard.cs50.simple/images/tree-toggle.png\");\n\
background-size: auto 11px;\n\
background-repeat: no-repeat;\n\
left: 15px;\n\
top: 12px;\n\
z-index: 100;\n\
}\n\
.cs50-simple-tree-toggle:hover {\n\
filter: brightness(0.5);\n\
-webkit-filter: brightness(0.5);\n\
}\n\
.cs50-simple-tree-toggle.active {\n\
background-image: url(\"/static/@cs50/ide/cdn/@cs50/ide/plugins/harvard.cs50.simple/images/tree-toggle-active.png\");\n\
}\n\
.cs50-simple-tree-toggle.dark {\n\
background-image: url(\"/static/@cs50/ide/cdn/@cs50/ide/plugins/harvard.cs50.simple/images/tree-toggle-dark.png\");\n\
}\n\
.cs50-simple-tree-toggle.dark:hover {\n\
filter: brightness(1.5);\n\
-webkit-filter: brightness(1.5);\n\
}\n\
.cs50-simple-tree-toggle.dark.active {\n\
background-image: url(\"/static/@cs50/ide/cdn/@cs50/ide/plugins/harvard.cs50.simple/images/tree-toggle-dark-active.png\");\n\
}\n\
.cs50-simple-pane0 .tabmenubtn {\n\
left: 40px !important;\n\
}\n\
.cs50-simple-imgeditor-bar {\n\
height: 39px !important;\n\
text-align: center;\n\
}\n\
.cs50-simple-zoom-button {\n\
background-color: #f2f2f1;\n\
background-image: initial !important;\n\
border: 1px solid #767676;\n\
color: #767676 !important;\n\
font-size: 24px !important;\n\
width: 36px;\n\
}\n\
.cs50-simple-zoom-button:hover {\n\
background-image: initial;\n\
border-color: #363636;\n\
color: #363636 !important;\n\
}\n\
.cs50-simple-zoom-button .caption {\n\
padding: 5px !important;\n\
}\n\
.cs50-simple-zoom-button.dark {\n\
background-color: #262626;\n\
border-color: #c2c2c2;\n\
color: #c2c2c2 !important;\n\
}\n\
.cs50-simple-zoom-button.dark:hover {\n\
border-color: #ffffff;\n\
color: #ffffff !important;\n\
}\n\
.cs50-save-warning {\n\
background-color: red;\n\
color: white;\n\
font-size: 14px;\n\
padding: 10px;\n\
}\n\
.cs50-save-warning code {\n\
font-style: monospace;\n\
font-weight: bold;\n\
}\n\
.has_apf .session_btn.changed strong:not(:hover) {\n\
background-position: -9px 0px !important;\n\
}\n\
.c9-logo .icon {\n\
background-image: url(\"/static/@cs50/ide/cdn/@cs50/ide/plugins/harvard.cs50.simple/images/c9.png\") !important;\n\
}\n\
.projectRoot .extrainfo {\n\
display: none;\n\
}\n\
.c9-share:not(.cs50-share) {\n\
display: none;\n\
}\n\
.gotoanything-input {\n\
display: none !important;\n\
}\n\
/* @file /native/@cs50/ide/plugins/harvard.cs50.presentation/style.css */\n\
.cs50-presentation .btnName {\n\
display: none !important;\n\
}\n\
.cs50-presentation .stats-btn {\n\
padding: 0 !important;\n\
overflow: hidden;\n\
width: 0px !important;\n\
border-left: 0 !important;\n\
}\n\
\n\
/* @file /compiled/@cs50/ide/plugins/harvard.cs50.hex/style.css */\n\
.cs50-hex-configs {\n\
box-sizing: border-box;\n\
padding: 5px;\n\
}\n\
.cs50-hex-configs:not(.dark) {\n\
background-color: #f1f1f1;\n\
}\n\
.cs50-hex-configs.dark .spinner {\n\
background-color: #181818;\n\
}\n\
.cs50-hex-content {\n\
background-color: #fbfbfb;\n\
font-family: monospace !important;\n\
}\n\
.cs50-hex-content.dark,\n\
.cs50-hex-content.dark:hover {\n\
background-color: #181818;\n\
}\n\
.cs50-hex-divider {\n\
margin-left: 10px !important;\n\
margin-right: 10px !important;\n\
}\n\
.cs50-hex-loading {\n\
background-image: url(\"/static/@cs50/ide/cdn/@cs50/ide/plugins/harvard.cs50.hex/images/loading.gif\");\n\
background-position: center center;\n\
background-repeat: no-repeat;\n\
background-size: 32px;\n\
}\n\
.cs50-hex-loading.dark {\n\
background-image: url(\"/static/@cs50/ide/cdn/@cs50/ide/plugins/harvard.cs50.hex/images/loading-dark.gif\");\n\
}\n\
/* @file /compiled/@cs50/ide/plugins/harvard.cs50.ddb/style.css */\n\
.ddbButton {\n\
background-color: inherit !important;\n\
background-image: url(\"/static/@cs50/ide/cdn/@cs50/ide/plugins/harvard.cs50.ddb/images/ddb.svg\");\n\
background-position: center center;\n\
background-repeat: no-repeat;\n\
background-size: 32px;\n\
box-shadow: inherit;\n\
color: inherit;\n\
cursor: pointer !important;\n\
display: inline-block !important;\n\
width: 55px;\n\
}\n\
.ddbChatContainer {\n\
display: flex;\n\
flex-direction: column;\n\
}\n\
.ddbChatText a {\n\
color: #909090;\n\
}\n\
.ddbChatText {\n\
overflow: auto;\n\
font-size: var(--collab-chat-font-size);\n\
padding: 0 0 0 0;\n\
background: var(--collab-chat-background);\n\
flex: 1;\n\
}\n\
.ddbChatText p {\n\
padding: var(--collab-chat-item-padding);\n\
word-wrap: break-word;\n\
border-bottom: var(--collab-chat-item-border-bottom);\n\
border-top: var(--collab-chat-item-border-top);\n\
position: relative;\n\
margin: 0;\n\
}\n\
.ddbChatText p:first-child {\n\
border-top: 0;\n\
}\n\
.ddbChatText .ddbChatBorder {\n\
position: absolute;\n\
left: 0;\n\
top: 0;\n\
bottom: 0;\n\
width: 0;\n\
border-left: var(--collab-chat-color-size) solid white;\n\
}\n\
.ddbChatText .emoji {\n\
vertical-align: middle;\n\
}\n\
.ddbChatText .ddbAuthorName {\n\
text-decoration: none;\n\
color: var(--collab-chat-author-color);\n\
display: block;\n\
}\n\
.ddbChatText .ddbChatMessage {\n\
color: var(--collab-chat-message-color);\n\
display: block;\n\
padding: 3px 0 0 0;\n\
}\n\
.ddbPanelButton {\n\
display: none !important;\n\
}\n\
/* @file /compiled/@cs50/ide/plugins/harvard.cs50.browser/style.css */\n\
body:after {\n\
content: url(\"/static/@cs50/ide/cdn/@cs50/ide/plugins/harvard.cs50.browser/images/loading.gif\") url(\"/static/@cs50/ide/cdn/@cs50/ide/plugins/harvard.cs50.browser/images/loading-dark.gif\");\n\
display: none;\n\
}\n\
.cs50-browser-loading {\n\
background-image: url(\"/static/@cs50/ide/cdn/@cs50/ide/plugins/harvard.cs50.browser/images/loading.gif\");\n\
background-position: center;\n\
background-repeat: no-repeat;\n\
}\n\
.cs50-browser-loading.dark {\n\
background-image: url(\"/static/@cs50/ide/cdn/@cs50/ide/plugins/harvard.cs50.browser/images/loading-dark.gif\");\n\
}\n\
/* @file /compiled/@cs50/ide/plugins/harvard.cs50.aws/style.css */\n\
.cs50-aws {\n\
background-color: inherit !important;\n\
background-image: url(\"/static/@cs50/ide/cdn/@cs50/ide/plugins/harvard.cs50.aws/images/aws.svg\");\n\
background-position: center center;\n\
background-repeat: no-repeat;\n\
background-size: 36px;\n\
box-shadow: inherit;\n\
color: inherit;\n\
cursor: pointer !important;\n\
display: inline-block !important;\n\
margin-right: 4px;\n\
width: 55px;\n\
}\n\
/* @file /native/@cs50/ide/plugins/harvard.cs50.audioplayer/style.css */\n\
.playerwrapper {\n\
display: flex;\n\
justify-content: center;\n\
align-items: center;\n\
width: 100%;\n\
height: 100%;\n\
}\n\
\n\
.playerwrapper audio {\n\
width: 90%;\n\
}\n\
\n\
");
register();
}
});
return plugins;
}
});
}));