| // 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); |
| }); |
| |