{"action":"created","comment":{"url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/pulls/comments/76065451","id":76065451,"diff_hunk":"@@ -2,446 +2,475 @@\n define(function(require) {\n \n     var MySketch = require(\"inequality\").MySketch;\n+    var tester = require(\"lib/equation_editor/test_cases.js\");\n+    return [\"$timeout\", \"$rootScope\", \"api\", \"$stateParams\", function($timeout, $rootScope, api, $stateParams) {\n \n-    return [\"$timeout\", \"$rootScope\", \"api\", function($timeout, $rootScope, api) {\n+            return {\n+                scope: true,\n+                restrict: \"A\",\n+                templateUrl: \"/partials/equation_editor/equation_editor.html\",\n+                link: function(scope, element, attrs) {\n \n-        return {\n-            scope: true,\n-            restrict: \"A\",\n-            templateUrl: \"/partials/equation_editor/equation_editor.html\",\n-            link: function(scope, element, attrs) {\n+                    element.on(\"touchstart touchmove\", \"canvas\", function(e) {\n+                        e.preventDefault();\n+                    });\n \n-                element.on(\"touchstart touchmove\", \"canvas\", function(e) {\n-                    e.preventDefault();\n-                });\n+                    var sketch = null;\n \n-                var sketch = null;\n+                    scope.canvasOffset = {};\n+                    scope.draggingNewSymbol = false;\n+                    scope.equationEditorElement = element;\n \n-                scope.canvasOffset = {};\n-                scope.draggingNewSymbol = false;\n-                scope.equationEditorElement = element;\n+                    scope.selectedSymbols = [];\n+                    scope.selectionHandleFlags = {\n+                        showCalc: false,\n+                        showResize: true,\n+                        showMove: false\n+                    };\n \n-                scope.selectedSymbols = [];\n-                scope.selectionHandleFlags = {\n-                    showCalc: false,\n-                    showResize: true,\n-                    showMove: false\n-                };\n+                    scope.$on(\"triggerCloseMenus\", function() {\n+                        scope.$broadcast(\"closeMenus\");\n+                    });\n \n-                scope.$on(\"triggerCloseMenus\", function() {\n-                    scope.$broadcast(\"closeMenus\");\n-                });\n+                    scope.$on(\"triggerResizeMenu\", function() {\n+                        scope.$broadcast(\"resizeMenu\");\n+                    });\n \n-                scope.$on(\"triggerResizeMenu\", function() {\n-                    scope.$broadcast(\"resizeMenu\");\n-                });\n+                    $(window).on(\"resize\", function() {\n+                        element.find(\".top-menu\").css({\n+                            \"bottom\": scope.equationEditorElement.height()\n+                        }).removeClass(\"active-menu\");\n+                    });\n \n-                $(window).on(\"resize\", function() {\n-                    element.find(\".top-menu\").css({\n-                        \"bottom\": scope.equationEditorElement.height()\n-                    }).removeClass(\"active-menu\");\n-                });\n+                    scope.$on(\"newSymbolDrag\", function(_, symbol, pageX, pageY, mousePageX, mousePageY) {\n+                        scope.draggingNewSymbol = true;\n+                        scope.mousePageX = pageX;\n+                        scope.mousePageY = pageY;\n+                        var tOff = element.find(\".trash-button\").position();\n+                        var tWidth = element.find(\".trash-button\").width();\n+                        var tHeight = element.find(\".trash-button\").height();\n+                        scope.trashActive = (mousePageX > tOff.left && mousePageX < tOff.left + tWidth && mousePageY > tOff.top && mousePageY < tOff.top + tHeight);\n \n-                scope.$on(\"newSymbolDrag\", function(_, symbol, pageX, pageY, mousePageX, mousePageY) {\n-                    scope.draggingNewSymbol = true;\n-                    scope.mousePageX = pageX;\n-                    scope.mousePageY = pageY;\n-                    var tOff = element.find(\".trash-button\").position();\n-                    var tWidth = element.find(\".trash-button\").width();\n-                    var tHeight = element.find(\".trash-button\").height();\n-                    scope.trashActive = (mousePageX > tOff.left && mousePageX < tOff.left + tWidth && mousePageY > tOff.top && mousePageY < tOff.top + tHeight);\n+                        sketch.updatePotentialSymbol(symbol, pageX, pageY);\n+                        scope.$digest();\n \n-                    sketch.updatePotentialSymbol(symbol, pageX, pageY);\n-                    scope.$digest();\n+                    });\n \n+                    scope.notifySymbolDrag = function(x, y) {\n+                        var tOff = element.find(\".trash-button\").position();\n+                        var tWidth = element.find(\".trash-button\").width();\n+                        var tHeight = element.find(\".trash-button\").height();\n \n-                });\n+                        scope.trashActive = (x > tOff.left && x < tOff.left + tWidth && y > tOff.top && y < tOff.top + tHeight);\n+                        scope.$apply();\n+                    };\n \n-                scope.notifySymbolDrag = function(x, y) {\n-                    var tOff = element.find(\".trash-button\").position();\n-                    var tWidth = element.find(\".trash-button\").width();\n-                    var tHeight = element.find(\".trash-button\").height();\n+                    scope.$on(\"newSymbolAbortDrag\", function() {\n+                        if (scope.draggingNewSymbol) {\n+                            scope.draggingNewSymbol = false;\n+                            scope.log.actions.push({\n+                                event: \"ABORT_POTENTIAL_SYMBOL\",\n+                                symbol: sketch.potentialSymbol.subtreeObject(false, true, true),\n+                                timestamp: Date.now()\n+                            });\n+                            sketch.updatePotentialSymbol(null);\n+                            scope.$digest();\n+                        }\n+                    });\n \n-                    scope.trashActive = (x > tOff.left && x < tOff.left + tWidth && y > tOff.top && y < tOff.top + tHeight);\n-                    scope.$apply();\n-                };\n+                    scope.$on(\"spawnSymbol\", function(_e) {\n+                        var offset = element.offset();\n+                        var width = element.width();\n+                        var height = element.height();\n \n-                scope.$on(\"newSymbolAbortDrag\", function() {\n-                    if (scope.draggingNewSymbol) {\n                         scope.draggingNewSymbol = false;\n-                        scope.log.actions.push({\n-                            event: \"ABORT_POTENTIAL_SYMBOL\",\n-                            symbol: sketch.potentialSymbol.subtreeObject(false, true, true),\n-                            timestamp: Date.now()\n-                        });\n-                        sketch.updatePotentialSymbol(null);\n-                        scope.$digest();\n-                    }\n-                });\n-\n-                scope.$on(\"spawnSymbol\", function(_e) {\n-                    var offset = element.offset();\n-                    var width = element.width();\n-                    var height = element.height();\n-\n-                    scope.draggingNewSymbol = false;\n \n-                    if (scope.trashActive) {\n-                        scope.log.actions.push({\n-                            event: \"TRASH_POTENTIAL_SYMBOL\",\n-                            symbol: sketch.potentialSymbol.subtreeObject(false, true, true),\n-                            timestamp: Date.now()\n-                        });\n-                        sketch.updatePotentialSymbol(null);\n-                        return;\n-                    }\n+                        if (scope.trashActive) {\n+                            scope.log.actions.push({\n+                                event: \"TRASH_POTENTIAL_SYMBOL\",\n+                                symbol: sketch.potentialSymbol.subtreeObject(false, true, true),\n+                                timestamp: Date.now()\n+                            });\n+                            sketch.updatePotentialSymbol(null);\n+                            return;\n+                        }\n \n-                    // TODO: Improve with different widget types\n-                    sketch.commitPotentialSymbol();\n+                        // TODO: Improve with different widget types\n+                        sketch.commitPotentialSymbol();\n \n-                    scope.$broadcast(\"historyCheckpoint\");\n+                        scope.$broadcast(\"historyCheckpoint\");\n \n-                    // console.log(\"scope.state: \", scope.state);\n-                });\n+                        // console.log(\"scope.state: \", scope.state);\n+                    });\n \n-                scope.logOnClose = function(event) {\n-                    // This ought to catch people who navigate away without closing the editor!\n-                    if (scope.log != null) {\n-                        scope.log.actions.push({\n-                            event: \"NAVIGATE_AWAY\",\n-                            timestamp: Date.now()\n-                        });\n-                        api.logger.log(scope.log);\n-                    }\n-                };\n+                    scope.logOnClose = function(event) {\n+                        // This ought to catch people who navigate away without closing the editor!\n+                        if (scope.log != null) {\n+                            scope.log.actions.push({\n+                                event: \"NAVIGATE_AWAY\",\n+                                timestamp: Date.now()\n+                            });\n+                            api.logger.log(scope.log);\n+                        }\n+                    };\n \n-                $rootScope.showEquationEditor = function(initialState, questionDoc, editorMode) {\n+                    $rootScope.showEquationEditor = function(initialState, questionDoc, editorMode) {\n \n-                    return new Promise(function(resolve, reject) {\n+                        return new Promise(function(resolve, reject) {\n \n-                        delete scope.symbolLibrary.customVars;\n-                        delete scope.symbolLibrary.customFunctions;\n-                        delete scope.symbolLibrary.customChemicalSymbols;\n-                        delete scope.symbolLibrary.customFunction;\n-                        delete scope.symbolLibrary.augmentedOps;\n+                            delete scope.symbolLibrary.customVars;\n+                            delete scope.symbolLibrary.customFunctions;\n+                            delete scope.symbolLibrary.customChemicalSymbols;\n+                            delete scope.symbolLibrary.customFunction;\n+                            delete scope.symbolLibrary.augmentedOps;\n \n-                        scope.symbolLibrary.augmentedOps = scope.symbolLibrary.reducedOps.concat((scope.symbolLibrary.hiddenOps));\n+                            scope.symbolLibrary.augmentedOps = scope.symbolLibrary.reducedOps.concat(scope.symbolLibrary.hiddenOps);\n+                            scope.symbolLibrary.augmentedTrig = scope.symbolLibrary.trigFunctionsStandard;\n \n+                            if (editorMode == \"maths\" && questionDoc && questionDoc.availableSymbols) {\n \n-                        if (editorMode == \"maths\" && questionDoc && questionDoc.availableSymbols) {\n-                            scope.symbolLibrary.augmentedOps = scope.symbolLibrary.reducedOps;\n-                            var parsed = parseCustomSymbols(questionDoc.availableSymbols);\n+                                scope.symbolLibrary.augmentedOps = scope.symbolLibrary.reducedOps;\n+                                scope.symbolLibrary.augmentedTrig = scope.symbolLibrary.reducedTrigFunctions;\n+                                var parsed = parseCustomSymbols(questionDoc.availableSymbols);\n \n-                            var customSymbolsParsed = false;\n-                            if (parsed.vars.length > 0) {\n-                                scope.symbolLibrary.customVars = parsed.vars;\n-                                customSymbolsParsed = true;\n-                            }\n-                            if (parsed.fns.length > 0) {\n-                                scope.symbolLibrary.customFunctions = parsed.fns;\n-                                customSymbolsParsed = true;\n-                            }\n-                            if (parsed.operators.length > 0) {\n-                                scope.symbolLibrary.augmentedOps = scope.symbolLibrary.reducedOps.concat(parsed.operators);\n-                                customSymbolsParsed = true;\n-                            }\n-                            if (!customSymbolsParsed) {\n-                                console.debug(\"No custom symbols.\");\n-                            }\n-                        } else if (questionDoc && questionDoc.availableSymbols && editorMode == \"chemistry\") {\n-                            var parsed = parseCustomChemicalSymbols(questionDoc.availableSymbols);\n-                            if (parsed.length > 0) {\n-                                scope.symbolLibrary.customChemicalSymbols = parsed;\n-                            } else {\n-                                console.debug(\"No custom symbols.\");\n+                                var customSymbolsParsed = false;\n+                                if (parsed.vars.length > 0) {\n+                                    scope.symbolLibrary.customVars = parsed.vars;\n+                                    customSymbolsParsed = true;\n+                                }\n+                                if (parsed.fns.length > 0) {\n+                                    scope.symbolLibrary.customFunctions = parsed.fns;\n+                                    customSymbolsParsed = true;\n+                                }\n+                                if (parsed.operators.length > 0) {\n+                                    scope.symbolLibrary.augmentedOps = scope.symbolLibrary.reducedOps.concat(parsed.operators);\n+                                    customSymbolsParsed = true;\n+                                }\n+                                if (!customSymbolsParsed) {\n+                                    console.debug(\"No custom symbols.\");\n+                                }\n+                            } else if (questionDoc && questionDoc.availableSymbols && editorMode == \"chemistry\") {\n+                                var parsed = parseCustomChemicalSymbols(questionDoc.availableSymbols);\n+                                if (parsed.length > 0) {\n+                                    scope.symbolLibrary.customChemicalSymbols = parsed;\n+                                } else {\n+                                    console.debug(\"No custom symbols.\");\n+                                }\n                             }\n-                        }\n-\n-                        $(\".result-preview>span\").empty();\n-                        $(\".result-preview\").width(0);\n \n-                        var eqnModal = $('#equationModal');\n-                        eqnModal.one(\"opened.fndtn.reveal\", function() {\n-                            element.find(\".top-menu\").css(\"bottom\", scope.equationEditorElement.height());\n-                        });\n-\n-                        eqnModal.foundation(\"reveal\", \"open\");\n-                        scope.state = initialState || {\n-                            symbols: []\n-                        };\n-                        scope.questionDoc = questionDoc;\n-                        scope.editorMode = editorMode;\n+                            $(\".result-preview>span\").empty();\n+                            $(\".result-preview\").width(0);\n \n+                            var eqnModal = $('#equationModal');\n+                            eqnModal.one(\"opened.fndtn.reveal\", function() {\n+                                element.find(\".top-menu\").css(\"bottom\", scope.equationEditorElement.height());\n+                            });\n \n-                        scope.log = {\n-                            type: \"EQN_EDITOR_LOG\",\n-                            questionId: scope.questionDoc ? scope.questionDoc.id : null,\n-                            mode: scope.editorMode,\n-                            screenSize: {\n-                                width: window.innerWidth,\n-                                height: window.innerHeight\n-                            },\n-                            actions: [{\n-                                event: \"OPEN\",\n-                                timestamp: Date.now()\n-                            }]\n-                        };\n+                            eqnModal.foundation(\"reveal\", \"open\");\n+                            scope.state = initialState || {\n+                                symbols: []\n+                            };\n+                            scope.questionDoc = questionDoc;\n+                            scope.editorMode = editorMode;\n+\n+                            scope.log = {\n+                                type: \"EQN_EDITOR_LOG\",\n+                                questionId: scope.questionDoc ? scope.questionDoc.id : null,\n+                                mode: scope.editorMode,\n+                                screenSize: {\n+                                    width: window.innerWidth,\n+                                    height: window.innerHeight\n+                                },\n+                                actions: [{\n+                                    event: \"OPEN\",\n+                                    timestamp: Date.now()\n+                                }]\n+                            };\n \n-                        // Log just before the page closes if tab/browser closed:\n-                        window.addEventListener(\"beforeunload\", scope.logOnClose);\n-                        // Log the editor being closed and submit log event to server:\n-                        eqnModal.one(\"close\", function(e) {\n-                            scope.log.finalState = [];\n-                            sketch.symbols.forEach(function(e) {\n-                                scope.log.finalState.push(e.subtreeObject(true, true));\n-                            });\n-                            scope.log.actions.push({\n-                                event: \"CLOSE\",\n-                                timestamp: Date.now()\n+                            // Log just before the page closes if tab/browser closed:\n+                            window.addEventListener(\"beforeunload\", scope.logOnClose);\n+                            // Log the editor being closed and submit log event to server:\n+                            eqnModal.one(\"close\", function(e) {\n+                                scope.log.finalState = [];\n+                                sketch.symbols.forEach(function(e) {\n+                                    scope.log.finalState.push(e.subtreeObject(true, true));\n+                                });\n+                                scope.log.actions.push({\n+                                    event: \"CLOSE\",\n+                                    timestamp: Date.now()\n+                                });\n+                                if (scope.segueEnvironment == \"DEV\") {\n+                                    console.log(\"\\nLOG: ~\" + (JSON.stringify(scope.log).length / 1000).toFixed(2) + \"kb\\n\\n\", JSON.stringify(scope.log));\n+                                }\n+                                window.removeEventListener(\"beforeunload\", scope.logOnClose);\n+                                api.logger.log(scope.log);\n+                                scope.log = null;\n                             });\n-                            if (scope.segueEnvironment == \"DEV\") {\n-                                console.log(\"\\nLOG: ~\" + (JSON.stringify(scope.log).length / 1000).toFixed(2) + \"kb\\n\\n\", JSON.stringify(scope.log));\n-                            }\n-                            window.removeEventListener(\"beforeunload\", scope.logOnClose);\n-                            api.logger.log(scope.log);\n-                            scope.log = null;\n-                        });\n \n-                        scope.history = [JSON.parse(JSON.stringify(scope.state))];\n-                        scope.historyPtr = 0;\n-                        //element.find(\"canvas\").remove();\n+                            scope.history = [JSON.parse(JSON.stringify(scope.state))];\n+                            scope.historyPtr = 0;\n+                            //element.find(\"canvas\").remove();\n \n-                        // TODO: Redisplay old equations in the centre\n+                            // TODO: Redisplay old equations in the centre\n \n-                        scope.future = [];\n-                        var p = new p5(function(p) {\n-                            sketch = new MySketch(p, scope, element.width(), element.height(), scope.state.symbols);\n-                            $rootScope.sketch = sketch;\n-                            return sketch;\n-                        }, element.find(\".equation-editor\")[0]);\n+                            scope.future = [];\n+                            var p = new p5(function(p) {\n+                                sketch = new MySketch(p, scope, element.width(), element.height(), scope.state.symbols);\n+                                $rootScope.sketch = sketch;\n+                                return sketch;\n+                            }, element.find(\".equation-editor\")[0]);\n \n-                        eqnModal.one(\"closed.fndtn.reveal\", function() {\n-                            sketch.p.remove();\n-                            resolve(scope.state);\n-                        });\n+                            eqnModal.one(\"closed.fndtn.reveal\", function() {\n+                                sketch.p.remove();\n+                                resolve(scope.state);\n+                            });\n \n-                    });\n-                };\n+                        });\n+                    };\n \n-                var latinLetters = [\"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\", \"k\", \"l\", \"m\", \"n\", \"o\", \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\", \"w\", \"x\", \"y\", \"z\"];\n-                var latinLettersUpper = [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\"];\n-                var greekLetters = [\"\\\\alpha\", \"\\\\beta\", \"\\\\gamma\", \"\\\\delta\", \"\\\\varepsilon\", \"\\\\zeta\", \"\\\\eta\", \"\\\\theta\", \"\\\\iota\", \"\\\\kappa\", \"\\\\lambda\", \"\\\\mu\", \"\\\\nu\", \"\\\\xi\", \"\\\\omicron\", \"\\\\pi\", \"\\\\rho\", \"\\\\sigma\", \"\\\\tau\", \"\\\\upsilon\", \"\\\\phi\", \"\\\\chi\", \"\\\\psi\", \"\\\\omega\"];\n-                var greekLettersUpper = [\"\\\\Gamma\", \"\\\\Delta\", \"\\\\Theta\", \"\\\\Lambda\", \"\\\\Xi\", \"\\\\Pi\", \"\\\\Sigma\", \"\\\\Upsilon\", \"\\\\Phi\", \"\\\\Psi\", \"\\\\Omega\"];\n-                var elements = [\"H\", \"He\", \"Li\", \"Be\", \"B\", \"C\", \"N\", \"O\", \"F\", \"Ne\", \"Na\", \"Mg\", \"Al\", \"Si\", \"P\", \"S\", \"Cl\", \"Ar\", \"K\", \"Ca\", \"Sc\", \"Ti\", \"V\", \"Cr\", \"Mn\", \"Fe\", \"Co\", \"Ni\", \"Cu\", \"Zn\", \"Ga\", \"Ge\", \"As\", \"Se\", \"Br\", \"Kr\", \"Rb\", \"Sr\", \"Y\", \"Zr\", \"Nb\", \"Mo\", \"Tc\", \"Ru\", \"Rh\", \"Pd\", \"Ag\", \"Cd\", \"In\", \"Sn\", \"Sb\", \"Te\", \"I\", \"Xe\", \"Cs\", \"Ba\", \"La\", \"Ce\", \"Pr\", \"Nd\", \"Pm\", \"Sm\", \"Eu\", \"Gd\", \"Tb\", \"Dy\", \"Ho\", \"Er\", \"Tm\", \"Yb\", \"Lu\", \"Hf\", \"Ta\", \"W\", \"Re\", \"Os\", \"Ir\", \"Pt\", \"Au\", \"Hg\", \"Tl\", \"Pb\", \"Bi\", \"Po\", \"At\", \"Rn\", \"Fr\", \"Ra\", \"Ac\", \"Th\", \"Pa\", \"U\", \"Np\", \"Pu\", \"Am\", \"Cm\", \"Bk\", \"Cf\", \"Es\", \"Fm\", \"Md\", \"No\", \"Lr\", \"Rf\", \"Db\", \"Sg\", \"Bh\", \"Hs\", \"Mt\", \"Ds\", \"Rg\", \"Cn\", \"Nh\", \"Fl\", \"Mc\", \"Lv\", \"Ts\", \"Og\"];\n-                var opsMap = {\n-                    \"<\": \"<\",\n-                    \">\": \">\",\n-                    \"<=\": \"\\\\leq\",\n-                    \">=\": \"\\\\geq\",\n-                };\n-                var trigFunctions = [\"sin\", \"cos\", \"tan\", \"arcsin\", \"arccos\", \"arctan\", \"sinh\", \"cosh\", \"tanh\", \"cosec\", \"sec\", \"cot\", \"arccosec\", \"arcsec\", \"arccot\", \"cosech\", \"sech\", \"coth\", \"arccosech\", \"arcsech\", \"arccoth\", \"arcsinh\", \"arccosh\", \"arctanh\"];\n-                var particles = [\"alpha\", \"beta\", \"gamma\", \"neutrino\", \"antineutrino\", \"proton\", \"neutron\", \"electron\"];\n-                var letterMap = {\n-                    \"\\\\alpha\": \"α\",\n-                    \"\\\\beta\": \"β\",\n-                    \"\\\\gamma\": \"γ\",\n-                    \"\\\\delta\": \"δ\",\n-                    \"\\\\epsilon\": \"ε\",\n-                    \"\\\\varepsilon\": \"ε\",\n-                    \"\\\\zeta\": \"ζ\",\n-                    \"\\\\eta\": \"η\",\n-                    \"\\\\theta\": \"θ\",\n-                    \"\\\\iota\": \"ι\",\n-                    \"\\\\kappa\": \"κ\",\n-                    \"\\\\lambda\": \"λ\",\n-                    \"\\\\mu\": \"μ\",\n-                    \"\\\\nu\": \"ν\",\n-                    \"\\\\xi\": \"ξ\",\n-                    \"\\\\omicron\": \"ο\",\n-                    \"\\\\pi\": \"π\",\n-                    \"\\\\rho\": \"ρ\",\n-                    \"\\\\sigma\": \"σ\",\n-                    \"\\\\tau\": \"τ\",\n-                    \"\\\\upsilon\": \"υ\",\n-                    \"\\\\phi\": \"ϕ\",\n-                    \"\\\\chi\": \"χ\",\n-                    \"\\\\psi\": \"ψ\",\n-                    \"\\\\omega\": \"ω\",\n-                    \"\\\\Gamma\": \"Γ\",\n-                    \"\\\\Delta\": \"Δ\",\n-                    \"\\\\Theta\": \"Θ\",\n-                    \"\\\\Lambda\": \"Λ\",\n-                    \"\\\\Xi\": \"Ξ\",\n-                    \"\\\\Pi\": \"Π\",\n-                    \"\\\\Sigma\": \"Σ\",\n-                    \"\\\\Upsilon\": \"Υ\",\n-                    \"\\\\Phi\": \"Φ\",\n-                    \"\\\\Psi\": \"Ψ\",\n-                    \"\\\\Omega\": \"Ω\",\n-                };\n+                    var latinLetters = [\"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\", \"k\", \"l\", \"m\", \"n\", \"o\", \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\", \"w\", \"x\", \"y\", \"z\"];\n+                    var latinLettersUpper = [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\"];\n+                    var greekLetters = [\"\\\\alpha\", \"\\\\beta\", \"\\\\gamma\", \"\\\\delta\", \"\\\\varepsilon\", \"\\\\zeta\", \"\\\\eta\", \"\\\\theta\", \"\\\\iota\", \"\\\\kappa\", \"\\\\lambda\", \"\\\\mu\", \"\\\\nu\", \"\\\\xi\", \"\\\\omicron\", \"\\\\pi\", \"\\\\rho\", \"\\\\sigma\", \"\\\\tau\", \"\\\\upsilon\", \"\\\\phi\", \"\\\\chi\", \"\\\\psi\", \"\\\\omega\"];\n+                    var greekLettersUpper = [\"\\\\Gamma\", \"\\\\Delta\", \"\\\\Theta\", \"\\\\Lambda\", \"\\\\Xi\", \"\\\\Pi\", \"\\\\Sigma\", \"\\\\Upsilon\", \"\\\\Phi\", \"\\\\Psi\", \"\\\\Omega\"];\n+                    var elements = [\"H\", \"He\", \"Li\", \"Be\", \"B\", \"C\", \"N\", \"O\", \"F\", \"Ne\", \"Na\", \"Mg\", \"Al\", \"Si\", \"P\", \"S\", \"Cl\", \"Ar\", \"K\", \"Ca\", \"Sc\", \"Ti\", \"V\", \"Cr\", \"Mn\", \"Fe\", \"Co\", \"Ni\", \"Cu\", \"Zn\", \"Ga\", \"Ge\", \"As\", \"Se\", \"Br\", \"Kr\", \"Rb\", \"Sr\", \"Y\", \"Zr\", \"Nb\", \"Mo\", \"Tc\", \"Ru\", \"Rh\", \"Pd\", \"Ag\", \"Cd\", \"In\", \"Sn\", \"Sb\", \"Te\", \"I\", \"Xe\", \"Cs\", \"Ba\", \"La\", \"Ce\", \"Pr\", \"Nd\", \"Pm\", \"Sm\", \"Eu\", \"Gd\", \"Tb\", \"Dy\", \"Ho\", \"Er\", \"Tm\", \"Yb\", \"Lu\", \"Hf\", \"Ta\", \"W\", \"Re\", \"Os\", \"Ir\", \"Pt\", \"Au\", \"Hg\", \"Tl\", \"Pb\", \"Bi\", \"Po\", \"At\", \"Rn\", \"Fr\", \"Ra\", \"Ac\", \"Th\", \"Pa\", \"U\", \"Np\", \"Pu\", \"Am\", \"Cm\", \"Bk\", \"Cf\", \"Es\", \"Fm\", \"Md\", \"No\", \"Lr\", \"Rf\", \"Db\", \"Sg\", \"Bh\", \"Hs\", \"Mt\", \"Ds\", \"Rg\", \"Cn\", \"Nh\", \"Fl\", \"Mc\", \"Lv\", \"Ts\", \"Og\"];\n+                    var opsMap = {\n+                        \"<\": \"<\",\n+                        \">\": \">\",\n+                        \"<=\": \"\\\\leq\",\n+                        \">=\": \"\\\\geq\",\n+                    };\n+                    var trigFunctions = [\"sin\", \"cos\", \"tan\", \"arcsin\", \"arccos\", \"arctan\", \"sinh\", \"cosh\", \"tanh\", \"cosec\", \"sec\", \"cot\", \"arccosec\", \"arcsec\", \"arccot\", \"cosech\", \"sech\", \"coth\", \"arccosech\", \"arcsech\", \"arccoth\", \"arcsinh\", \"arccosh\", \"arctanh\"];\n+                    var trigFunctionsStandard = [\"sin\", \"cos\", \"tan\", \"arcsin\", \"arccos\", \"arctan\", \"cosec\", \"sec\", \"cot\", \"arccosec\", \"arcsec\", \"arccot\"];\n+                    var trigFunctionsHyp = [\"sinh\", \"cosh\", \"tanh\", \"cosech\", \"sech\", \"coth\", \"arccosech\", \"arcsech\", \"arccoth\", \"arcsinh\", \"arccosh\", \"arctanh\"];\n+                    var trigReduced = [\"sin\", \"cos\", \"tan\"];\n+                    var particles = [\"alpha\", \"beta\", \"gamma\", \"neutrino\", \"antineutrino\", \"proton\", \"neutron\", \"electron\"];\n+                    var letterMap = {\n+                        \"\\\\alpha\": \"α\",\n+                        \"\\\\beta\": \"β\",\n+                        \"\\\\gamma\": \"γ\",\n+                        \"\\\\delta\": \"δ\",\n+                        \"\\\\epsilon\": \"ε\",\n+                        \"\\\\varepsilon\": \"ε\",\n+                        \"\\\\zeta\": \"ζ\",\n+                        \"\\\\eta\": \"η\",\n+                        \"\\\\theta\": \"θ\",\n+                        \"\\\\iota\": \"ι\",\n+                        \"\\\\kappa\": \"κ\",\n+                        \"\\\\lambda\": \"λ\",\n+                        \"\\\\mu\": \"μ\",\n+                        \"\\\\nu\": \"ν\",\n+                        \"\\\\xi\": \"ξ\",\n+                        \"\\\\omicron\": \"ο\",\n+                        \"\\\\pi\": \"π\",\n+                        \"\\\\rho\": \"ρ\",\n+                        \"\\\\sigma\": \"σ\",\n+                        \"\\\\tau\": \"τ\",\n+                        \"\\\\upsilon\": \"υ\",\n+                        \"\\\\phi\": \"ϕ\",\n+                        \"\\\\chi\": \"χ\",\n+                        \"\\\\psi\": \"ψ\",\n+                        \"\\\\omega\": \"ω\",\n+                        \"\\\\Gamma\": \"Γ\",\n+                        \"\\\\Delta\": \"Δ\",\n+                        \"\\\\Theta\": \"Θ\",\n+                        \"\\\\Lambda\": \"Λ\",\n+                        \"\\\\Xi\": \"Ξ\",\n+                        \"\\\\Pi\": \"Π\",\n+                        \"\\\\Sigma\": \"Σ\",\n+                        \"\\\\Upsilon\": \"Υ\",\n+                        \"\\\\Phi\": \"Φ\",\n+                        \"\\\\Psi\": \"Ψ\",\n+                        \"\\\\Omega\": \"Ω\",\n+                    };\n \n-                var chemicalSymbols = {};\n-                var chemicalSymbolsArray = elements.concat(particles);\n+                    var chemicalSymbols = {};\n+                    var chemicalSymbolsArray = elements.concat(particles);\n \n-                for (var i in chemicalSymbolsArray) {\n-                    chemicalSymbols[chemicalSymbolsArray[i]] = i;\n-                }\n+                    for (var i in chemicalSymbolsArray) {\n+                        chemicalSymbols[chemicalSymbolsArray[i]] = i;\n+                    }\n \n-                var trigMap = {};\n-                // dictionary of trig functions\n-                for (var i = 0; i < trigFunctions.length; i++) {\n-                    trigMap[trigFunctions[i]] = i;\n-                }\n+                    var trigMap = {};\n+                    // dictionary of trig functions\n+                    for (var i = 0; i < trigFunctions.length; i++) {\n+                        trigMap[trigFunctions[i]] = i;\n+                    }\n \n+                    var inverseLetterMap = {};\n+                    for (var k in letterMap) {\n+                        inverseLetterMap[letterMap[k]] = k;\n+                    }\n+                    inverseLetterMap[\"ε\"] = \"\\\\varepsilon\"; // Make sure that this one wins.\n \n-                var inverseLetterMap = {};\n-                for (var k in letterMap) {\n-                    inverseLetterMap[letterMap[k]] = k;\n-                }\n-                inverseLetterMap[\"ε\"] = \"\\\\varepsilon\"; // Make sure that this one wins.\n+                    var convertToLatexIfGreek = function(s) {\n+                        if (s == \"epsilon\") {\n+                            return \"\\\\varepsilon\";\n+                        }\n+                        if (greekLetters.indexOf(\"\\\\\" + s) > -1) {\n+                            return \"\\\\\" + s;\n+                        }\n+                        if (greekLettersUpper.indexOf(\"\\\\\" + s) > -1) {\n+                            return \"\\\\\" + s;\n+                        }\n+                        return s;\n+                    };\n \n-                var convertToLatexIfGreek = function(s) {\n-                    if (s == \"epsilon\") {\n-                        return \"\\\\varepsilon\";\n-                    }\n-                    if (greekLetters.indexOf(\"\\\\\" + s) > -1) {\n-                        return \"\\\\\" + s;\n-                    }\n-                    if (greekLettersUpper.indexOf(\"\\\\\" + s) > -1) {\n-                        return \"\\\\\" + s;\n-                    }\n-                    return s;\n-                };\n+                    var parseCustomChemicalSymbols = function(symbols) {\n+                        // take symbols in string [\"H\", \"He\", \"Li\", \"electron\", \"proton\", \"antineutrino\"]\n+                        var custom = [];\n+                        for (var i in symbols) {\n+                            var s = symbols[i].trim();\n+                            if (s.length == 0) {\n+                                console.warn(\"Tried to parse zero-length symbol in list:\", symbols);\n+                                continue;\n+                            }\n+                            console.debug(\"Parsing:\", s);\n+                            if (chemicalSymbols.hasOwnProperty(s)) {\n+                                var type = (chemicalSymbols[s] <= (elements.length - 1)) ? 'ChemicalElement' : 'Particle';\n+                                if (type == 'Particle') {\n+                                    var index_of_particle = chemicalSymbols[s] - elements.length;\n+                                    var particle_label = scope.symbolLibrary.particles[index_of_particle].menu.label;\n+                                    custom.push({\n+                                        type: type,\n+                                        menu: {\n+                                            label: particle_label,\n+                                            texLabel: true,\n+                                            fontSize: \"2em\"\n+                                        },\n+                                        properties: {\n+                                            type: s,\n+                                            particle: scope.symbolLibrary.particles[index_of_particle].properties.particle\n+                                        }\n+                                    });\n \n+                                } else {\n+                                    custom.push({\n+                                        type: type,\n+                                        properties: {\n+                                            element: s\n+                                        },\n+                                        menu: {\n+                                            label: \"\\\\text{\" + s + \"}\",\n+                                            texLabel: true,\n+                                            // add here option for it to be part of nuclear equation\n+                                        }\n+                                    });\n+                                }\n+                            }\n \n-                var parseCustomChemicalSymbols = function(symbols) {\n-                    // take symbols in string [\"H\", \"He\", \"Li\", \"electron\", \"proton\", \"antineutrino\"]\n-                    var custom = [];\n-                    for (var i in symbols) {\n-                        var s = symbols[i].trim();\n-                        if (s.length == 0) {\n-                            console.warn(\"Tried to parse zero-length symbol in list:\", symbols);\n-                            continue;\n                         }\n-                        console.debug(\"Parsing:\", s);\n-                        if (chemicalSymbols.hasOwnProperty(s)) {\n-                            var type = (chemicalSymbols[s] <= (elements.length - 1)) ? 'ChemicalElement' : 'Particle';\n-                            if (type == 'Particle') {\n-                                var index_of_particle = chemicalSymbols[s] - elements.length;\n-                                var particle_label = scope.symbolLibrary.particles[index_of_particle].menu.label;\n-                                custom.push({\n-                                    type: type,\n+                        return custom;\n+                    };\n+\n+                    var parseCustomSymbols = function(symbols) {\n+                        var r = {\n+                            vars: [],\n+                            fns: [],\n+                            operators: []\n+                        };\n+\n+                        for (var i in symbols) {\n+                            var s = symbols[i].trim();\n+                            if (s.length == 0) {\n+                                console.warn(\"Tried to parse zero-length symbol in list:\", symbols);\n+                                continue;\n+                            } else if (opsMap.hasOwnProperty(s)) {\n+                                console.debug(\"Parsing operator:\", s);","path":"app/js/app/directives/equation_editor/EquationEditor.js","position":656,"original_position":656,"commit_id":"983d4b8db27220ea8d28467fda06d069ad843cac","original_commit_id":"983d4b8db27220ea8d28467fda06d069ad843cac","user":{"login":"jimyuan1995","id":20040524,"avatar_url":"https://avatars.githubusercontent.com/u/20040524?v=3","gravatar_id":"","url":"https://api.github.com/users/jimyuan1995","html_url":"https://github.com/jimyuan1995","followers_url":"https://api.github.com/users/jimyuan1995/followers","following_url":"https://api.github.com/users/jimyuan1995/following{/other_user}","gists_url":"https://api.github.com/users/jimyuan1995/gists{/gist_id}","starred_url":"https://api.github.com/users/jimyuan1995/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jimyuan1995/subscriptions","organizations_url":"https://api.github.com/users/jimyuan1995/orgs","repos_url":"https://api.github.com/users/jimyuan1995/repos","events_url":"https://api.github.com/users/jimyuan1995/events{/privacy}","received_events_url":"https://api.github.com/users/jimyuan1995/received_events","type":"User","site_admin":false},"body":"remove console.debug","created_at":"2016-08-24T14:21:30Z","updated_at":"2016-08-24T14:21:30Z","html_url":"https://github.com/ucam-cl-dtg/isaac-app/pull/735#discussion_r76065451","pull_request_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/pulls/735","_links":{"self":{"href":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/pulls/comments/76065451"},"html":{"href":"https://github.com/ucam-cl-dtg/isaac-app/pull/735#discussion_r76065451"},"pull_request":{"href":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/pulls/735"}}},"pull_request":{"url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/pulls/735","id":82533915,"html_url":"https://github.com/ucam-cl-dtg/isaac-app/pull/735","diff_url":"https://github.com/ucam-cl-dtg/isaac-app/pull/735.diff","patch_url":"https://github.com/ucam-cl-dtg/isaac-app/pull/735.patch","issue_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/issues/735","number":735,"state":"open","locked":false,"title":"Merge in final changes to Equation Editor","user":{"login":"jsharkey13","id":8060558,"avatar_url":"https://avatars.githubusercontent.com/u/8060558?v=3","gravatar_id":"","url":"https://api.github.com/users/jsharkey13","html_url":"https://github.com/jsharkey13","followers_url":"https://api.github.com/users/jsharkey13/followers","following_url":"https://api.github.com/users/jsharkey13/following{/other_user}","gists_url":"https://api.github.com/users/jsharkey13/gists{/gist_id}","starred_url":"https://api.github.com/users/jsharkey13/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jsharkey13/subscriptions","organizations_url":"https://api.github.com/users/jsharkey13/orgs","repos_url":"https://api.github.com/users/jsharkey13/repos","events_url":"https://api.github.com/users/jsharkey13/events{/privacy}","received_events_url":"https://api.github.com/users/jsharkey13/received_events","type":"User","site_admin":false},"body":"Final changes to equation editor and other small fixes.","created_at":"2016-08-24T12:36:18Z","updated_at":"2016-08-24T14:21:30Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e2d996099b3c0eecbe55f20179368250344a303b","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/pulls/735/commits","review_comments_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/pulls/735/comments","review_comment_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/issues/735/comments","statuses_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/statuses/983d4b8db27220ea8d28467fda06d069ad843cac","head":{"label":"ucam-cl-dtg:aw684-eqn-editor","ref":"aw684-eqn-editor","sha":"983d4b8db27220ea8d28467fda06d069ad843cac","user":{"login":"ucam-cl-dtg","id":1140917,"avatar_url":"https://avatars.githubusercontent.com/u/1140917?v=3","gravatar_id":"","url":"https://api.github.com/users/ucam-cl-dtg","html_url":"https://github.com/ucam-cl-dtg","followers_url":"https://api.github.com/users/ucam-cl-dtg/followers","following_url":"https://api.github.com/users/ucam-cl-dtg/following{/other_user}","gists_url":"https://api.github.com/users/ucam-cl-dtg/gists{/gist_id}","starred_url":"https://api.github.com/users/ucam-cl-dtg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ucam-cl-dtg/subscriptions","organizations_url":"https://api.github.com/users/ucam-cl-dtg/orgs","repos_url":"https://api.github.com/users/ucam-cl-dtg/repos","events_url":"https://api.github.com/users/ucam-cl-dtg/events{/privacy}","received_events_url":"https://api.github.com/users/ucam-cl-dtg/received_events","type":"Organization","site_admin":false},"repo":{"id":19943563,"name":"isaac-app","full_name":"ucam-cl-dtg/isaac-app","owner":{"login":"ucam-cl-dtg","id":1140917,"avatar_url":"https://avatars.githubusercontent.com/u/1140917?v=3","gravatar_id":"","url":"https://api.github.com/users/ucam-cl-dtg","html_url":"https://github.com/ucam-cl-dtg","followers_url":"https://api.github.com/users/ucam-cl-dtg/followers","following_url":"https://api.github.com/users/ucam-cl-dtg/following{/other_user}","gists_url":"https://api.github.com/users/ucam-cl-dtg/gists{/gist_id}","starred_url":"https://api.github.com/users/ucam-cl-dtg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ucam-cl-dtg/subscriptions","organizations_url":"https://api.github.com/users/ucam-cl-dtg/orgs","repos_url":"https://api.github.com/users/ucam-cl-dtg/repos","events_url":"https://api.github.com/users/ucam-cl-dtg/events{/privacy}","received_events_url":"https://api.github.com/users/ucam-cl-dtg/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ucam-cl-dtg/isaac-app","description":"Isaac front-end project, based on Angular JS","fork":false,"url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app","forks_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/forks","keys_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/teams","hooks_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/hooks","issue_events_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/issues/events{/number}","events_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/events","assignees_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/assignees{/user}","branches_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/branches{/branch}","tags_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/tags","blobs_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/git/refs{/sha}","trees_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/statuses/{sha}","languages_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/languages","stargazers_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/stargazers","contributors_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/contributors","subscribers_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/subscribers","subscription_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/subscription","commits_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/commits{/sha}","git_commits_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/git/commits{/sha}","comments_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/comments{/number}","issue_comment_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/issues/comments{/number}","contents_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/contents/{+path}","compare_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/merges","archive_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/downloads","issues_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/issues{/number}","pulls_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/pulls{/number}","milestones_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/milestones{/number}","notifications_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/labels{/name}","releases_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/releases{/id}","deployments_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/deployments","created_at":"2014-05-19T13:49:07Z","updated_at":"2016-07-22T22:49:35Z","pushed_at":"2016-08-24T12:36:18Z","git_url":"git://github.com/ucam-cl-dtg/isaac-app.git","ssh_url":"git@github.com:ucam-cl-dtg/isaac-app.git","clone_url":"https://github.com/ucam-cl-dtg/isaac-app.git","svn_url":"https://github.com/ucam-cl-dtg/isaac-app","homepage":"https://isaacphysics.org","size":24892,"stargazers_count":3,"watchers_count":3,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":63,"forks":0,"open_issues":63,"watchers":3,"default_branch":"master"}},"base":{"label":"ucam-cl-dtg:master","ref":"master","sha":"edf17bc0706616205fa00032b9fa1e5228cb4a7c","user":{"login":"ucam-cl-dtg","id":1140917,"avatar_url":"https://avatars.githubusercontent.com/u/1140917?v=3","gravatar_id":"","url":"https://api.github.com/users/ucam-cl-dtg","html_url":"https://github.com/ucam-cl-dtg","followers_url":"https://api.github.com/users/ucam-cl-dtg/followers","following_url":"https://api.github.com/users/ucam-cl-dtg/following{/other_user}","gists_url":"https://api.github.com/users/ucam-cl-dtg/gists{/gist_id}","starred_url":"https://api.github.com/users/ucam-cl-dtg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ucam-cl-dtg/subscriptions","organizations_url":"https://api.github.com/users/ucam-cl-dtg/orgs","repos_url":"https://api.github.com/users/ucam-cl-dtg/repos","events_url":"https://api.github.com/users/ucam-cl-dtg/events{/privacy}","received_events_url":"https://api.github.com/users/ucam-cl-dtg/received_events","type":"Organization","site_admin":false},"repo":{"id":19943563,"name":"isaac-app","full_name":"ucam-cl-dtg/isaac-app","owner":{"login":"ucam-cl-dtg","id":1140917,"avatar_url":"https://avatars.githubusercontent.com/u/1140917?v=3","gravatar_id":"","url":"https://api.github.com/users/ucam-cl-dtg","html_url":"https://github.com/ucam-cl-dtg","followers_url":"https://api.github.com/users/ucam-cl-dtg/followers","following_url":"https://api.github.com/users/ucam-cl-dtg/following{/other_user}","gists_url":"https://api.github.com/users/ucam-cl-dtg/gists{/gist_id}","starred_url":"https://api.github.com/users/ucam-cl-dtg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ucam-cl-dtg/subscriptions","organizations_url":"https://api.github.com/users/ucam-cl-dtg/orgs","repos_url":"https://api.github.com/users/ucam-cl-dtg/repos","events_url":"https://api.github.com/users/ucam-cl-dtg/events{/privacy}","received_events_url":"https://api.github.com/users/ucam-cl-dtg/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ucam-cl-dtg/isaac-app","description":"Isaac front-end project, based on Angular JS","fork":false,"url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app","forks_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/forks","keys_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/teams","hooks_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/hooks","issue_events_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/issues/events{/number}","events_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/events","assignees_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/assignees{/user}","branches_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/branches{/branch}","tags_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/tags","blobs_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/git/refs{/sha}","trees_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/statuses/{sha}","languages_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/languages","stargazers_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/stargazers","contributors_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/contributors","subscribers_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/subscribers","subscription_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/subscription","commits_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/commits{/sha}","git_commits_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/git/commits{/sha}","comments_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/comments{/number}","issue_comment_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/issues/comments{/number}","contents_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/contents/{+path}","compare_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/merges","archive_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/downloads","issues_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/issues{/number}","pulls_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/pulls{/number}","milestones_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/milestones{/number}","notifications_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/labels{/name}","releases_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/releases{/id}","deployments_url":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/deployments","created_at":"2014-05-19T13:49:07Z","updated_at":"2016-07-22T22:49:35Z","pushed_at":"2016-08-24T12:36:18Z","git_url":"git://github.com/ucam-cl-dtg/isaac-app.git","ssh_url":"git@github.com:ucam-cl-dtg/isaac-app.git","clone_url":"https://github.com/ucam-cl-dtg/isaac-app.git","svn_url":"https://github.com/ucam-cl-dtg/isaac-app","homepage":"https://isaacphysics.org","size":24892,"stargazers_count":3,"watchers_count":3,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":63,"forks":0,"open_issues":63,"watchers":3,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/pulls/735"},"html":{"href":"https://github.com/ucam-cl-dtg/isaac-app/pull/735"},"issue":{"href":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/issues/735"},"comments":{"href":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/issues/735/comments"},"review_comments":{"href":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/pulls/735/comments"},"review_comment":{"href":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/pulls/735/commits"},"statuses":{"href":"https://api.github.com/repos/ucam-cl-dtg/isaac-app/statuses/983d4b8db27220ea8d28467fda06d069ad843cac"}}}}
{"actor":{"display_login":"jimyuan1995"}}