blob: 19854920f019a55d24cf64d77d660f910e5d3fd5 [file] [log] [blame] [raw]
// Copyright (c) 2016, Matt Godbolt
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE
"use strict";
require("monaco-loader")().then(function () {
require('bootstrap');
require('bootstrap-slider');
var analytics = require('analytics');
var sharing = require('sharing');
var _ = require('underscore');
var $ = require('jquery');
var GoldenLayout = require('goldenlayout');
var Components = require('components');
var url = require('./url');
var clipboard = require('clipboard');
var Hub = require('hub');
var Raven = require('raven-js');
var settings = require('./settings');
var local = require('./local');
var Alert = require('./alert');
var themer = require('./themes');
//css
require("bootstrap/dist/css/bootstrap.min.css");
require("goldenlayout/src/css/goldenlayout-base.css");
require("selectize/dist/css/selectize.bootstrap2.css");
require("bootstrap-slider/dist/css/bootstrap-slider.css");
require("./colours.css");
require("./explorer.css");
function setupSettings(hub) {
var eventHub = hub.layout.eventHub;
var defaultSettings = {
defaultLanguage: hub.subdomainLangId ? hub.subdomainLangId : undefined
};
var currentSettings = JSON.parse(local.get('settings', null)) || defaultSettings;
function onChange(settings) {
currentSettings = settings;
local.set('settings', JSON.stringify(settings));
eventHub.emit('settingsChange', settings);
}
new themer.Themer(eventHub, currentSettings);
eventHub.on('requestSettings', function () {
eventHub.emit('settingsChange', currentSettings);
});
var setSettings = settings($('#settings'), currentSettings, onChange, hub.subdomainLangId);
eventHub.on('modifySettings', function (newSettings) {
setSettings(_.extend(currentSettings, newSettings));
});
}
function start() {
analytics.initialise();
var options = require('options');
var subdomainPart = window.location.hostname.split('.')[0];
var langBySubdomain = _.find(options.languages, function (lang) {
return lang.id === subdomainPart || lang.alias.indexOf(subdomainPart) >= 0;
});
var subLangId = langBySubdomain ? langBySubdomain.id : undefined;
var defaultConfig = {
settings: {showPopoutIcon: false},
content: [{
type: 'row',
content: [
Components.getEditor(1, subLangId),
Components.getCompiler(1, subLangId)
]
}]
};
$(window).bind('hashchange', function () {
// punt on hash events and just reload the page if there's a hash
if (window.location.hash.substr(1))
window.location.reload();
});
var config;
if (!options.embedded) {
config = url.deserialiseState(window.location.hash.substr(1));
if (config) {
// replace anything in the default config with that from the hash
config = _.extend(defaultConfig, config);
}
if (!config) {
var savedState = local.get('gl', null);
config = savedState !== null ? JSON.parse(savedState) : defaultConfig;
}
} else {
config = _.extend(defaultConfig, {
settings: {
showMaximiseIcon: false,
showCloseIcon: false,
hasHeaders: false
}
},
sharing.configFromEmbedded(window.location.hash.substr(1)));
}
var root = $("#root");
var layout;
var hub;
try {
layout = new GoldenLayout(config, root);
hub = new Hub(layout, subLangId);
} catch (e) {
Raven.captureException(e);
layout = new GoldenLayout(defaultConfig, root);
hub = new Hub(layout, subLangId);
}
layout.on('stateChanged', function () {
var config = layout.toConfig();
// Only preserve state in localStorage in non-embedded mode.
if (!options.embedded) {
local.set('gl', JSON.stringify(config));
} else {
var strippedToLast = window.location.pathname;
strippedToLast = strippedToLast.substr(0,
strippedToLast.lastIndexOf('/') + 1);
$('a.link').attr('href', strippedToLast + '#' + url.serialiseState(config));
}
});
function sizeRoot() {
var height = $(window).height() - (root.position().top || 0);
root.height(height);
layout.updateSize();
}
$(window).resize(sizeRoot);
sizeRoot();
new clipboard('.btn.clippy');
setupSettings(hub);
sharing.initShareButton($('#share'), layout);
function setupAdd(thing, func) {
layout.createDragSource(thing, func);
thing.click(function () {
hub.addAtRoot(func());
});
}
var alertSystem = new Alert();
setupAdd($('#add-diff'), function () {
return Components.getDiff();
});
setupAdd($('#add-editor'), function () {
return Components.getEditor();
});
$('#ui-reset').click(function () {
local.remove('gl');
window.location.reload();
});
$('#thanks-to').click(function () {
alertSystem.alert("Special thanks to", $(require('./thanks.html')));
});
$('#changes').click(function () {
var d = new Date();
d.setMonth(d.getMonth() - 3);
var data = JSON.stringify({since: d.toISOString()});
var container = $('<div class="container-fluid"></div>');
var setError = function (code) {
container.append($('<div></div>')
.text('We ran into a problem while interacting with the GitHub api: Code ' + code)
.css('border', '1px solid #994433')
);
};
var even = true;
var getCommits = function (page) {
$.ajax({
header: {
Accept: 'application/vnd.github.v3+json'
},
type: 'GET',
url: page,
data: data,
contentType: 'application/json',
cache: true,
success: function (response, textStatus, promised) {
var usefulCommits = [];
if (promised.status === 200 && container.children().length < 20) {
_.each(response, function (commitData) {
if (commitData.commit.message.startsWith('* ')) {
var toggleRow = function () {
even = !even;
return even ? "even-row" : "odd-row";
};
var data = {
url: commitData.html_url,
sha: commitData.sha.substring(0, 6),
message: commitData.commit.message.split('\n')[0].substring(2, 80),
length: commitData.commit.message.length
};
usefulCommits.push($('<div class="row ' + toggleRow() + '">' +
'<div class="col-sm-10"><p>' +
data.message + (data.length > 80 ? '...' : '') +
'</p></div>' +
'<div class="col-sm-2">' +
'<a href="' + data.url + '" rel="noreferrer noopener" target="_blank">' +
data.sha + ' <sup>' +
'<small class="glyphicon glyphicon-new-window opens-new-window" ' +
'title="Opens in a new window"></small></sup></a></div></div>'));
}
});
var link = promised.getResponseHeader('link').split(';')[0];
var nextLink = link.indexOf('next') >= 0 ? link.substring(1, link.length - 1) : false;
container.append(usefulCommits);
if (nextLink) getCommits(nextLink);
} else if (promised.status >= 400) {
setError(promised.status);
}
},
error: function (response) {
setError(response.status);
}
});
};
getCommits('https://api.github.com/repos/mattgodbolt/compiler-explorer/commits');
alertSystem.alert("Changelog", container);
});
}
$(start);
});