From 5740c647d647460be68813fec7354586d06ef4c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lorenz=20H=C3=BCbschle-Schneider?= <lorenzhs@ira.uka.de> Date: Mon, 9 Mar 2015 15:09:32 +0100 Subject: [PATCH 1/2] Basic MathJax hackery --- index.html | 11 ++++++++++- js/filters.js | 13 +++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index d1dd0ed..509d4a9 100644 --- a/index.html +++ b/index.html @@ -36,6 +36,15 @@ <script type="text/javascript" src="js/models.js"></script> <script type="text/javascript" src="js/plugins.js"></script> <script type="text/javascript" src="3rdparty/favico-0.3.5.min.js"></script> + <script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> + <script type="text/x-mathjax-config"> + MathJax.Hub.Config({ + tex2jax: { + inlineMath: [ ['$$','$$'], ["\\(","\\)"] ], + displayMath: [ ["\\[","\\]"] ] + } + }); + </script> </head> <body ng-controller="WeechatCtrl" ng-keydown="handleKeyPress($event)" ng-keyup="handleKeyRelease($event)" ng-keypress="handleKeyPress($event)" ng-class="{'no-overflow': connected}" lang="en-US"> <link ng-href="css/themes/{{settings.theme}}.css" rel="stylesheet" media="screen" /> @@ -278,7 +287,7 @@ $ openssl req -nodes -newkey rsa:4096 -keyout relay.pem -x509 -days 365 -out rel <td class="prefix"><a ng-click="addMention(bufferline.prefix)"><span ng-repeat="part in ::bufferline.prefix" ng-class="::part.classes" ng-bind="::part.text"></span></a></td><!-- --><td class="message"><!-- --><div ng-repeat="metadata in ::bufferline.metadata" plugin data="::metadata"></div><!-- - --><span ng-repeat="part in ::bufferline.content" class="text" ng-class="::part.classes" ng-bind-html="::part.text | linky:'_blank' | DOMfilter:'irclinky' | DOMfilter:'emojify':settings.enableJSEmoji | DOMfilter:'inlinecolour' "></span> + --><span ng-repeat="part in ::bufferline.content" class="text" ng-class="::part.classes.concat(['line-' + part.$$hashKey.replace(':','_')])" ng-bind-html="::part.text | linky:'_blank' | DOMfilter:'irclinky' | DOMfilter:'emojify':settings.enableJSEmoji | DOMfilter:'inlinecolour' | DOMfilter:'mathjax':('.line-' + part.$$hashKey.replace(':','_'))"></span> </td> </tr> <tr class="readmarker" ng-if="activeBuffer().lastSeen==$index"> diff --git a/js/filters.js b/js/filters.js index 9921d8a..5490335 100644 --- a/js/filters.js +++ b/js/filters.js @@ -150,4 +150,17 @@ weechat.filter('emojify', function() { }; }); +weechat.filter('mathjax', function() { + return function(text, selector) { + if (text.indexOf("$$") != -1 || text.indexOf("\\[") != -1 || text.indexOf("\\(") != -1) { + // contains math + //var math = document.getElementById("MathExample"); + var math = document.querySelector(selector); + MathJax.Hub.Queue(["Typeset",MathJax.Hub,math]); + } + + return text; + }; +}); + })(); From be8ab42b7c0d8807b7d44002280b127c379873b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lorenz=20H=C3=BCbschle-Schneider?= <lorenz-dev@lgh-alumni.de> Date: Sat, 21 Mar 2015 12:25:18 +0100 Subject: [PATCH 2/2] Make MathJax a setting and load it only if enabled --- index.html | 21 +++++++++++---------- js/filters.js | 12 ++++++++---- js/glowingbear.js | 27 ++++++++++++++++++++++++++- 3 files changed, 45 insertions(+), 15 deletions(-) diff --git a/index.html b/index.html index 509d4a9..2984351 100644 --- a/index.html +++ b/index.html @@ -36,15 +36,6 @@ <script type="text/javascript" src="js/models.js"></script> <script type="text/javascript" src="js/plugins.js"></script> <script type="text/javascript" src="3rdparty/favico-0.3.5.min.js"></script> - <script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script> - <script type="text/x-mathjax-config"> - MathJax.Hub.Config({ - tex2jax: { - inlineMath: [ ['$$','$$'], ["\\(","\\)"] ], - displayMath: [ ["\\[","\\]"] ] - } - }); - </script> </head> <body ng-controller="WeechatCtrl" ng-keydown="handleKeyPress($event)" ng-keyup="handleKeyRelease($event)" ng-keypress="handleKeyPress($event)" ng-class="{'no-overflow': connected}" lang="en-US"> <link ng-href="css/themes/{{settings.theme}}.css" rel="stylesheet" media="screen" /> @@ -287,7 +278,7 @@ $ openssl req -nodes -newkey rsa:4096 -keyout relay.pem -x509 -days 365 -out rel <td class="prefix"><a ng-click="addMention(bufferline.prefix)"><span ng-repeat="part in ::bufferline.prefix" ng-class="::part.classes" ng-bind="::part.text"></span></a></td><!-- --><td class="message"><!-- --><div ng-repeat="metadata in ::bufferline.metadata" plugin data="::metadata"></div><!-- - --><span ng-repeat="part in ::bufferline.content" class="text" ng-class="::part.classes.concat(['line-' + part.$$hashKey.replace(':','_')])" ng-bind-html="::part.text | linky:'_blank' | DOMfilter:'irclinky' | DOMfilter:'emojify':settings.enableJSEmoji | DOMfilter:'inlinecolour' | DOMfilter:'mathjax':('.line-' + part.$$hashKey.replace(':','_'))"></span> + --><span ng-repeat="part in ::bufferline.content" class="text" ng-class="::part.classes.concat(['line-' + part.$$hashKey.replace(':','_')])" ng-bind-html="::part.text | linky:'_blank' | DOMfilter:'irclinky' | DOMfilter:'emojify':settings.enableJSEmoji | DOMfilter:'inlinecolour' | DOMfilter:'mathjax':('.line-' + part.$$hashKey.replace(':','_')):settings.enableMathjax"></span> </td> </tr> <tr class="readmarker" ng-if="activeBuffer().lastSeen==$index"> @@ -457,6 +448,16 @@ $ openssl req -nodes -newkey rsa:4096 -keyout relay.pem -x509 -days 365 -out rel </div> </form> </li> + <li> + <form class="form-inline" role="form"> + <div class="checkbox"> + <label> + <input type="checkbox" ng-model="settings.enableMathjax"> + Enable LaTeX math rendering + </label> + </div> + </form> + </li> </ul> </div> <div class="modal-footer"> diff --git a/js/filters.js b/js/filters.js index 5490335..9317af4 100644 --- a/js/filters.js +++ b/js/filters.js @@ -73,9 +73,11 @@ weechat.filter('DOMfilter', ['$filter', '$sce', function($filter, $sce) { return text; } - // hacky way to pass an extra argument without using .apply, which + // hacky way to pass extra arguments without using .apply, which // would require assembling an argument array. PERFORMANCE!!! var extraArgument = (arguments.length > 2) ? arguments[2] : null; + var thirdArgument = (arguments.length > 3) ? arguments[3] : null; + var filterFunction = $filter(filter); var el = document.createElement('div'); el.innerHTML = text; @@ -83,7 +85,7 @@ weechat.filter('DOMfilter', ['$filter', '$sce', function($filter, $sce) { // Recursive DOM-walking function applying the filter to the text nodes var process = function(node) { if (node.nodeType === 3) { // text node - var value = filterFunction(node.nodeValue, extraArgument); + var value = filterFunction(node.nodeValue, extraArgument, thirdArgument); if (value !== node.nodeValue) { // we changed something. create a new node to replace the current one // we could also only add its children but that would probably incur @@ -151,10 +153,12 @@ weechat.filter('emojify', function() { }); weechat.filter('mathjax', function() { - return function(text, selector) { + return function(text, selector, enabled) { + if (!enabled || typeof(MathJax) === "undefined") { + return text; + } if (text.indexOf("$$") != -1 || text.indexOf("\\[") != -1 || text.indexOf("\\(") != -1) { // contains math - //var math = document.getElementById("MathExample"); var math = document.querySelector(selector); MathJax.Hub.Queue(["Typeset",MathJax.Hub,math]); } diff --git a/js/glowingbear.js b/js/glowingbear.js index 2ccf3f3..05b27a4 100644 --- a/js/glowingbear.js +++ b/js/glowingbear.js @@ -36,7 +36,8 @@ weechat.controller('WeechatCtrl', ['$rootScope', '$scope', '$store', '$timeout', 'fontsize': '14px', 'fontfamily': (utils.isMobileUi() ? 'sans-serif' : 'Inconsolata, Consolas, Monaco, Ubuntu Mono, monospace'), 'readlineBindings': false, - 'enableJSEmoji': false + 'enableJSEmoji': false, + 'enableMathjax': false, }); $scope.settings = settings; @@ -393,6 +394,30 @@ weechat.controller('WeechatCtrl', ['$rootScope', '$scope', '$store', '$timeout', } }); + // To prevent unnecessary loading times for users who don't + // want MathJax, load it only if the setting is enabled. + // This also fires when the page is loaded if enabled. + settings.addCallback('enableMathjax', function(enabled) { + if (enabled && !$rootScope.mathjax_init) { + // Load MathJax only once + $rootScope.mathjax_init = true; + (function () { + var head = document.getElementsByTagName("head")[0], script; + script = document.createElement("script"); + script.type = "text/x-mathjax-config"; + script[(window.opera ? "innerHTML" : "text")] = + "MathJax.Hub.Config({\n" + + " tex2jax: { inlineMath: [['$$','$$'], ['\\\\(','\\\\)']], displayMath: [['\\\\[','\\\\]']] },\n" + + "});"; + head.appendChild(script); + script = document.createElement("script"); + script.type = "text/javascript"; + script.src = "//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML"; + head.appendChild(script); + })(); + } + }); + // Update font family when changed settings.addCallback('fontfamily', function(fontfamily) { utils.changeClassStyle('favorite-font', 'fontFamily', fontfamily);